黑马程序员技术交流社区

标题: 关于String的几道面试题 [打印本页]

作者: yy505032788    时间: 2014-12-13 12:23
标题: 关于String的几道面试题
问题1:String s1 = new String("abc");
            String s2 = "abc";两者有区别么?
            两句语句是同样的效果,但方式不同;
           s1在内存中创建了两个对象,在堆内存中new出了一个对象,又因为字符串是存放在常量池中的,new出来的对象里面只是存了一个方法区地址,然后在常量池中创建了一个“abc”的对象,new出来的对象指向了常量池中“abc”的地址,然后又把new出来对象的地址给s1。
           s2只是在常量池中创建了一个对象,然后直接把方法区中的常量池中的地址给s2。

问题2:String s = "hello";
             s += "world";
            System.out.println(s);请问打印s的值是什么?
            这个问题的难点在于字符串是常量,不能改变,但对象的引用地址值是可以改变的,会打印出helloworld。

问题3:String s1 = "hello";
            String s2 = "world";
            String s3 = "hello"+"world";
            String s4 = "helloworld";
            String s5 = s1+s2;
            提问:(==比较的是地址值,equals比较的是内容,因为String类重写了了此方法)
                       System.out.println(s3==s4); //true       因为字符串是常量,JVM在编译的时候会自动处理,s3和s4指向的是同一个地址
                       System.out.println(s3.equals(s4));//true       equals      在Object默认是比地址的哈希码值的,但是String重写了equals方法,比较的是内容
                       System.out.println(s4==s5);//false           因为JVM在处理程序的时候,s5是由两个变量得来的,会重新开辟一个地址
                       System.out.println(s4.equals(s5));//true   equals      在Object默认是比地址的哈希码值的,但是String重写了equals方法,比较的是内容


作者: 浅木头    时间: 2014-12-13 14:01
12.13,养肥再看~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2