1.判断定义为String类型的s1和s2是否相等
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
分析:true,因为"abc"在常量池里面,所以 s1 和s2 指向的都是同一个 常量池中的"abc"
System.out.println(s1.equals(s2));
分析:true, equals()比较的是字符串的内容
2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc");
分析:2个 堆中 有一个 常量池中有一个
3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);
分析:false,s1指向的是堆内存中的对象 s2指向的是常量池中的对象
System.out.println(s1.equals(s2));
分析: true, equals()比较的是字符串的内容
4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);
分析: true,"a" + "b" + "c"常量相加有常量优化机制,会自动去找常量池中的"abc",如果常量池中有"abc",那就用现成的,如果没有 就在常量池中创建一个"abc",String s2 = "abc"这儿就有一个现成的"abc",所以他俩用的是同一个"abc"
System.out.println(s1.equals(s2));
分析: true, equals()比较的是字符串的内容
5.判断定义为String类型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2);
分析: false, String s3 = s1 + "c"; s1是变量 变量相加 会到堆内存中开辟空间 ,所以 s3指向的是堆内存中的地址,而s2指向的是常量池中的 "abc";
System.out.println(s3.equals(s2));?
分析: true, equals()比较的是字符串的内容 |
|