黑马程序员技术交流社区

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

作者: gss    时间: 2015-9-20 23:31
标题: String类的常见面试题
* 1.判断定义为String类型的s1和s2是否相等
        * String s1 = "abc";
        * String s2 = "abc";
        * System.out.println(s1 == s2);                                        
        * System.out.println(s1.equals(s2));                
* 2.下面这句话在内存中创建了几个对象?
        * String s1 = new String("abc");                       
* 3.判断定义为String类型的s1和s2是否相等
        * String s1 = new String("abc");                       
        * String s2 = "abc";
        * System.out.println(s1 == s2);               
        * System.out.println(s1.equals(s2));
* 4.判断定义为String类型的s1和s2是否相等
        * String s1 = "a" + "b" + "c";
        * String s2 = "abc";
        * System.out.println(s1 == s2);               
        * System.out.println(s1.equals(s2));
* 5.判断定义为String类型的s1和s2是否相等
        * String s1 = "ab";
        * String s2 = "abc";
        * String s3 = s1 + "c";
        * System.out.println(s3 == s2);
        * System.out.println(s3.equals(s2));
作者: meihua    时间: 2015-9-21 07:45
给个答案,看我理解的对不对。thanks
作者: Anmyre    时间: 2015-9-21 09:22
收藏了  以后有用的
作者: 太阳太阳    时间: 2015-9-21 10:44
1:true true  因为都指向同一个同一个对象 2:两个对象  “abc”和new 3:false 因为s1代表两个对象s2代表1个对象 true因为equals比较的是内存地址值4:
作者: 太阳太阳    时间: 2015-9-21 10:47
4:true   true  5:false  true     
作者: Ralap军    时间: 2015-9-21 16:15
1、true,true
        s1、s2都指向了方法区常量池中的"abc"字符串常量
2、至少一个
        如果创建前“abc”已经存在常量池中,则创建一个对象,否则创建两个对象
3、false,true
        s1指向了堆中new出来的对象,堆中的对象又指向了常量池的"abc"
        s2直接指向了常量池的"abc"。equals()在String类中已重写,比较的是数据内容
4、true,true
        编译器期间,常量会自动组合运算,相当于s1="abc"
5、false,true
        因为s1不是常量,所以编译期间,不会和"c"自动组合。
        s3相当于s3 = new StringBuilder(s1).append("c").toString(),指向的是堆中的对象
作者: lanyu    时间: 2015-9-21 17:42
怎么不讲“==”和“equals”的区别呢
作者: 920792433    时间: 2015-9-21 19:33
棒棒哒!。求答案~
作者: gss    时间: 2015-9-21 21:15
meihua 发表于 2015-9-21 07:45
给个答案,看我理解的对不对。thanks

true true
2个 堆一个,常量池一个
false  true
true  true
false true

作者: gss    时间: 2015-9-21 21:20
Anmyre 发表于 2015-9-21 09:22
收藏了  以后有用的

true true
连个 堆一个,常量池一个
false  true
true  true
false true
这是答案
作者: gss    时间: 2015-9-21 21:25
920792433 发表于 2015-9-21 19:33
棒棒哒!。求答案~

1、true,true
        s1、s2都指向了方法区常量池中的"abc"字符串常量
2两个
   
3、false,true
        s1指向了堆中new出来的对象,堆中的对象又指向了常量池的"abc"
        s2直接指向了常量池的"abc"。equals()在String类中已重写,比较的是数据内容
4、true,true
        编译器期间,常量会自动组合运算,相当于s1="abc"
5、false,true
        因为s1不是常量,所以编译期间,不会和"c"自动组合。
        s3相当于s3 = new StringBuilder(s1).append("c").toString(),指向的是堆中的对象
作者: gss    时间: 2015-9-21 21:28
lanyu 发表于 2015-9-21 17:42
怎么不讲“==”和“equals”的区别呢

==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性
作者: 0814java1    时间: 2015-9-21 21:32
这些东西看过了  不过回顾一下还是好的
作者: Ralap军    时间: 2015-9-21 21:52
Ralap军 发表于 2015-9-21 16:15
1、true,true
        s1、s2都指向了方法区常量池中的"abc"字符串常量
2、至少一个

常量池中如果已经存在了"abc",它是不会再创建对象了,只会在堆中创建
作者: 刘凯1213    时间: 2015-9-21 21:56
大家都很厉害,加油
作者: benpaodeboluo    时间: 2015-9-21 21:56
温故而知新
作者: 920792433    时间: 2015-9-22 13:14
gss 发表于 2015-9-21 21:25
1、true,true
        s1、s2都指向了方法区常量池中的"abc"字符串常量
2两个

谢谢亲  嘻嘻~~~




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