String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc");
3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
5.判断定义为String类型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
解答:
上面所有equals()方法的结果都是true,因为equals()方法在String类中,我们来看下API中的解释
equals:
将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true。
因为String类中字符串是常量;它们的值在创建之后不能更改
第一题中:
//常量池中没有这个字符串对象,就创建一个,如果有直接用即可
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //==号比较的是地址值,true
System.out.println(s1.equals(s2)); //比较的是字符串的内容:true
第二题:
//创建几个对象
//创建两个对象,一个在常量池中,一个在堆内存中
String s1 = new String("abc");
System.out.println(s1);
第三题:
String s1 = new String("abc"); //录的是堆内存对象的地址值
String s2 = "abc"; //记录的是常量池中的地址值
System.out.println(s1 == s2); //false
第四题:
//byte b = 3 + 4; //在编译时就变成7,把7赋值给b,常量优化机制
String s1 = "a" + "b" + "c"; //java中有常量优化机制,在编译时期就能确定s2的值为"abc",所以编译时期,在常量池中创建"abc"
String s2 = "abc"; //执行到这里时常量池中已经有了"abc",所以就不再创建,所以s1和s2指向的是常量池中同一个字符串常量"abc"
System.out.println(s1 == s2); //true,java中有常量优化机制
第五题:
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c"; //s1是变量,s1与常量"c"相加,会使用StringBuilder的append方法创建堆对象
System.out.println(s3 == s2); //false
补充:
String s = new String("abc")这个语句创建了几个对象的题目。 这种题目主要就是为了考察程序员对字符串对象的常量池掌握与否。上述的语句中是创建了2个对象,第一个对象是”abc”字符串存储在常量池中,第二个对象在JAVA Heap中的 String 对象。
string.intern()的作用, 如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回
String s = new String("1"); //创建两个对象,第一个是常量池中的1,第二个是堆中的1
s.intern(); //此时,常量池中有1,所以s的引用还是指向堆中的1
String s1 = "1"; //发现常量池中已有1,将常量池中的1返回给s1
System.out.println(s == s2); //false
String s = new String("1");
String s2 = "1";
s.intern();
System.out.println(s == s2); //false
String s3 = new String("1") + new String("1"); //只有堆对象11,11没有在常量池
s3.intern(); //s3放入常量池
String s4 = "11"; //用了常量池中的11
System.out.println(s3 == s4); // true
String s3 = new String("1") + new String("1");
String s4 = "11";
s3.intern(); //常量池已有11,返回堆11对象
System.out.println(s3 == s4); //false
网友评论