String s0 = "abc";
String s1 = "abc";
String s2 = new String("c");
String s3 = new String("c"); System.out.println(s0==s1);
System.out.println(s2==s3);
运行结果是:
            true
            flase谁能解释一下原因?

解决方案 »

  1.   

    true  是同一个对象
    false 是两个不同的对象
      

  2.   

    new和没new的区别。没new对比句柄指向的内存,new了对比存储对象本身的地址,而不是他属性的值地址。
      

  3.   

    s0,s1指向的是存储常量的地址,s2,s3是两个对象地地址,new的时候编译器分配了不同的地址给他们
      

  4.   

    java中的字符串比较"=="判断是否指的是同一对象,因此你的结果出现上面的结果,同常情况下字符串比较用的是equals()方法,它才是比较内容是否相同!
      

  5.   

    论坛里问这样问题的很多,每隔一断时间就有几个来问的,其实自己在google下搜会搜到很多讲解,在论坛里也能找到之前问问题的帖子。程序这东西,自己找些资料来看会收获很多,不一定遇到问题就马上问的。这种基础问题,希望大家自己动动手,马上就知道为什么。
      

  6.   

    String有个共享池,s0和s1指向的是同一地址,s2和s3使用new,是两个不同的对象,地址不一样。
      

  7.   

    String s0 = "abc"; String s1 = "abc";
    在字符串中,"abc"是字面值,java虚拟机处理机制中,会将其放在字符缓冲池中,对于引用指向时候,只要字符缓冲池中有"abc",直接引用对象,不会再创建对象"abc",所有s0,s1指向同一个对象,所以不管是==或者equals()结果都会返回true.
    String s2 = new String("c");
    String s3 = new String("c");对于这只要new一次就对在堆中创建一个String对象,值是c
    所以是两个对象,==地址 equal是内容比较,所以返回的false
      

  8.   

    String s0 = "abc";
    String s1 = "abc";
    同时指向的是常量池中的地址
    String   s2   =   new   String( "c "); 
    String   s3   =   new   String( "c "); 
    是在堆内存分配的两个对像
      

  9.   

    建议楼主先静下心来认真阅读Java基础关于String的介绍,书上肯定有这个问题的解释!或者找一些关于Java内存分析的资料自己看一看!
    简单解释一下吧,在Java中,只有我们new一个对象时才会在内在中开辟新的空间。“==”测试的是左右两边的对象是不是同一个对象,对于s0和s1,因为我们没有new,所以它们都指向了"abc"这个对象,所以打印出来就是true。而s2和s3,由于两个变量所指的对象都是new出来的,所以虽然它们的内容相同,但是两个对象对应的内在中的地址是不同的。如果想要比较它们的内容,请使用String对象的equals方法。System.out.println(s2.equals(s3))打印出来的结果就是true了。
      

  10.   

    看马士兵的视频讲过,前两个是指向常量区域,new是指向不同的对象,比较的是他们的地址吧,所以不一样。。嘿嘿
      

  11.   

    简单地说:这关涉到JAVA的内存分配上的问题
    String s0 = "abc";
     String s1 = "abc";
     String s2 = new String("c");
     String s3 = new String("c");
    在JAVA或其他语言中,会将字符串常量分配到一个叫做全局静态的内存区域。
    假设 “abc”的分配到的地址为:0x1234
    则 s0跟s1都是指向这个地址的,java不会对两个相同的字符串常量分配不同的地址空间;
    而 String s2 = new String("c");
     String s3 = new String("c");
    这2个是通过new操作符在堆中分配一块空间来存储字符串。每new一次都会返回一个新的空闲的对空间的首地址回来。
    因此可以知道s2跟s3指向了不同的地址空间。
    故:s0==s1 -----》true;
       s2==s3------>>false;(注:==在这里只是判断引用的地址是否相同,而不是字符串的内容)
    如果这样判断:s2.equals(s3)  -----> true;
      

  12.   

    总结:
    1、首先要明白:这里的“==”不是判断值的大小的,是判断是否是同一个对象。
    2、其次:
    String s0 = "abc";//在内存中开辟一个空间(我们称在为A空间),这是s0指的就是A空间里的对象。
    String s1 = "abc";//上面的“abc”静态字符串常量,常量明白吧,因为前面已经有了这个常量“abc”所以s1也指向A空间。所以s0和s1是指的同一个对象哦~String s2 = new String("c");
    String s3 = new String("c");//new 的话,每次都新制造一个String对象,每次都分配一个新的空间,所以
    s2分配了一个新的空间B来存放“c”这个值,s3也被分配了一个新的空间C,用来存放“c”这个值。s2和s3指向不同的空间,但存储的值是一样的。有点像C++里面的指针后引用了,哈哈~
    这下应该明白了吧~
      

  13.   

    new是要重新开辟堆内容空间的,直接赋值会在堆内存空间查找是否存在同样的值,如果不存在才开辟内存空间
      

  14.   

    第一个是ture 因为:String s0,String s1 创建的结果指向字符串缓冲区,相同的字符串在缓冲区内只会创建一次
    第二个是false 因为:通过new关键字 在堆内存内创建了2个不同地址值,不同指向的对象详细解释,去我的博客:
    http://blog.csdn.net/ding_gs/article/details/7578571
     还不明白,可以给我留言,我们讨论
      

  15.   

    多看点java基础的书就能明白了!
      

  16.   

    new String是利用String类的构造方法创建新的字符串对象
      

  17.   

    1.s0和s1没有用new,都是去字符串缓冲池找"abc",两个引用指向的是同一个对象,所以是true。
    2.s2和s3都是用new的,都会在堆内存中创建一个新的对象,两个引用指向的是不同的对象,所以是false。
      

  18.   

    因为s0和s1实在方法区里的,而在方法区里的东西是共享的,所以内容相等,就返回true了;
    而s2和s3是分别new出来的,在堆中,两个对象分别指向不同的东西,地址不同所以返回false了。
      

  19.   

    java中有个字符串静态池,Eclipse中String类型的字面量和常量会在编译时尽量优化,当两个量一致时,他们会指向同一个对象,不会生成新对象,所以s0和s1用的是同一个引用地址,而new的话是生成新对象,每new一个,生成的引用地址都是不同的,而==在String中比较的是地址引用,所以s0 和s1的比较返回的是true 而s2和 s3比较返回的是false