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";
应该是直接指向已有的内存地址吧?

解决方案 »

  1.   

    你初始化之后的s1跟s3肯定不是一个内存空间,那么s1+s2之后,生成了个新的字符串,又存到了s1中,应该会分配新的空间,因为s1原来的空间可能会溢出,招致后面的数据丢失。
    而且并不是以abc开头的字符串就都存在同一段内存里。应该是一个对象,对应一个空间才对其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西,那些是C程序员要考虑的问题
      

  2.   

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

  3.   

    其实你想这么多也没什么用,鄙人觉得java编程并不应该考虑太多底层存储的东西
    楼上说的有道理。
    ==和equals的区别是
    ==是指两个对象是否指向同一个内存地址
    equals是指两个对象地址中是否存拉相同的内容。
    但是String对象有不同。
    String s1="abc ";这样定义的是先放在字符串常量池中。如果有相同的就不在常量池中开辟空间
    但是s1+=s2已经不是常量池拉,它是两个对象相加产生第三个对象拉
      

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

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

  10.   

    == 是判断是否是同一个对象,或者值是否相等
    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类