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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高贵杰 中级黑马   /  2013-3-12 09:54  /  1964 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高贵杰 于 2013-3-12 13:56 编辑

这个帖子是我昨天发的,很多人给出了答案,根据大家的答案我再次进行测试,发现新的问题。

这是昨天那个帖子的链接地址,有兴趣的可以去看看

http://bbs.itheima.com/thread-40672-1-1.html

public class AnimalFarm {
public static void main(String[] args) {
  final String pig = "length: 10";
  final String dog = "length: "+pig.length();
  
  System.out.println(pig==dog);
  System.out.println(pig.equals(dog));
  System.out.println(dog);
  System.out.println(pig);
}
}

程序运行输出:

false
true
length: 10
length: 10

String定义常量是存在于常量池中的,那他们的内存地址就应该是相同的,而且内容相同,为什么用“==”表示相等时,还是会输出false?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

13 个回复

倒序浏览
本帖最后由 曹睿翔 于 2013-3-12 10:37 编辑

这个嘛,论坛讨论的也挺多的
String s = “abc”
String s1 = new String("abc");
这两个对象的区别你应该知道,就不多说了。
String s2=“a”+"b"+"c"+"a"//不建议这么做,因为用+号连接起来的字符串,相当于new出来的(六个之多,a、b、c、ab、abc、abca),也就是编译期确定不了,建议用StingBuilder或StringBuffer(同步),用来存储可变长度的字符串

public class AnimalFarm {
public static void main(String[] args) {
   final String pig = "length: 10";//编译器就可以确定,存在于常量池中。
   final String dog = "length: "+pig.length();//相当new一个新串然,在编译期确定不了,不在常量池中,new出来然后dog对象指向了新的字符串
   
   System.out.println(pig==dog);//这时比的是地址,当然不同
   System.out.println(pig.equals(dog));
   System.out.println(dog);
   System.out.println(pig);
}
}

程序运行输出:

false
true
length: 10
length: 10

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 恭喜25分~

查看全部评分

回复 使用道具 举报
曹睿翔 发表于 2013-3-12 10:21
这个嘛,论坛讨论的也挺多的
String s = “abc”
String s1 = new String("abc");


public class AnimalFarm {

        public static void main(String[] args) {
                final String pig = "length: 10";
                final String dog = "length: "+10;
//final String dog = "length: "+pig.length();       
                System.out.println(pig==dog);
                System.out.println(dog);
                System.out.println(pig);
        }

}


按照你的意思,我上述写法应该输出false,但是最终输出的true
回复 使用道具 举报
本帖最后由 杨玉辉 于 2013-3-12 11:36 编辑

final String pig = "length:10"; //要运算 pig.length()=9;就是字符串长度,你一个一个数length:10的个数
final String dog = "length: "+pig.length();// 这时候的String dog = “length:9”。考虑清楚这里就行

所以说 字符串 pig == dog 判定 是 false 因为 字符串 内容并不相同


请注意养成敲代码时,空格键 在字符串里属于一个字符

补充
length: 10
length:10 字符串 长度有区别
"length: "+10  //长度10
"length:"+10   //长度 9
"length:"+pig.length(); 会是两种结果

点评

参与有奖  发表于 2013-3-12 13:08

评分

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

查看全部评分

回复 使用道具 举报
楼上的兄弟貌似有点误会了,==比较的是对象的引用,即为引用的内存地址,
                                     equal比较的是对象的值
回复 使用道具 举报
谭辉 发表于 2013-3-12 11:47
楼上的兄弟貌似有点误会了,==比较的是对象的引用,即为引用的内存地址,
                                   ...

楼上这么说,不地道吧,字符串对象引用的常量池,你的内容不同,内存地址肯定不同
回复 使用道具 举报
杨玉辉 发表于 2013-3-12 11:19
final String pig = "length:10"; //要运算 pig.length()=9;就是字符串长度,你一个一个数length:10的个数 ...

