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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangyutc 中级黑马   /  2014-3-17 11:55  /  1202 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jiangyutc 于 2014-3-17 11:58 编辑
  1. public class Stringdemo {

  2.         public static void main(String[] args) {
  3.                
  4.                 String s = "ab";
  5.                 String s1 = "a";
  6.                 String s2 = s1 + "b";
  7.                 System.out.println(s2=="ab");
  8.                 System.out.println(s=="ab");

  9.         }

  10. }
复制代码


结果为什么是false   true?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

7 个回复

倒序浏览
==是判断啊,两边相等的是true,不相等的是false
如果要显示出值,用=就行了,如果显示变量加字符用+连接

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
s2的值如果用equals比较字符串“ab”时值会相同,但是如果用“==”会比较两个值的物理地址(即它们的存储位置),s2跟字符串("ab"的存储对象是s)不是同一对象,所以肯定存储地址不同,所以第一个为false;    第二个字符串“ab”跟s是同一对象,所以值相同

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Sting判断是否相等要用equals,equals比较的是内容,用==比较的是字符串的内存地址
回复 使用道具 举报
以前做的基础测试题中的,可以看看,同样哦(扩展啦)
  1. public static void main(String[] args) {
  2.         String s = "abc";
  3.         s.substring(1);//从角标为1开始截取字符串
  4.         s.replace("bc", "xyz");//将字符串中“bc”替换为“xyz”
  5.         //打印的结果是abc,因为虽然s.substring(1)和replace("bc", "xyz")对字符串进行了操作
  6.         //但是处理的结果并没有赋给对象
  7.        System.out.println(s);
  8.       
  9.        //打印的结果为false,因为abc对应一个对象,new String("abc")有创建了一个新的对象
  10.        //两个对象在内存中的地址不同
  11.        String value = new String ("abc");
  12.        System.out.println(s == value);
  13.         }
复制代码
回复 使用道具 举报
本帖最后由 黄飞1991 于 2014-3-17 14:34 编辑

s2和s都是对象,存储内容都是对象在堆内存中的地址。s中存储的就是“ab”对象的地址,和“ab”同属于一个对象,即结果为真。
s2中存储的就不是“ab”对象的地址,和“ab”不同属于一个对象,即结果为假。
但s和s2中的内容都是ab。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
董振冬 发表于 2014-3-17 13:11
s2的值如果用equals比较字符串“ab”时值会相同,但是如果用“==”会比较两个值的物理地址(即它们的存储位 ...

s2跟字符串("ab"的存储对象是s)不是同一对象
为什么不是同一对象???
如果把s定义为final 为什么就会变成true
回复 使用道具 举报
首先,==判断的是内存地址值。看代码
String s = "ab",内存中有一个常量池,这句话就是将“ab”存入,常量池中,但将地址在暴露给s;
String s1 = "a";同理。
在看看常量池怎么用:如果常量池存在,就会直接引用,例如String s2 ="abc",String s3="abc",则s3直接指向常量池中的“abc”,s2==s3.
然后,String s2 = s1 + "b";这句代码是由StringBuilder中append方法中完成的。 append(String str方法):将指定的字符串追加到此字符序列。
执行过程是:注意,他不是在"b"的后面直接追加字符串。因为字符串是常量;它们的值在创建之后不能更改 所以,会将“b”存放在一个字符串生成器中,并在后面追加s对应的字符串,然后暴露地址值。
新开辟的空间存放的仍是“ab”,它会不会先去常量池找呢?不会,因为StringBuilder的调用过程是new一个新对象。而新创建的字符串不放入常量池中,他们有自己的地址空间。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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