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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vaqh 中级黑马   /  2014-7-30 10:42  /  1260 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 vaqh 于 2014-7-30 20:04 编辑

class StringDemo {
        public static void main(String[] args) {
                String s1 = new String("abc");
                String s2 = "abc";                 String s3 = "abc";
                System.out.println(s1==s2);
                System.out.println(s1.equals(s2));
                 System.out.println(s2==s3);
                System.out.println(s2.equals(s3));
        }
}



8 个回复

倒序浏览
本帖最后由 masai158 于 2014-7-30 10:52 编辑

s1 new 的一个 abc 对象
s2 赋值一个 abc 字符串
s3 赋值一个 abc 字符串
字符串 == 比较地址值的。  equals 比较的值。。字符串在内存中一旦参数,都无法修改。。 我就说这么多
false;
true;
true;
true;
回复 使用道具 举报 1 0
自己打印一次不就知道了。。
回复 使用道具 举报
水贴。。。。。。。
回复 使用道具 举报
interface_sfly 发表于 2014-7-30 10:57
自己打印一次不就知道了。。

问题是为什呢
回复 使用道具 举报
注:
  String是一个比较特殊的类型,就是存在一个字符串池。当直接将一个字符串赋值给一字符串变量时,
  如果字符串池中存在该字符串的话,就直接从字符串池中获得,而不另外new 一个字符串。
  如果字符串池中没有对应的字符串,则就先在堆中new一个对应的字符串,之后保存到字符串池中。
  但如果是用new来创建String字符串对象,则就是在堆中生了一个独立的对象。
一,s1 = s2 -->false。
   因为s1 new 的是在内存中的一个String类型的独立对象,而s2是保存在字符串池中的。所以地址不一样。
二,s1.equals(s2) -->true。
   因为String重写了equals方法,其比较的是字符串的值,而不是地址。所以是true。
三,s2==s3 --> true。
   因为当创建s2字符串时,就在字符串池中生成了一个'abc'字符串,而s3的值与s2的值相同,所以s3就直接从字符串池中直接那字符串'abc',所以s2 和 s3指向的是同一个对象地址。结果为:true。
四,s2.equals(s3) --> true。原因同三。

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1

查看全部评分

回复 使用道具 举报 1 0
vaqh 中级黑马 2014-7-30 20:03:35
7#
晓风 发表于 2014-7-30 18:49
注:
  String是一个比较特殊的类型,就是存在一个字符串池。当直接将一个字符串赋值给一字符串变量时,
   ...

恩,明白了,谢谢
回复 使用道具 举报
f
t
t
t
.

点评

加点文字说明啊!  发表于 2014-8-1 08:14
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马