帅哥,你写的代码有问题,我的源代码里面的字符串长度都为10。
回复 使用道具 举报
杨玉辉 发表于 2013-3-12 12:14
楼上这么说,不地道吧,字符串对象引用的常量池,你的内容不同,内存地址肯定不同 ...

帅哥,你没仔细看题目吧,两个字符串的输出内容是相同的
回复 使用道具 举报
http://bbs.itheima.com/thread-40672-1-1.html
这个地址是你自己贴上去的吧,你在这个贴里你看看

public class AnimalFarm {
        public static void main(String[] args) {
             final String pig = "length:10";
             final String dog = "length:"+pig.length();
             System.out.println("Animals are equals:"+ pig==dog);
             System.out.println("Animals are equals:"+ pig.equals(dog));
        }
}
以上摘自贴里内容,往下看

现在本帖里的内容你比较一下final String pig = "length: 10";你用键盘上的左右键看看是否多了一个空格键
回复 使用道具 举报
杨玉辉 发表于 2013-3-12 12:53
http://bbs.itheima.com/thread-40672-1-1.html
这个地址是你自己贴上去的吧,你在这个贴里你看看

那个帖子的代码有问题,帖子下面的回复已经改了,才会在新的帖子上面附有新的代码,而且在新帖子上面有输出结果的。新的帖子在dog的字符串上length:后确实多了一个空格,为了使两个字符串的输出结果相同。
回复 使用道具 举报
高贵杰 发表于 2013-3-12 11:17
public class AnimalFarm {

        public static void main(String[] args) {

       我测试了一下,如果是直接赋值,无论是String nn="length: 10";还是String mm="length: "+10;和pig比较的时候,==判断的都是true,而和dog比较则为false。我的理解是,dog赋值时,用到了pig.length(),所以dog的值,其实是随着pig的长度而改变的,所以虚拟机存储的并不是和pig同样的引用地址,所以用==判断为false。而equals比较的是字符串的具体值,所以返回true了。你将pig.length()换成10,结果自然是不一样的。
      参考代码:
public class AnimalFarm {
public static void main(String[] args) {
  final String pig = "length: 10";
  final String dog = "length: "+pig.length();

  String nn= "length: 10";
  String mm= "length: "+10;

System.out.println(nn==pig);System.out.println(nn==dog);
System.out.println(mm==pig);System.out.println(mm==dog);
System.out.println(nn==mm);
  System.out.println(pig==dog);
  System.out.println(pig.equals(dog));
  System.out.println(dog);
  System.out.println(pig);
}
}

结果如图:



如果还有问题,请继续追问,明白了就将帖子分类改成【已解决】~

回复 使用道具 举报
本帖最后由 杨玉辉 于 2013-3-12 14:09 编辑
高贵杰 发表于 2013-3-12 13:26
那个帖子的代码有问题,帖子下面的回复已经改了,才会在新的帖子上面附有新的代码,而且在新帖子上面有输 ...

即便改了之后,也不会相同,pig.length() 的返回值类型是int ,并不是字符串,到这里才去开辟新空间的吧

我的理解就是这样的:
你把int型的pig.length() 的值 跟10 看做是相同的了  
在运算时,int 型数据有自己的堆内存地址,引用的只是堆内存中的值,并未从常量池里去字符串常量10,而是开辟了新空间存放结果 罢了


回复 使用道具 举报
陈丽莉 发表于 2013-3-12 13:29
我测试了一下,如果是直接赋值,无论是String nn="length: 10";还是String mm="length: "+10;和pi ...

25分倒是不重要,重要的是我觉得咱物联云不热闹,以后我会在这多活动活动的!希望斑竹支持
回复 使用道具 举报
曹睿翔 发表于 2013-3-12 14:44
25分倒是不重要,重要的是我觉得咱物联云不热闹,以后我会在这多活动活动的!希望斑竹支持 ...

呵呵,当然支持了~  大家共同讨论,共同进步嘛~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马