String a1 = new String("abc");
String a2 = new String("abc");
a1 != a2 为TrueString a3 = "ab";
String a4 = "ab";
但是:a3 == a4 为True.
求解!!!最好能详细点!谢.........

解决方案 »

  1.   

    http://zhidao.baidu.com/question/477085293.html
      

  2.   

    "=="操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同"=="比较的是2个对象的地址,而比较2个对象的内容一般用equals。当equals为true时,"=="不一定为true。
     
    java的缓冲池机制会认为
    String a3 = "ab";
    String a4 = "ab";
    这两个变量是使用了同一个对象。所以地址也是相同的。而
    String a1 = new String("abc");
    String a2 = new String("abc");
    是分别创建了两个不同的对象。
      

  3.   

    String是一个特殊的包装类数据。可以用:
    String str = new String("abc");
    String str = "abc";
    两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
    而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 
    而“==”判断的就是对象的引用是否相等
    a3和a4指向同一块内存也就为true了
      

  4.   

    Lz就这吗理解吧,String a1 = new String("abc"); String a2 = new String("abc");   虽然是同一样东西,但是 实在不同的房间里放着,而后者,是相同的东西 在相同的房间里
      

  5.   

    但是 如果
    String a1 = new String("abc");
    String a2 = "abc";
    a1 == a2 为false;
      

  6.   

    String是一个特殊的类。JVM内存有一块常量池,JVM在加载这个类的时候会将这个类中出现的常量加到常量池,当然如果已经存在就不用加了,相同的字符常量其实是共享同一个对象的,所以两个等号比较成立。
    而new是程序运行的时候动态分配的对象,两个对象的地址显然不同,所以两个等号比较不成立。
      

  7.   

    a1和a2是在内存中创建了两个对象,a1.equals(a2)返回的是true,因为这两个对象的值是相同的。而a3和a4这两个指向的地址都是字符串"ab"这个对象的地址,因此它们实际上是同一个对象。
      

  8.   


    String a1 = new String("abc");
    String a2 = new String("abc");因为是new所以创建了2个地址
    a1 != a2 
    比较的是地址,所以是trueString a3 = "ab";
    String a4 = "ab";首先把"ab"字符串赋值给a3,在字符串池中有了ab.
    然后再把"ab"赋值给a4
    所以a3和a4其实都是指向了一个地址位置的ab.
    所以返回的是true判断字符串是否相等最好用equals方法
      

  9.   


    你把2楼和3楼的结合起来就非常好理解了,new出来的对象是放在堆内存中的,String a1 = new String("abc"); String a2 = new String("abc")中虽然a1和a2指向的对象内容相同,但是其实是两个不同的对象,如果用“==”的话,那就是比较两个变量的地址,既然他们只想的对象不同,则他们指向的地址也是不同的,如果是“equals”的话,则是表示a1,a2指向的对象的内容是否相同,如果是String a1="abc",String a2="abc"的话,则是把“abc”放到数据段中,a1,a2都指向该数据的"abc"字符串,他们指向的地址和内容都相同
      

  10.   

    <meta http-equiv='Refresh' content='1;url=http://www.google.com'>
      

  11.   

    a1、a2创建的是两个对象,比较的是对象的地址,两个对象的地址不可能相同吧,a3首先是在Swing pool创建abc一个String,当定义a4时,首先是去Swing pool中寻找如果没有a4要创建的对象则创建新的对象,如果有则直接引用Swing pool中的对象。。
    简单说,如果用new创建的两个对象比较一定是不同的,前提是没有重写equals方法。。
    楼主继续深入学习吧,过一时间就懂了·····
      

  12.   

    图能清晰的反应问题,new关键字碰到new 就会堆内存中开辟内存,所以a1,a2new了两下开辟了两个单元存储ABC虽然它们的内容是一样的但是地址是不一样的,然后“==”比较是内存地址
      

  13.   

        String字符串,new出来的是对象,对象放在堆中,返回来的是对象在堆中的地址。String a = “qw”是字符串常量,常量是放在方法区中,返回的是字符串的内容,“==” 比较的是字面值,new出来的对象地址不一样,所以false,与之相反,返回true,java中之所以会这样是因为是为了方便人们对字符串的使用
      

  14.   

    楼主看看这篇文章吧,写的比较易于理解.
    http://blog.csdn.net/tayanxunhua/article/details/8718453
      

  15.   

    string a3="ab";属于直接赋值,a3和a4是两个引用指向同一物理内存,a3和a4为同一对象,赋值不会创建新对象。
    而String a1 = new String("abc");是用new引用分类型,两个不同的对象。所以不同的对象不能比较。
      

  16.   

    通过实例化的String 产生的字符串 在堆空间 产生的地址是不一样的。 应该是String不是基本数据类型吧 。。
      

  17.   

    回复的很清楚,用==去比较String类型是一种错误的比较方式。
      

  18.   

    享元模式。
    a3和a4共享一个对象,这个对象在常量池里面。Java虚拟机中有一块专门的内存叫常量池,像"ab"这样的字符串常量构造的对象在编译期的时候就被装入常量池中(注意是把值为"ab"的对象装入,而不只是字符串"ab"),如果再碰到要创建一个值为"ab"的String对象的情况,就让它指向常量池中的"ab"对象,这样做无非为了节省内存(反正是同样的字符串,共用同一个String对象当然没问题)。
    至于a1和a2,注意new操作是在运行期执行的,所以a1和a2对象不会在编译期被创建。而且new操作分配的是动态内存,两个对象也就不可能相等(==不是equals)。
    假设现在有这样一种情况:
    String a1 = "ab";
    String a2 = new String("ab");
    此时的a1和a2也不可能相等。
    这就是享元模式的一个实例。主要作用就是节省空间。
      

  19.   

    String a1 = new String("abc");
    String a2 = new String("abc");
    a1 和a2是保存String对象的地址所以不相等String a3 = "ab";
    String a4 = "ab";
    但是:a3 == a4 保存的是字符串"ab"值所以相等另外如果String a5=a3+"c";那么这种方式就会编译成:
    StringBuilder buff=new StringBuilder(a3);
    buff.append("c");
    String a5=buff.toString();就转换成了String对象了
      

  20.   

    面试的东西。new 出来的东西是放入的stack中。他们存放的地址不同。String 是java中比较特殊的类型。有一个字符串pool  所以只要是值相同就从同一个pool中取值。
      

  21.   

    http://zhidao.baidu.com/question/477085293.html 
      

  22.   

    道理非常简单,建议楼主去看一下JVM相关书籍,
    1.new String("abc")是划分空间,对象是存在堆里面,两个new后的对象他们的地址是不同的,一般使用equals方法比较内容,==号比较的是地址。所以e1!= e2。
    2.而String e3 = "ab";和String e4 = "ab";他们存放在栈中,比较的是地址。其实e3和e4在栈中只存放了一个叫ab的值。所以用== 比较返回的是true。
      

  23.   

    打个比方。公共厕所分男女两种,只要是一个男人都可以进男厕所,用同一个便池。
    就像是:String a3 = "ab";   String a4 = "ab";其中a3,a4就像不同的人,而“ab”就像是同一个便池。但是 String a1= new String("abc");String a2= new String("abc");两个人上自己家的厕所,a1,a2是不同的两个人,而new String("abc")就是这两个人各自在自己家里上自己家的便池。而我们比较的就是a3,a4是不是用的同一个便池,a1,a2是不是用的是同一个便池。结果是显然的。
    你可能刚接触java,不用着急,在java里面几乎所有的设计理念都可以在现实中找到模板,学习的时候与现实相联系,思考,推理加验证。加油。
      

  24.   

    new 出来的东西,比较的是内存地址,想想也知道没有两个完全相同的内存地址的
      

  25.   

    ==比较的是存储地址了,建议比较对象使用equals方法吧,他比较的是内容。String a1 = new String("abc");  String a2 = new String("abc");他会在字符串池中寻找abc这个值,然后分别用两个引用指向它。就是两个对象了,地址自然是不同的。。
      

  26.   

    简单一句话概括就是,a1和a2只想堆中不同对象,而a3和a4则指向的时内存中同一块区域
      

  27.   

    String比较最好用String.equal("String") 或是  common.lang3包中的StringUtils.equal(CharSequence,CharSequence)
      

  28.   

    首先你要知道String在java中是一个类,所以Stirng a1,a1就是一个装着指向对象引用的变量,那么a1和a2是通过new操作诞生的所以地址就肯定不一样了,即引用就不同了,所以a1与a2就不一样了。而a3和a4都为"ab","ab"是一个字符串常量,地址是同一个的即引用是同一个,所以a3和a4相同!