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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jxlovqqvo 中级黑马   /  2014-12-20 16:01  /  1181 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请看下面代码,谁能告诉我这是为什么
第一个比较为何相等,不是比地址么?
既然第一个相等为何第二个不等?
  1. public class StringTest {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                
  7.                
  8.                 String s = "a";
  9.                 String s1 = "a";
  10.                 String s2 = new String("a");
  11.                 System.out.println(s==s1);//true
  12.                
  13.                 System.out.println(s==s2);//false
  14.                
  15.                
  16.         }

  17. }
复制代码

评分

参与人数 1黑马币 +3 收起 理由
杨佳名 + 3

查看全部评分

11 个回复

倒序浏览
s1只有一个对象,s2有二个对象,不能直接去比,这样比是比他们的引用地址。
回复 使用道具 举报
                String s = "a";     在栈内存中开辟空间 存放“a”
                String s1 = "a";   此种方式,系统在栈内存发现有“a” 直接把“a”的地址给s1 所以其实他们是同一个地址的
                String s2 = new String("a");  此种方式,在堆内存中开辟空间,存放“啊”
              所以第一个相同,第二个不同。

不对之处,请指正。
回复 使用道具 举报
你看看这个帖子,里面讲的很详细。关于定义String的堆栈问题(越看越糊涂)
http://bbs.itheima.com/forum.php?mod=viewthread&tid=156962
(出处: 黑马程序员IT技术论坛)

评分

参与人数 1黑马币 +2 收起 理由
杨佳名 + 2

查看全部评分

回复 使用道具 举报
南柯一梦境 发表于 2014-12-20 16:19
你看看这个帖子,里面讲的很详细。关于定义String的堆栈问题(越看越糊涂)
http://bbs.itheima.com/forum. ...

原来是常量池的问题,我懂了
回复 使用道具 举报
jxlovqqvo 发表于 2014-12-20 16:32
原来是常量池的问题,我懂了

恩,我也是看了人家的帖子才会了不少,懂了就好
回复 使用道具 举报
看帖子也能学到不少东西呢
回复 使用道具 举报
s和s1这两个都是赋同一个值,没有new对象,肯定相等啦。

s2是新建一个对象,s在内存中有一个对象,而s2在内存中有两个对象。
回复 使用道具 举报
s和s1的指向是常量池,s2的指向是堆内存。
回复 使用道具 举报
String是引用数据类型,s和s1指向的是同一个字符串,s2是新建一个字符串,他们的地址肯定不一样啊,如果是用equals比较的话,就是比较字符串内容的
回复 使用道具 举报
上面的回答很好,学习了!
回复 使用道具 举报
String类型是一种引用类型,存储的是地址值,注意地址值的指向。具体见图,希望可以帮助你理解!

String类型的引用.png (97.48 KB, 下载次数: 8)

String类型的引用.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马