字符串:在java中将与字符串有关的内容面向对象了,形成的类叫String,字符串表示的方法--""
分两类:对字符串的处理是可变还是不可变的,和地址无关
对于字符串整体有两个地方可能会发生变化:1.引用的指向 2.字符串本身
1.不可变字符:String:说的是字符串本身没有变化,与引用无关(这里的意思是不管引用指向哪个地方,String类型的本身一定不变,只是没有引用来指向,原本的引用指向变了)
2.可变字符串:StringBuffer/StringBuilder:说的是字符串本身发生了变化,与引用无关
字符串常量(不可变字符串)的保存位置:被放在了常量区,可以认为在堆中的一块特殊区域
变量的特点:同一个名字的字符串在内存中只允许存在一个
String s1 = "1000phone";
String s2 = "1000phone";
String s3 = new String("1000phone");
String s4 = new String("1000phone");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
原理:
(1)如果不可变字符串后面直接赋值,其工作原理是,会到常量区找叫1000phone的字符串,如果有直接保存他的赋值,如果没有才会在常量区开辟一块空间存储1000phone
(2)如果是new的话,就是在堆区单独开辟一块空间,而1000phone作为参数传给了对象,保存在了对象内一个String类型的成员变量里面
注意点:字符串的比较用equals方法,因为字符串自动重写了equals方法,重新定义了比较的规则,规则变成让s1和s3的内容(保存1000phone地址的常量)去比较
System.out.println(s1.equals(s2));//true System.out.println(s1.equals(s3));//true,String类中自动重写了,是拿对象里面保存的指向常量的地址和直接指向常量的地址进行比较