String概述
java.lang.String 类代表字符串,String类定义的变量可以用于指向字符串对象,同时String类提供了很多操作字符串的功能,我们可以直接使用。Java 程序中的所有字符串文字(例如“abc”)都为此类的对象
- String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。String变量每次的修改其实都是产生并指向了新的字符串对象,原来的字符串对象都是没有改变的,所以称不可变字符串。
- 以“”方式给出的字符串对象,在字符串常量池中存储。
String类创建对象的方式
方式一:直接使用“”定义。
String s = "中国人";
不同的创建方式,有不同的特点。具体如下:
- 以" "方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
- 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。
代码示例
public class Demo01String {
public static void main(String[] args) {
String s1 = "中国人";
String s2 = "中国人";
System.out.println(s1 == s2);//true
char[] c = {'中', '国', '人'};
String s3 = new String(c);
String s4 = new String(c);
System.out.println(s3 == s4);//false
}
}
String类常用方法
字符串的内容比较相关的方法
代码示例
import java.util.Scanner;
public class Demo02String {
public static void main(String[] args) {
String okName = "admin";
String oKPassword = "123456";
Scanner sc = new Scanner(System.in);
System.out.println("输入账号");
String inputName = sc.next();
System.out.println("输入密码");
String inputPassword = sc.next();
if ((okName.equals(inputName))&&(oKPassword.equals(inputPassword))){
System.out.println("密码账号正确,登录成功..");
}else {
System.out.println("密码或账号不正确,登录失败..");
}
}
}
String中与遍历、替换、截取、分割操作相关的方法
代码示例
import java.util.Arrays;
public class Demo03String {
public static void main(String[] args) {
// 1、public int length(): 获取字符串的长度
String name = "我爱你中国love";
System.out.println(name.length()); //9
// 2、public char charAt(int index): 获取某个索引位置处的字符
char c = name.charAt(1);
System.out.println(c);// 爱
// 3、public char[] toCharArray():: 把字符串转换成字符数组
char[] chars = name.toCharArray();
System.out.println(Arrays.toString(chars)); //[我, 爱, 你, 中, 国, l, o, v, e]
// 4、public String substring(int beginIndex, int endIndex) :截取内容,(包前不包后的)
String name2 = "Java是最厉害的编程语言!";
String rs = name2.substring(0, 4);
System.out.println(rs);//java
String rs1 = name2.substring(6, 8);
System.out.println(rs1);//厉害
// 5、public String substring(int beginIndex):从当前索引一直截取到末尾
String rs2 = name2.substring(9);
System.out.println(rs2); //编程语言!
// 6、public String replace(CharSequence target, CharSequence replacement)
String name3 = "TMD是最厉害的80后语言,TMD棒棒的!";
String rs3 = name3.replace("TMD", "***");
System.out.println(rs3);//***是最厉害的80后语言,***棒棒的!
// 7、public boolean contains(CharSequence s)
System.out.println(name3.contains("厉害")); // true
System.out.println(name3.contains("不厉害")); // false
// 8、public boolean startsWith(String prefix)
System.out.println(name3.startsWith("T")); //true
System.out.println(name3.startsWith("MD是"));// false
// 9、public String[] split(String s): 按照某个内容把字符串分割成字符串数组返回。
String name4 = "张三,李四,王五";
String[] names = name4.split(",");
System.out.println(Arrays.toString(names)); //[张三, 李四, 王五]
}
}
Object根父类
类 java.lang.Object是类层次结构的根类,即所有类的父类。每个类都使用 Object作为超类。
- Object类型的变量与除Object以外的任意引用数据类型的对象都多态引用
- 所有对象(包括数组)都实现这个类的方法。
- 如果一个类没有特别指定父类,那么默认则继承自Object类。例如:
public class MyClass /*extends Object*/ {
// ...
}
Object类中常用方法
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。
public String toString( )
默认情况下,toString()返回的是“对象的运行时类型 @ 对象的hashCode值的十六进制形式",如果我们直接System.out.println(对象),默认会自动调用这个对象的toString()。通常是建议重写,
因为Java的引用数据类型的变量中存储的实际上时对象的内存地址,但是Java对程序员隐藏内存地址信息,所以不能直接将内存地址显示出来,所以当你打印对象时,JVM帮你调用了对象的toString()。
例如自定义的Person类:
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//类中其他代码
}
public final Class<?> getClass():获取对象的运行时类型。
因为Java有多态现象,所以一个引用数据类型的变量的编译时类型与运行时类型可能不一致,因此如果需要查看这个变量实际指向的对象的类型,需要用getClass()方法
public class Test {
public static void main(String[] args) {
Object obj = new String();
//获取对象的运行时类型
System.out.println(obj.getClass()); //class java.lang.String
Object ob = new Person();
System.out.println(ob.getClass()); //class sgg1.demo02.Person
}
}
protected void finalize( ):用于最终清理内存的方法
- 当对象被GC确定为要被回收的垃圾,在回收之前由GC帮你调用这个方法,不是由程序员手动调用。
- 这个方法与C语言的析构函数不同,C语言的析构函数被调用,那么对象一定被销毁,内存被回收,而finalize方法的调用不一定会销毁当前对象,因为可能在finalize()中出现了让当前对象“复活”的代码
- 每一个对象的finalize方法只会被调用一次。
- 子类可以选择重写,一般用于彻底释放一些资源对象,而且这些资源对象往往时通过C/C++等代码申请的资源内存
public int hashCode():返回每个对象的hash值。主要用于后面当对象存储到哈希表等容器中时,为了提高存储和查询性能用的。
- 如果两个对象的hash值是不同的,那么这两个对象一定不相等;
- 如果两个对象的hash值是相同的,那么这两个对象不一定相等。
public class Test {
public static void main(String[] args) {
System.out.println("Aa".hashCode());//2112
System.out.println("BB".hashCode());//2112
System.out.println("ABC".hashCode());//64578
}
}
public boolean equals(Object obj):用于判断当前对象this与指定对象obj是否“相等”。
- 默认情况下,equals方法的实现等价于与“==”,比较的是对象的地址值
- 绝大部分情况下,我们都应该去重写此方法,
import java.util.Objects;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
//类中其他代码
}
未完待续