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";
应该是直接指向已有的内存地址吧?
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";
应该是直接指向已有的内存地址吧?
而且并不是以abc开头的字符串就都存在同一段内存里。应该是一个对象,对应一个空间才对其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西,那些是C程序员要考虑的问题
楼上说的有道理。
==和equals的区别是
==是指两个对象是否指向同一个内存地址
equals是指两个对象地址中是否存拉相同的内容。
但是String对象有不同。
String s1="abc ";这样定义的是先放在字符串常量池中。如果有相同的就不在常量池中开辟空间
但是s1+=s2已经不是常量池拉,它是两个对象相加产生第三个对象拉
而在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,因为他们的内
容相同,都为空。
s1+=s2;只是把s2的内容加到s1、使s1里的内容和s3一样
==是比较内存空间、s1和s3是二个不同的内存空间、所以打印Not Same
如果用equals就只比较里面的内容了
而s3=s1、是将s1的内存空间指向s3、s1和s3就指向同一个地方
不管用==或equals结果就一样了
明白啦!!!
谢谢 大家的支持!
结帖!
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类