"= ="和equals方法究竟有什么区别?

时间:2021-12-27 16:16:02
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";
应该是直接指向已有的内存地址吧?

16 个解决方案

#1


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

其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西,那些是C程序员要考虑的问题

#2


UP

#3


具体的说,==就是判断这两个相比较的是不是对同一个对的象引用(指针).而equal是看它们引用的对象是不是相同.两者是不一样的.

#4


其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西
楼上说的有道理。
==和equals的区别是
==是指两个对象是否指向同一个内存地址
equals是指两个对象地址中是否存拉相同的内容。


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

#5


不要管那么多了  ,只要是对象都用equals 8种类型就用==

#6


期待一个解释.....

#7


当然开辟了新空间,而且指向了新空间

#8


你可以让他们一样,也可以让他们不一样,关键是看你的类的equals方法是怎么实现的。

#9


学习

#10


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,因为他们的内 
容相同,都为空。

#11


开始妳就创建了3个内存空间s1、s2、s3
s1+=s2;只是把s2的内容加到s1、使s1里的内容和s3一样
==是比较内存空间、s1和s3是二个不同的内存空间、所以打印Not Same
如果用equals就只比较里面的内容了
而s3=s1、是将s1的内存空间指向s3、s1和s3就指向同一个地方
不管用==或equals结果就一样了

#12



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

楼主还有疑问吗?

#13


我说的是java_12345()

#14


String s3="abc ddd";这是在常量池中,也就是栈内存。而s1+=s2,java虚拟机会先new一个StringBuffer 再append 最后调用toString() 也就是new了一个String,所有s1+=s2在堆内存中。s1,s3指向的不是同一块内存

#15


zzwh_0() 明白我的意思了
明白啦!!!
谢谢 大家的支持!
结帖!

#16


== 是判断是否是同一个对象,或者值是否相等
equals 要分情况的
对于外覆类equals判断的是值是否相等
对于普通类来说是判断是否是同一个对象

附一个程序大家看下就明白了:

class eq {
  public static void main(String args[]) {
    Integer n1=new Integer(47);
    Integer n2=new Integer(94);
    System.out.println(n1==n2);
    System.out.println(n1!=n2);
    System.out.println(n1.equals(n2));
  }
}

ps:外覆类是数据类型的包装类,如Integer类

#1


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

其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西,那些是C程序员要考虑的问题

#2


UP

#3


具体的说,==就是判断这两个相比较的是不是对同一个对的象引用(指针).而equal是看它们引用的对象是不是相同.两者是不一样的.

#4


其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西
楼上说的有道理。
==和equals的区别是
==是指两个对象是否指向同一个内存地址
equals是指两个对象地址中是否存拉相同的内容。


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

#5


不要管那么多了  ,只要是对象都用equals 8种类型就用==

#6


期待一个解释.....

#7


当然开辟了新空间,而且指向了新空间

#8


你可以让他们一样,也可以让他们不一样,关键是看你的类的equals方法是怎么实现的。

#9


学习

#10


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,因为他们的内 
容相同,都为空。

#11


开始妳就创建了3个内存空间s1、s2、s3
s1+=s2;只是把s2的内容加到s1、使s1里的内容和s3一样
==是比较内存空间、s1和s3是二个不同的内存空间、所以打印Not Same
如果用equals就只比较里面的内容了
而s3=s1、是将s1的内存空间指向s3、s1和s3就指向同一个地方
不管用==或equals结果就一样了

#12



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

楼主还有疑问吗?

#13


我说的是java_12345()

#14


String s3="abc ddd";这是在常量池中,也就是栈内存。而s1+=s2,java虚拟机会先new一个StringBuffer 再append 最后调用toString() 也就是new了一个String,所有s1+=s2在堆内存中。s1,s3指向的不是同一块内存

#15


zzwh_0() 明白我的意思了
明白啦!!!
谢谢 大家的支持!
结帖!

#16


== 是判断是否是同一个对象,或者值是否相等
equals 要分情况的
对于外覆类equals判断的是值是否相等
对于普通类来说是判断是否是同一个对象

附一个程序大家看下就明白了:

class eq {
  public static void main(String args[]) {
    Integer n1=new Integer(47);
    Integer n2=new Integer(94);
    System.out.println(n1==n2);
    System.out.println(n1!=n2);
    System.out.println(n1.equals(n2));
  }
}

ps:外覆类是数据类型的包装类,如Integer类