1.判断定义为String类型的s1和s2是否相等
String s1 = “abc”; //常量池中没有这个字符串对象,就创建一个,如果有直接 用即可
String s2 = “abc”; //意思就是 常量池中已经创建了对象s1 的 值abc,s2直接拿来用就行了!
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc"); //创建二个对象,一个在常量池,一个在堆内存
//现在常量池中创建“abc”,然后new String 进堆,将常量池中的“abc”赋给堆。二者的地址值不同。也就是说new的对象是常量池中的abc的副本。
3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc");· //记录的是堆内存对象的地址值
String s2 = “abc”; //记录的是常量池的地址值
System.out.println(s1 == s2); //s1的abc进入的是堆内存,s2进入的是常量池,结果为false
System.out.println(s1.equals(s2)); //equals()比较的是字符串序列或里面的内容,结果为true
4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" +“c”;//相当于 byte =3 + 4;内存自动加好,变成7。也就是说s1 = abc。常量优化机制
String s2 = “abc”; //s1已经在常量池中创建了s1,s2直接拿来用就行了!记录的是同一个地址值!
System.out.println(s1 == s2); //true,java中有常量优化机制
System.out.println(s1.equals(s2)); //true
5.判断定义为String类型的s1和s2是否相等
String s1 = “ab”;//在常量池中创建“ab”
String s2 = “abc”;//在常量池中创建“abc”
String s3 = s1 + “c”;//串联先在堆内存中创建StringBuffer,通过append方法将s1 与 c相加,再调用toString转换成String 字符串“abc”;地址值完全不同。StringBuffer地址值1,toString地址值2. s2在常量池中的地址值不同与toString地址值2
System.out.println(s3 == s2);//false
System.out.println(s3.equals(s2));//true
来源:oschina
链接:https://my.oschina.net/u/4258973/blog/3162614