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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙运强 黑马帝   /  2011-9-17 17:15  /  2214 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String a="abc";  String b="abc";  System.out.println(a==b);//true

String a1=new  String("abc");  String b1=new String("abc");
  System.out.println(a1==b1);//false

a,b都在堆内存中指的是同一对象。而实用new不论堆内存中是否有相同值都得创建想的空间,这种说法不知道对不对?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 看看大家的回答! 挺不错的

查看全部评分

6 个回复

倒序浏览
黑马网友  发表于 2011-9-17 17:28:07
沙发

回复 楼主 的帖子

String a="abc";  String b="abc";  System.out.println(a==b);//true
为什么结果是true,原因是:

String a="abc"; 这种创建方式是在栈中创建一个String的对象引用,然后再去查找栈中是否有没有存放"abc",如果没有,则将"abc"存放进栈,并让a指向"abc",如果已经有"abc",则直接把b指向"abc"。

而这种
String a1=new  String("abc");  String b1=new String("abc");
  System.out.println(a1==b1);//false
说明了用new的方式是生成新的对象,每个对象都指向不同的地方。

这些区别都需要你对堆栈的基本概念很熟悉才行。
希望能帮到你。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-17 17:52:22
藤椅
String 是一个类,它可以直接 String  a="abc",也可以String a=new string("abc")前者和后者的区别就在于前者无论你创建多少个String 对象的引用,如果他们的值一样的话,在堆内存中只有一个值得空间,而所有的引用都会指向它,后者就是不管你创建多少个对象的引用,无论它们的值是否一样,但是在堆内存中都会开辟新的内存空间,所以每个引用值对应着一个内存空间您明白了吗?

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-17 22:50:59
板凳
java中内存分为栈和堆,String a="abc";  String b="abc";  这种情况是直接在栈中给a和b赋值,而不是给a和b赋一个对象的引用地址,所以a==b当然返回true了,然而String a1=new  String("abc");  String b1=new String("abc"); 中a1和b1赋给的是在堆中的对象的地址,而不是对象的内容,而每个new出来的对象都有唯一的地址,肯定是不一样的,总结出来就是a和b比较的是内容,而a1和b1比较的是对象的字节码。这个内容貌似毕向东老师的视频讲的很清楚了,你可以看看其中的day3-17视频,毕老师的讲课很激情,很生动!

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-18 08:55:58
报纸

回复 楼主 的帖子

楼主你想对了一点。。都是在堆内存的这个是没错,你没注意到equals和==的区别吗?
对于基本数据类型,==比较值,对于对象,比较内存地址。
equals方法是需要用户重写的,它的行为由程序员定义,你想怎么比较就怎么比较。而之所以你会认为它比较的是内容,是因为现在jdk中的类重写这个方法,比较的都是内容(如String类)。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-20 22:47:36
地板
String s = "aaa";(采用字符串方式赋值)
1)查找String Pool中是否存在"aaa"这个对象,如果不存在,则String Pool中创建一个
"aaa"对象,然后将String Pool中的这个”aaa"对象的地址返回来,赋给引用变量s,这样s会指向String Pool
中的这个"aaa"字符串对象。
2)如果存在,则不创建任何对象,直接将String Pool中的这个"aaa"对象的地址返回来,赋给s引用。


String s = new String("aaa")
1)首先在String Pool中查找有没有“aaa"这个字符串对象。
如果有,则不在String Pool中再去创建”aaa“这个对象了,直接在堆中(heap)中创建一个”aaa“字符串对象,然
后将队中的这个”aaa“对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个”aaa“字符串对象。

2)如果没有,则首先在String Pool中创建一个”aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将
堆中的这个”aaa“对象的地址返回来,赋给s的引用,导致s指向了堆中所创建的这个”aaa“对象。

评分

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

查看全部评分

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