一、new String(“abc”); 和 String s = “abc”;的区别:
- new String()方法是在堆内存中,new一个String对象,指向方法区的"abc"常量池
- s = "abc"是直接引用在方法区的"abc"常量
- 内存图如下:
二、String的equals和 == 的区别
- equals:内容值相等就返回true
- == :所引用的地址值一样,即是同一个对象就返回true
- 代码:
public class Test5{
public static void main(String[] args){
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1.equals(s2));//true
System.out.println(s1 == s2);//false
}
}
- 因为s1引用的是堆内存中的对象,而s2引用的是方法区常量池的"abc",它们地址值不同,所以 == 为false。而equals()比较,返回true,因为它们的内容都是常量池的"abc",所以一样。
三、变量+"abc"和1+"abc"的区别
- 变量+“abc”:是在堆中,重新new一个字符串对象,连接"abc",再赋值给引用变量
- 1 + “abc”:由于有常量优化机制,可以直接在常量池重新创一个"1abc"的常量
- 代码
public class Test5{
public static void main(String[] args){
String s1 = new String("abc");
String s2 = "abc";
String s3 = s2;
s2 = 1+s1;
String s4 = "abc";
s4 = 1 + "abc";
String s5 = "1abc";
System.out.println(s3 == s2);//false
System.out.println(s4== s5);//true
}
}