String有俩种实例化方式:
1.通过直接赋值:String str1 = "A";
2.通过new方法: String str2 = new String("A");
下面来看一段简单的代码:
public class String1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "A";
String s2 = "A";
String s3 = new String("A");
System.out.println("s1==s2 -- "+ (s1==s2));
System.out.println("s1==s3 -- "+ (s1==s3));
System.out.println("s2==s3 -- "+ (s2==s3));
}
}
打印出来的log:
s1==s2 -- true
s1==s3 -- false
s2==s3 -- false
“==”是进行数值的比较,即s1/s2/s3的指向堆内存地址值的比较。
1.首先分析为什么s1==s2
String s1 = "A"; 其实就是开辟一个新的内存空间存放“A”,让s1指向这块内存空间;
String s2 = "A";因为堆内存空间已经有了字符串“A”,所以不会再开辟新的内存空间,此时s2也是指向这块内存空间;
总结:当String采用直接赋值的方式后,只要以后声明的字符串内容相同,都不会开辟新的堆内存空间。
2.分析为什么s1!=s3
String s3 = new String("A"); 用new方法就是开辟一个新的堆内存空间存放字符串“A”,故s1 和 s3 指向的堆内存空间不一样。
但是用new的方法,会开辟俩个内存空间,第一个是垃圾空间,会被回收, 第二个才是new关键字开辟的空间。
相比第一种直接赋值方法,new方法效率更低,在开发中,通常使用第一种直接赋值的方法。