String 类的常见面试问题:
面试题一:
String s1 = "abc"; // 常量池 String s2 = new String("abc"); // new,堆内存中 System.out.println(s1==s2); // false两个对象的地址值不一样。 System.out.println(s1.equals(s2)); // true
面试题二:
String s3="a"+"b"+"c"; String s4="abc"; System.out.println(s3==s4); System.out.println(s3.equals(s4));
java 中常量优化机制,编译时 s3 已经成为 abc 在常量池中查找创建,s4 不需要再创建。
面试题三:
String s1="ab"; String s2="abc"; String s3=s1+"c"; System.out.println(s3==s2); // false System.out.println(s3.equals(s2)); // true
先在常量池中创建 ab ,地址指向 s1, 再创建 abc ,指向 s2。对于 s3,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s3。故 (s3==s2) 为 false。