String讲解

String类没有提供用于修改字符串的方法。String类对象为不可变字符串,如字符串string=”HELLO”永远只包含HELLO这几个字母,而不能修改其中任何一个字符。当然可以修改字符串变量string的引用,让它引用另一个字符串。
不可变字符串有一个优点:编译器可以让字符串实现共享。实际上只有字符串常量(使用“ ”声明,存储在字符串常量池中)是共享的,subStrng,+等操作产生的结果不能共享。
比较字符串值是否相等时使用equals()方法,不能使用==,==比较的是字符串的地址是否相同。如果字符串在常量池中,可以使用==比较,因为指向的都是同一个字符串。

直接使用 ” ” 声明的String对象会直接存储在常量池中,(可以实现共享)
1.String str1=”first”;
jvm在运行时先查找常量池中是否有该字符串,如果有则直接返回该字符串的引用给first(实现了字符串 的共享) ;否则先在常量
池中创建该字符串并返回引用。
此时只会在常量池中创建String对象,不会在堆中创建。
2.String str2=new String(“second”);
该代码生成了两个String对象。因为使用了“”会现在常量池中查找是否存在second对象,没有则创建
否则不创建;在常量池创建完成后,由于使用了new,jvm会在堆中创建内容相同的String对象,并将引用
返回给str2.
3.String str3=”what”; String str4=str3+”a nice day”;
运行时,+ 相当于new,所以堆中会有“what a nice day”对象;常量池中会有”what” “a nice day”两个对象,而不会有”what a nice day”对象。

package String;
public class String_1 {
public static void main(String[] args) {
//string1,string2都指向常量池中的同一个字符串first
//所以引用相同,值也相同
String string1=”first”;
String string2=”first”;
System.out.println(string1==string2);
System.out.println(string1.equals(string2));

     //string3指向常量池中的字符串second
     //string4指向堆中的字符串second
     //所以值相同,引用不同
     String string3="second";
     String string4=new String("second");
     System.out.println(string3==string4);
    System.out.println(string3.equals(string4));

     //string5指向常量池中的字符串third
     //string6一开始指向堆中的字符串third,但是调用intern()方法之后,且该方法调用时先检查常量池中是否有值为string6
     //的字符串,如果有则返回该字符串的引用,否则在常量池中创建该字符串,并返回引用
     //所以一开始引用不相等,后来相等
     String string5="third";
     String string6=new String("third");
     System.out.println(string5==string6);
     string6=string6.intern();
     System.out.println(string5==string6);
}

}

你可能感兴趣的:(Java,string)