java中String类经典面试题

91 阅读2分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第n篇文章,点击查看活动详情

考察String类两种创建方式以及考察equals方法和==的区别

public class StringExercise01 {
    public static void main(String[] args) {
        String a="lxw";
        String b= "lxw";
        //小李解读:
       //String类重写了Object类的equals方法,比较的是字符串内容,a.equals(b) 输出结果是 true
        System.out.println(a.equals(b));
       //String a="lxw" 在常量池创建 lxw空间,执行 String b= "lxw"时候,会在常量池中找,是否存在
      // lxw的空间,发现有就把lxw的池空间指向了b,a==b 输出结果 true
        System.out.println(a == b);
        String x="lxw";//指向常量池的地址
        String y =new String("lxw");//指向堆中的对象
       //解读: String x="lxw" x指向常量池的地址空间
       //String y =new String("lxw"); 最终指向的是堆中value[] 数组属性的地址,指向堆地址
      //x.equals(y) 比较的是字符串内容,输出结果是true
        System.out.println(x.equals(y));
       // x == y 比较的是空间地址 x指向常量池中的地址,y指向堆中value[]属性地址
        //x == y 输出结果 false
        System.out.println(x == y);
        //String类的intern方法
       

       //参考jdk的方法说明,总结一句话 intern()返回的是常量池的地址(对象)
       //解读分析:x指向常量池的内存地址  y.intern()返回的也是常量池地址
      //x == y.intern() 输出结果true
        System.out.println(x == y.intern());
      //解读:y指向堆中内存地址 y.intern()返回的也是常量池地址
     // y == y.intern() 输出结果false
        System.out.println(y == y.intern());
    }
}

考察String创建原理

public class StringExercise03 {
    public static void main(String[] args) {
        String s1="haha";
        s1="lxw";
       // 以上的代码一共创建了两个对象,分别是常量池对象 haha 和lxw
        String a="hello"+"abc";
       //javm 虚拟机,编译器会把上面的优化为:String a="helloabc",所以就创建了一个对象
        String aa="hello";
        String bb="abc";
        String cc=aa+bb;
        //解读 String cc=aa+bb 代码底层执行的步骤
      //1.先创建一个 StringBuilder sb=new StringBuilder();
     //2.执行 sb.append("hello");
     //3.执行 sb.append("abc");
    //4.执行 String cc=sb.toString()
    //其实最后cc 指向堆中的对象(String)value[]--->池中"helloabc"
      // String cc=aa+bb; 一共创建3个对象
    }
}

总结:

String c1="ab"+"cd" 字符串常量相加,看的是池。

String c1=a+b;变量相加,是在堆内。