黑马程序员技术交流社区

标题: 京东面试题:关于String。 [打印本页]

作者: ヅ飞飞    时间: 2013-10-22 18:09
标题: 京东面试题:关于String。
本帖最后由 ヅ飞飞 于 2013-10-22 20:50 编辑

分析程序运行结果:

  1. public class Demo {
  2.         public static void main(String[] arg){
  3.                 String a = "a";
  4.                 String b = "b";
  5.                 String c = "a"+"b";
  6.                 String d = a + b;
  7.                 System.out.println(a=="a");
  8.                 System.out.println(c=="ab");
  9.                 System.out.println(d==c);               
  10.                 System.out.println(new String("a") + b == c);
  11.         }
复制代码
输出结果:
true
true
false
false
后两个有点晕,d和c指向的不是相同对象“ab”么?
作者: Simple_love    时间: 2013-10-22 18:29
==比较是比较对象是否相等,d与c是虽然值相同,但是他们是两个不同的对象,如果是想比较字符串的值, 那么就用equals, 这样结果是true, 最后一个new String("a") + b == c 运行的结果当然为false, new String("a") 是两个对象, 但是对象的值相加之后就成了另外一个对象, 和c对象也是两个不同的对象, 要想判断值相同也是用equals,
作者: ☆╰學不会☆╮    时间: 2013-10-22 18:30
d==c  d单独输出的话 d="ab"   c单独输出也是c="ab" 但是d的结果是string类型的变量a+b 变量直接的连接 c是两个string类型直接相加 所以结果为false
new String("a")+b==c  new String() 是指在内存中划分一块空间在存储字符串a 和b连接 是"ab" 和c="a"+"b"比较的话 结果也是false
作者: ヅ飞飞    时间: 2013-10-22 19:32
Simple_love 发表于 2013-10-22 18:29
==比较是比较对象是否相等,d与c是虽然值相同,但是他们是两个不同的对象,如果是想比较字符串的值, 那么 ...

追问:

  1. public class Demo {
  2.         public static void main(String[] arg){
  3.                 String a = "a";
  4.                 String b = "b";
  5.                 String c = "a"+"b";
  6.                 String d = "ab";
  7.                 String e = "a"+b;
  8.                 System.out.println(d==c);               
  9.                 Sysrtem.out.println(e==c);
  10.         }
复制代码
运行结果:(谢谢)
作者: Simple_love    时间: 2013-10-22 19:50
true
false   这里不需要再解释了吧,上面已经解释了。d与c类类型变量指向了同一个对象,  而e与c是两个对象, 不能相等的
作者: clt757251678    时间: 2013-10-22 20:20
好吧,承认第三个有点绕,不过还是感觉无压梨
作者: 李江    时间: 2013-10-22 20:35
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
作者: ヅ飞飞    时间: 2013-10-22 20:45
用程序验证了一下,分享下结论。
1.初始化方式有两种:1)String a = new String("abc"); 2)String a = "abc";
2.当使用第二种方式初始化时要注意:java有一个提高效率过程:当“abc”在内存中已经存在则不开辟新空间而是将引用变量直接指向原来存在的“abc”对象。
3.String类底层操作的是数组。因为数组范围有限当进行字符串进行+运算操作时,一定会开辟新内存用于存储来接受+运算的结果。

  1. public class Demo {
  2.         public static void main(String[] arg){
  3.                 String a = "a"; //创建String对象内容:“a”。引用变量a指向该对象。
  4.                 String b = "b"; //创建String对象内容:“b”。引用变量b指向该对象。
  5.                 String c = "a"+"b";//创建String对象内容:“ab”。引用变量c指向该对象。
  6.                 String d = "ab";//检测到内存中已经有“ab”。java为节省空间不new对象直接将引用c值赋给引用d。
  7.                 String e = "a"+b;//右式属于字符串运算操作,开辟了新内存。
  8.                 System.out.println(d==c);               
  9.                 Sysrtem.out.println(e==c);
  10.         }
复制代码
输出结果:true false
如结论有不足和错误之处,欢迎补充和批评。
作者: 雨过丶天已晴    时间: 2013-10-22 20:49
新人第一次发,大家多多关照{:soso_e113:}
新建字符串常用有两种方式:
1、String b = "b";
2、String a = new String("a");
我认为搞清楚这个,几乎能解决类似此类字符串问题。
首先,第一种方式"b"是一个字符串常量,在编译期就被确定了,存放在字符串常量池中,字符串常量的拼接仍是一个字符串常量
其次,第二种方式是新建的字符串不是常量,在编译器不能被确定,不放入字符串常量池中,它有自己的内存地址,
根据以上两点就很好判断答案,希望楼主不再迷糊,哈哈
不对之处,望大家指正批评。{:soso_e120:}

作者: ヅ飞飞    时间: 2013-10-22 20:55
雨过丶天已晴 发表于 2013-10-22 20:49
新人第一次发,大家多多关照
新建字符串常用有两种方式:
1、String b = "b";

给力,明白了。
作者: 雨过丶天已晴    时间: 2013-10-22 20:58
ヅ飞飞 发表于 2013-10-22 20:55
给力,明白了。

:lol 献丑了
作者: 马晓平    时间: 2013-10-22 22:46
必须不是“ab”,d!=c,因为c是自出字符串连接而d不是
作者: 胡志翔    时间: 2013-10-22 23:13
String c = "a"+"b"; 中 "a"、"b"都为常量,javac编译的时候会自动变为String c = "ab";存于字符串缓冲池中;
String d = a + b; 中a和b都是变量,相加会调用StringBuilder里的append()方法,返回一个新的字符串对象,存于缓冲池外。
所以c和d的“ab”地址不一样。






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