黑马程序员技术交流社区

标题: String字符串比较问题 [打印本页]

作者: jxlovqqvo    时间: 2014-12-20 16:01
标题: String字符串比较问题
请看下面代码,谁能告诉我这是为什么
第一个比较为何相等,不是比地址么?
既然第一个相等为何第二个不等?
  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. }
复制代码

作者: pcy1022    时间: 2014-12-20 16:09
s1只有一个对象,s2有二个对象,不能直接去比,这样比是比他们的引用地址。
作者: 没伞的孩子    时间: 2014-12-20 16:14
                String s = "a";     在栈内存中开辟空间 存放“a”
                String s1 = "a";   此种方式,系统在栈内存发现有“a” 直接把“a”的地址给s1 所以其实他们是同一个地址的
                String s2 = new String("a");  此种方式,在堆内存中开辟空间,存放“啊”
              所以第一个相同,第二个不同。

不对之处,请指正。
作者: 南柯一梦境    时间: 2014-12-20 16:19
你看看这个帖子,里面讲的很详细。关于定义String的堆栈问题(越看越糊涂)
http://bbs.itheima.com/forum.php?mod=viewthread&tid=156962
(出处: 黑马程序员IT技术论坛)

作者: jxlovqqvo    时间: 2014-12-20 16:32
南柯一梦境 发表于 2014-12-20 16:19
你看看这个帖子,里面讲的很详细。关于定义String的堆栈问题(越看越糊涂)
http://bbs.itheima.com/forum. ...

原来是常量池的问题,我懂了
作者: 南柯一梦境    时间: 2014-12-20 16:42
jxlovqqvo 发表于 2014-12-20 16:32
原来是常量池的问题,我懂了

恩,我也是看了人家的帖子才会了不少,懂了就好
作者: 焦明坤    时间: 2014-12-20 21:25
看帖子也能学到不少东西呢
作者: 彭柏良    时间: 2014-12-20 21:55
s和s1这两个都是赋同一个值,没有new对象,肯定相等啦。

s2是新建一个对象,s在内存中有一个对象,而s2在内存中有两个对象。
作者: Honelyboy    时间: 2014-12-20 23:49
s和s1的指向是常量池,s2的指向是堆内存。
作者: 青衫禅客    时间: 2014-12-21 00:40
String是引用数据类型,s和s1指向的是同一个字符串,s2是新建一个字符串,他们的地址肯定不一样啊,如果是用equals比较的话,就是比较字符串内容的
作者: l763631191    时间: 2014-12-21 01:05
上面的回答很好,学习了!
作者: 彭旭文    时间: 2014-12-21 03:28
String类型是一种引用类型,存储的是地址值,注意地址值的指向。具体见图,希望可以帮助你理解!

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

String类型的引用.png





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