创建一个String类型的变量一般有两种方法,如下
public class Test {
public static void main(String[] args){
String str1 = "abcd";
String str2 = new String ( "abcd" );
}
}
那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别?
第一种情况
public class Test {
public static void main(String[] args){
String str1 = "abcd";
String str2 = "abcd";
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
}
}
创建的str1,str2两个字符串,==和equals比较返回都为true,这是因为str1,str2都指向了方法区的同一个字符串。所以,当同样的一个字符串用""重复创建时只在方法区创建一次
第二种情况
public class Test {
public static void main(String[] args){
String str3 = new String( "abcd");
String str4 = new String( "abcd");
System.out.println(str3 == str4);
System.out.println(str3.equals(str4));
}
}
用new创建的str3,str4两个字符串,equals为true很简单因为equals永远比较的是值,而==为false说明两个字符串的引用不一样。用new创建的字符串每次都会在JVM堆中创建,所以str3,str4都对应堆中的两个不同的字符串。
关于这两道题中的""和new创建的字符串在内存中的表现形式可以看下图就明白了。