1、String对象用于保存字符串,本质就是一组字符序列
2、字符串常量对象是用双引号括起的字符序列,例如:“你好”、 “12.97”等
3、字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
4、String类常用的构造方法有:
Serializable接口:表示可以串行化,数据可以进行网络传输,文件内容读写等
Comparable接口:String对象间可以进行相互比较大小。
5、String是final类,不能被其他类继承
6、String中有个属性 private final char value[]; 用于存放字符串内容,所以本质上说,字符串是char拼接而成。
7、String的value为final,value赋值后地址不可修改。但对应的String值可以修改,相当于嵌套,指向的还是那个地址,但地址中的数据可变。
final约束变量对应的空间地址
直接赋值: String s = “zhang”;
构造器:String s = new String(“zhang”);
1、先从常量池中查看是否有“zhang”数据空间,如果有,则直接指向。如果没有则创建,然后指向该地址,s 变量最终指向的是常量池中的空间地址。
2、先在堆中创建空间,即对象的地址,然后在对象创建value属性,value属性指向常量池中的“zhang”空间,如果常量池中没有“zhang”,则创建,再指向。常量池中如果有,则直接指向,方式二中的s指向的是堆中的空间地址
String中有个属性 private final char value[];
测试题01:
String a = "hsp";
String b = "zhang";
String c = "zhang";
String d = new String("zhang");
System.out.println(a == b); // F
System.out.println(b == c); // T
System.out.println(b == d); // F
System.out.println(b.equals(d)); // T
Person person01 = new Person();
person01.setName("zhang");
Person person02 = new Person();
person02.setName("zhang");
System.out.println(person01.name == person02.name); // T
System.out.println(person01.name == "zhang"); // T
System.out.println(person01.name.equals(person02.name)); // T
String s1 = new String("zhang");
String s2 = new String("zhang");
System.out.println(s1 == s2); // 比较的是地址,s1和s2对象的地址不一致,返回f
测试题03
对String中的value使用final修饰的理解:
首先,不可变序列,确实是对象的内容不可变。这就是final的作用。
不可变序列指的是这个类创建的对象不可变,在修改对象时会创建一个新的对象。
对String中的value进行修改时,value堆中的地址没变,但value地址指向的对象发生了改变。
比如:String name = “zhang”, 此时value指向的为常量池中zhang的地址。
当name = "cheng"进行修改时,value指向的地址为cheng在常量池中的地址,value在堆中的地址不变。
引用的思考,想想自己写程序的话,如果单独创建hello和abc的话,那他们就没有了引用指向。所以编译器做了优化。
如果是两个常量相加,最后看的是池中的内容。
如果是两个变量相加,最后看的是堆中的内容。
public class String01 {
static String name = new String("zhang");
static final char[] chars = {'j', 'a', 'v', 'a'};
public static void changeString(String name, char[] chars){
name = "cheng";
chars[0] = 'h';
}
public static void main(String[] args) {
changeString(name, chars);
System.out.println(name); // zhang
System.out.println(chars); // hava
}
}
测试题5
public class String02 {
String str = "zhang";
char[] chars = {'j', 'a', 'v', 'a'};
public void changeStr(String str, char[] chars){
System.out.println("changeStr" + str);
str = "java";
chars[0] = 'h';
}
public static void main(String[] args) {
String02 ex = new String02();
ex.changeStr(ex.str, ex.chars);
System.out.println(ex.str);
System.out.println(ex.chars);
}
}
0470_韩顺平Java_String对象特性2_哔哩哔哩_bilibili
如果上面的运行结果看不明白,那就去B站看原视频吧。