问题描述
classTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}结果为:falseclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}结果为:trueclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a.equals(b));}}结果为:true
解决方案
解决方案二:
每隔几天这里就会出现这种问题
解决方案三:
因为你用的是字符对象相比较,相当于比较的是a与b的内存地址是否相同,因为是两个内存单元,所以结果是false字符型对象比较是否相同,应该用equals明白没?
解决方案四:
http://topic.csdn.net/u/20090519/18/7b8cf7ef-bc06-4d26-8a2c-692eb0562231.html
解决方案五:
第二个打错了,应该是classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第三个没问题,第一个和第二个为什么会有差别啊
解决方案六:
建议去看一个张龙老师的java笔试面试深度剖析视频
解决方案七:
classTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}
classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}
第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同。而第二个,两个对象都没有用new关键字,这时,涉及到了java的字符串池技术,在直接用s="xxx"的形式时,会把=号后面的字符串放入字符串池,而且相同的字符串只放一次,所以a和b的地址是一样的,因为在字符串池里面。
解决方案八:
第三个你也明白,我就不说了
解决方案九:
==比较的是对象的地址(如果是对象的话)。String是个特例,new的时候会重新分配内存。不new的时候用的还是原来的。引用4楼tylovemxhehe的回复:
第二个打错了,应该是classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第三个没问题,第一个和第二个为什么会有差别啊
解决方案十:
6楼正解,看到你的标题我就大概猜到你想问什么了,==比较的是内存地址,equal才是正真比较的数据。new表示在内存中创建一个区域,第二个那种情况就涉及到字符串池技术了。
解决方案十一:
路过
解决方案十二:
引用9楼yhwpeng的回复:
6楼正解,看到你的标题我就大概猜到你想问什么了,==比较的是内存地址,equal才是正真比较的数据。new表示在内存中创建一个区域,第二个那种情况就涉及到字符串池技术了。
正在培训,老师刚讲过,哈哈
解决方案十三:
这问题问了很多次了..用equals!!!!
解决方案十四:
第一个第二个的区别就是第一个实际上用new创建了两个String对象然后第二个中的两个是同一个String对象
解决方案十五:
==比较内存地址equals比较内容
解决方案:
==比较对象的引用equals比较对象的内容。
解决方案:
一般来说java虚拟机在运行时会有一些对象池,其中String类的对象就是池的一种,如果你有相同*内容*的String的话他回从池中取,所以地址是一样的,楼上的说过用equals是比内容的如果你非要用等好就重载他就可以了
解决方案:
引用问题
解决方案:
赞同2楼楼主!
解决方案:
这个问题很普遍要判断字符串是否相等应该用equals()"=="判断引用地址是否相等
解决方案:
路过要比较字符串要用equals()
解决方案:
内存分析下,就很容易明白了。
解决方案:
“==”地址的比较,equals内容的比较如果Stringa="abc"Stringb="abc"(a==b)内存中的A已经有了ABC所以B只要指向A的地址就可以了,所以是true其实String是一个引用变量,当用new产生一个新的对象时,就重新开辟了一个空间,所以(a==b)是false
解决方案:
对于这些常见的问题是不是要搞个置顶的帖子啊。。。。。
解决方案:
引用23楼fskjb01的回复:
对于这些常见的问题是不是要搞个置顶的帖子啊。。。。。
同感
解决方案:
6楼正解...string要多多注意.
解决方案:
引用4楼tylovemxhehe的回复:
第二个打错了,应该是classTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第三个没问题,第一个和第二个为什么会有差别啊
很明显啊,这个你不是new出来的,所以他的地址是一样的都是对栈里面的同一个的taoyu的引用(内存地址当然一样),当你new的时候,他的栈里面存储字符串的地址就不一样了!!!也就是说,“==”比较的是引用对象的存储的首地址,而equals比较的是对象的内容!!!很容易理解啊~~~~
解决方案:
有意义吗,下一两个developkits就把这问题解决了.就研究这个,始终就是做程序.做一辈子还不够,再做一辈子.
解决方案:
关于这个问题,论坛里早就有人问过,早就有人正解过,这里就不重复了,自己搜一下吧。
解决方案:
分清楚基本类型和引用类型,以及equals和“==”的区别
解决方案:
你去看看这个帖子,里面有我的回答,应该很详细了
解决方案:
new操作是在堆内存中申请一块新内存,无论字符串的内存是否相等,它们的地址都不相同,所以为falseStringa="taoyu";Stringb="taoyu";“taoyu”在堆内存中只有一份,a,b都是对它的引用。地址相同,所以结果为true另,注意:==比较的是地址,equals比较是内容。
解决方案:
路过,学习了引用6楼natalya13的回复:
JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同…
解决方案:
楼主还是去看看基础吧,这种问题书上应该说过
解决方案:
常见问题,多看帖子
解决方案:
该回复于2009-05-31 10:44:06被版主删除
解决方案:
好些人认为equals比较的是内容,==比较的是“地址”,其实这是一个很大的误解。如果你不重写equals,你会发现,它也是在比较“地址”,它的效果和==是一样的。不信,请运行以下程序:publicclassTest{privateinta=1;publicstaticvoidmain(String[]args){Testa1=newTest();Testa2=newTest();Testa3=a1;System.out.println("a1==a2的结果:"+a1==a2);//falseSystem.out.println("a1.equals(a2)的结果:"+a1.equals(a2));//也是falseSystem.out.println("a1==a3的结果:"+a1==a3);//trueSystem.out.println("a1.equals(a3)的结果:"+a1.equals(a3));//也是true}}我想说的是:如果你不重写equals方法,告诉equals方法如何比较内容(String类就是这样做的),那么equals方法和==的效果是一样的(其实==就是调用的Object的equals方法完成比较的,相关内容参见《thinkinginjava》)。
解决方案:
池里面的东东是可以重复使用的堆中的则只有NEW你没有new那是放在池中NEW了是放在堆中
解决方案:
原来你写错了,吓死我了,我以为JVM有问题呢..已经有人回答你了
解决方案:
大家就以6楼的为准吧,标准解答。
解决方案:
6楼的答案很好了..equals()比内容,"=="比地址.Stringa="abc";Stringb="abc";和Stringa=newString("abc");Stringb=newString("abc");是有区别的..前者执行的时候会在常量池里面创建"abc",后面如果非new的形式定义字符串的话,那么会直接在常量池里面去找,如果有就直接指向那个字符串,如果没有会在常量池里面新建.new就不一样了,每new一次,会为它分配自己的内从空间.所以地址是不一样的
解决方案:
有专业讲这个的帖子你可以去看看!
解决方案:
引用36楼mouyong的回复:
好些人认为equals比较的是内容,==比较的是“地址”,其实这是一个很大的误解。如果你不重写equals,你会发现,它也是在比较“地址”,它的效果和==是一样的。不信,请运行以下程序:publicclassTest{privateinta=1;publicstaticvoidmain(String[]args){Testa1=newTest();Testa2=newTest();Testa3=a1;System.out.println("a1=…
兄弟,你的理解有误System.out.println(a1);你可以试一下,看a1是什么?它其实就是一个地址,是通过继承Object类的toString()方法得到的字符串值。所以==比较的是地址。而通过equals我们比较的是同一个对象的属性值
解决方案:
初学者String还是比较复杂的
解决方案:
6楼对了。
解决方案:
mark,回去好好研究下
解决方案:
六楼正解
解决方案:
这个就是实例化和没有实例化的区别哦···········
解决方案:
引用6楼natalya13的回复:
JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa=newString("taoyu");Stringb=newString("taoyu");System.out.println(a==b);}}JavacodeclassTest{publicstaticvoidmain(String[]args){Stringa="taoyu";Stringb="taoyu";System.out.println(a==b);}}第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同…
就是这样的这样类似的帖子很多很多啊
解决方案:
Aa=newA()a这个引用值是放在栈中的,而newA()则是放在堆中的。“==”只能比较栈中值的大小,equals可以比较堆中的值
解决方案:
用==是比较的内存的地址所以永远不可能是“true”所以前两个不是很理解equle比较的是内容所以是true