日期:2014-05-20  浏览次数:20934 次

"= ="和equals方法究竟有什么区别?
public   class   StringEquals{
public   static   void   main(String[]   args){
String   s1= "abc   ";
String   s2= "ddd ";
String   s3= "abc   ddd ";
**************************
s1+=s2;

if(s1==s3){
System.out.println( "Same ");
}else{
System.out.println( "Not   Same ");
}
***************************
s3=s1;

if(s1==s3){
System.out.println( "Same ");
}else{
System.out.println( "Not   Same ");
}
}
}
求高手给解释一下星号之间的为什么打印的是   Not   Same?
s1+=s2;开辟了新的内存空间吗?
不是说只有new的时候才开辟新的内存空间吗?
这样的处理不是先在内存中找是否有相应的内存吗?如果有匹配的就直接指向,没有的时候才开辟新的内存空间。
这里上面已经有   String   s3= "abc   ddd ";
应该是直接指向已有的内存地址吧?


------解决方案--------------------
你初始化之后的s1跟s3肯定不是一个内存空间,那么s1+s2之后,生成了个新的字符串,又存到了s1中,应该会分配新的空间,因为s1原来的空间可能会溢出,招致后面的数据丢失。
而且并不是以abc开头的字符串就都存在同一段内存里。应该是一个对象,对应一个空间才对

其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西,那些是C程序员要考虑的问题
------解决方案--------------------
UP
------解决方案--------------------
具体的说,==就是判断这两个相比较的是不是对同一个对的象引用(指针).而equal是看它们引用的对象是不是相同.两者是不一样的.
------解决方案--------------------
其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西
楼上说的有道理。
==和equals的区别是
==是指两个对象是否指向同一个内存地址
equals是指两个对象地址中是否存拉相同的内容。


但是String对象有不同。
String s1= "abc ";这样定义的是先放在字符串常量池中。如果有相同的就不在常量池中开辟空间
但是s1+=s2已经不是常量池拉,它是两个对象相加产生第三个对象拉

------解决方案--------------------
不要管那么多了 ,只要是对象都用equals 8种类型就用==
------解决方案--------------------
期待一个解释.....
------解决方案--------------------
当然开辟了新空间,而且指向了新空间
------解决方案--------------------
你可以让他们一样,也可以让他们不一样,关键是看你的类的equals方法是怎么实现的。
------解决方案--------------------
学习
------解决方案--------------------
Java里面,类的对象都是用句柄来访问的,就像C里面的指针。
而在Java里面有两个比较相等的方法一个是用“==”,另一个是String
里面的equals()方法,两个的区别是,前者比较的是地址,后者比较的
是内容。

例如你写了这样的一个语句
String str1,str2;
那就是定义了两个指向不同String实例的句柄,现在他们都是指向null
的所以str1==str2==null,此时你不能用length()方法,因为,他们
都没有指向具体的对象,如果调用这个方法的话,会返回一个
NullPointerException

之后,如果你写了这样的语句
str1=new String();
那么str1将指向一个具体的String实例,所以str1!=str2,str1!=null

而且更重要的是str1!= " ",因为 " "与str1所指的是两个不同的地址。
但方法str1.length()的返回值就是0了,也就是字符串为空。

同样即使你再这样写
str2=new String();
这个时候依然是str1!=str2,因为他们指向的是两个不同的地址,
但如果你用str1.equals(str2)的话,返回值就是true,因为他们的内
容相同,都为空。
------解决方案--------------------
开始妳就创建了3个内存空间s1、s2、s3
s1+=s2;只是把s2的内容加到s1、使s1里的内容和s3一样
==是比较内存空间、s1和s3是二个不同的内存空间、所以打印Not Same
如果用equals就只比较里面的内容了
而s3=s1、是将s1的内存空间指向s3、s1和s3就指向同一个地方
不管用==或equals结果就一样了
------解决方案--------------------

楼上解释的非常明白了,可以当个讲师了。

楼主还有疑问吗?
------解决方案--------------------
我说的是java_12345()