黑马程序员技术交流社区

标题: String类的面试题 [打印本页]

作者: 舞动炫龙    时间: 2016-1-21 13:32
标题: String类的面试题
本帖最后由 舞动炫龙 于 2016-1-21 13:31 编辑

1.判断定义为String类型的s1和s2是否相等
     String s1 = "abc";
    String s2 = "abc";
     System.out.println(s1 == s2);         //true               
     System.out.println(s1.equals(s2));     //true
    解释:
    1.String类型的字符串是常量,存储在常量池中,常量池中没有这个字符串对象,就创建一个,如果有直接用即可,所以s1和s2里面存储的是一样的地址
    2.String类中的equals()方法重写了父类的,判断的是相同字符序列的字
        

2.下面这句话在内存中创建了几个对象?
     String s1 = new String("abc");    //创建两个对象,一个在常量池中,一个在堆内存中
     依据:API参考文档:
            public String(String original)
            初始化一个新创建的 String 对象,在堆内存中新创建的字符串对象是该参数字符串的副本。
      解释:
      1.先在常量池中创建"abc",并分配一个地址值(当然要是常量池中有就直接用不在创建)
      2.new String就是在堆内存中创建一个对象,然后把常量池中的"abc"的副本放到了堆内存中的new String中,并把分配的地址值赋值给s1,并且和常量池中的地址不一样     
             

3.判断定义为String类型的s1和s2是否相等
    String s1 = new String("abc");        //记录的是堆内存对象的地址值            
    String s2 = "abc";                             //记录的是常量池中的地址值
    System.out.println(s1 == s2);          //false
    System.out.println(s1.equals(s2));   //true
4.判断定义为String类型的s1和s2是否相等
    String s1 = "a" + "b" + "c";   
        解释:java中有常量优化机制,编译器编译的时候就会使其变成"abc"; 就像byte b = 3+4;  在编译时就变成7,把7赋值给b,常量优化机制
    String s2 = "abc";            
        解释:由于上句就已经在常量池中创建了"abc"了,所以就直接用就行了
    System.out.println(s1 == s2);        //true
    System.out.println(s1.equals(s2));//true
5.判断定义为String类型的s2和s3是否相等
    String s1 = "ab";
    String s2 = "abc";
    String s3 = s1 + "c";
    System.out.println(s3 == s2);            //false
    System.out.println(s3.equals(s2));    //true
        解释:1.s1指向常量池中的"ab";s2指向常量池的"abc";
            2.s1 + "c";字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。也就是说s3里面存储的是堆内存中的地址值
            3.s2记录的是常量池的地址值,s3记录的是堆内存中的地址值,所以是false
            
            


作者: z195061    时间: 2016-1-21 15:59
我来捡漏的
作者: 肩特曼    时间: 2016-1-21 20:27
挺好  谢谢了亲 辛苦辛苦  点个赞
作者: lingdutiaowang    时间: 2016-1-21 21:22
学习了,以后详细看
作者: heima7788    时间: 2016-1-21 22:16
嗯,学过了
作者: 舞动炫龙    时间: 2016-1-21 22:55
z195061 发表于 2016-1-21 15:59
我来捡漏的

谢谢捧场
作者: jasonbourne    时间: 2016-1-21 23:33
漂亮,楼主幸苦
作者: zhanganping    时间: 2016-1-21 23:45
长知识了,谢谢
作者: black习    时间: 2016-1-22 00:04
讲的很详细
作者: 梁志斌    时间: 2016-1-22 13:14
很棒很棒
作者: 酱油    时间: 2016-1-22 13:35
可以可以,楼主辛苦了。又学到知识。。哈哈
作者: 偷懒的猫叔    时间: 2016-1-22 15:29
楼主辛苦。打了这么多字。
作者: 舞动炫龙    时间: 2016-1-22 23:23
肩特曼 发表于 2016-1-21 20:27
挺好  谢谢了亲 辛苦辛苦  点个赞

谢谢捧场
作者: 舞动炫龙    时间: 2016-1-22 23:25
偷懒的猫叔 发表于 2016-1-22 15:29
楼主辛苦。打了这么多字。

一起学习
作者: 舞动炫龙    时间: 2016-1-22 23:27
qq852919300 发表于 2016-1-22 13:35
可以可以,楼主辛苦了。又学到知识。。哈哈

谢谢捧场
作者: fury1994    时间: 2016-1-23 04:51
给力 !!!
作者: StringBOX    时间: 2016-1-23 12:30
学了都忘记了,来补补。、、
作者: Batman    时间: 2016-1-23 12:55
学习了,楼主辛苦
作者: suihaixia54    时间: 2016-1-23 21:07
知道了,谢谢告诉,会重点看一下
作者: 舞动炫龙    时间: 2016-1-23 21:18
suihaixia54 发表于 2016-1-23 21:07
知道了,谢谢告诉,会重点看一下

谢谢捧场
作者: 悠悠天下    时间: 2016-1-23 21:44
加油努力学习
作者: 付宇_GXie7    时间: 2016-1-23 21:51
顶顶一下
作者: 舞动炫龙    时间: 2016-1-23 23:47
付宇_GXie7 发表于 2016-1-23 21:51
顶顶一下

欢迎欢迎
作者: 806551458    时间: 2016-2-4 14:51
好熟悉,面试时没问我。。
作者: a527512132    时间: 2016-2-4 21:25
daidiazaiou
作者: life55    时间: 2016-2-4 23:43
学过的了
作者: pea    时间: 2016-2-8 10:10
好详细的笔记,不过好眼熟的样子....这样真的可以吗?
作者: renkuo023    时间: 2016-2-8 15:29
涨姿势了。谢谢啊大神
作者: tujiu888    时间: 2016-2-8 18:12
String类的面试题还是要重点掌握的




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