1. String类型面试题:
1 package cn.itcast_02; 2 3 /* 4 * String s = new String(“hello”)和String s = “hello”;的区别? 5 * 有。前者会创建2个对象,后者创建1个对象。 6 * 7 * ==:比较引用类型比较的是地址值是否相同 8 * equals:比较引用类型默认也是比较地址值是否相同,而String类重写了equals()方法,比较的是内容是否相同。 9 */ 10 public class StringDemo2 { 11 public static void main(String[] args) { 12 String s1 = new String("hello"); 13 String s2 = "hello"; 14 15 System.out.println(s1 == s2);// false 16 System.out.println(s1.equals(s2));// true 17 } 18 }
"hello" 这个字符串属于在字符串常量区的对象
过程图:
下面看程序,结果:
package cn.itcast_02; /* * 看程序写结果 */ public class StringDemo3 { public static void main(String[] args) { String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2);// false System.out.println(s1.equals(s2));// true String s3 = new String("hello"); String s4 = "hello"; System.out.println(s3 == s4);// false System.out.println(s3.equals(s4));// true String s5 = "hello"; String s6 = "hello"; System.out.println(s5 == s6);// true System.out.println(s5.equals(s6));// true } }
测试类:
1 package cn.itcast_02; 2 3 /* 4 * 看程序写结果 5 * 字符串如果是变量相加,先开空间,在拼接。 6 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。 7 */ 8 public class StringDemo4 { 9 public static void main(String[] args) { 10 String s1 = "hello"; 11 String s2 = "world"; 12 String s3 = "helloworld"; 13 System.out.println(s3 == s1 + s2);// false 14 System.out.println(s3.equals((s1 + s2)));// true 15 16 System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true 17 System.out.println(s3.equals("hello" + "world"));// true 18 19 // 通过反编译看源码,我们知道这里已经做好了处理。 20 // System.out.println(s3 == "helloworld"); 21 // System.out.println(s3.equals("helloworld")); 22 } 23 }