A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ヅ飞飞 中级黑马   /  2013-10-22 18:09  /  2070 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ヅ飞飞 于 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”么?

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

12 个回复

倒序浏览
==比较是比较对象是否相等,d与c是虽然值相同,但是他们是两个不同的对象,如果是想比较字符串的值, 那么就用equals, 这样结果是true, 最后一个new String("a") + b == c 运行的结果当然为false, new String("a") 是两个对象, 但是对象的值相加之后就成了另外一个对象, 和c对象也是两个不同的对象, 要想判断值相同也是用equals,

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

回复 使用道具 举报
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
回复 使用道具 举报
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.         }
复制代码
运行结果:(谢谢)
回复 使用道具 举报
true
false   这里不需要再解释了吧,上面已经解释了。d与c类类型变量指向了同一个对象,  而e与c是两个对象, 不能相等的
回复 使用道具 举报
好吧,承认第三个有点绕,不过还是感觉无压梨
回复 使用道具 举报
李江 中级黑马 2013-10-22 20:35:08
7#
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
用程序验证了一下,分享下结论。
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
如结论有不足和错误之处,欢迎补充和批评。
回复 使用道具 举报
新人第一次发,大家多多关照{:soso_e113:}
新建字符串常用有两种方式:
1、String b = "b";
2、String a = new String("a");
我认为搞清楚这个,几乎能解决类似此类字符串问题。
首先,第一种方式"b"是一个字符串常量,在编译期就被确定了,存放在字符串常量池中,字符串常量的拼接仍是一个字符串常量
其次,第二种方式是新建的字符串不是常量,在编译器不能被确定,不放入字符串常量池中,它有自己的内存地址,
根据以上两点就很好判断答案,希望楼主不再迷糊,哈哈
不对之处,望大家指正批评。{:soso_e120:}
回复 使用道具 举报 1 0
雨过丶天已晴 发表于 2013-10-22 20:49
新人第一次发,大家多多关照
新建字符串常用有两种方式:
1、String b = "b";

给力,明白了。
回复 使用道具 举报

:lol 献丑了
回复 使用道具 举报
必须不是“ab”,d!=c,因为c是自出字符串连接而d不是
回复 使用道具 举报
String c = "a"+"b"; 中 "a"、"b"都为常量,javac编译的时候会自动变为String c = "ab";存于字符串缓冲池中;
String d = a + b; 中a和b都是变量,相加会调用StringBuilder里的append()方法,返回一个新的字符串对象,存于缓冲池外。
所以c和d的“ab”地址不一样。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马