String a = new String("123");
第一种说法是:用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。第二种说法是:指向常量池(constant pool)里"123"。哪个是正确的,求解答啊。java

解决方案 »

  1.   

    第一种
    很简单做个比较就行了
    String s1="123";
    String s2="123";
    String s3=new String("123");
    System.out.pritnln(s1==s2)://true
    System.out.pritnln(s3==s2)://false
    至于具体原理,详见。
    http://blog.csdn.net/java2000_net/article/details/3681385
      

  2.   

    可以用equels 比较量是否一样
      

  3.   

    举个例子吧
    String s1="adcdf";
    String s1=new String("abcdf");
    这个两者是有很大的不同,前者是java很特殊的对象获取的方式;通常是被放在常量池中,当被创建这个"adcdf"
    对象时就被保存在常量池中了,当下次有其它变量的对象都是"adcdf"都可以用,而new创建的时候被放在堆
      

  4.   

    这个前几天刚好看了下,解释如下://这个是创建在字符串缓冲池中的,供其他引用使用,地址相同。
    String str = "abc";
    String str1 = "abc"+"de";//等同于str1 = "abcde",也是创建在缓冲池中的。//如下则是创建在缓冲池外,但是同时也会在缓冲池内创建相同对象供其他引用使用。
    String str2 = new String("abcdef");//这句话创建了两个对象,一个是缓冲池外的堆内存中,同时在缓冲
                                       //池内也创建了相同对象。str2此时指向的是堆内存中的对象。//总结:new出来的字符串肯定是在缓冲池外的也就是在堆内存中,地址各不相同,缓冲池内的对象则具备唯
    // 一性,引用变量指向的都是同一个对象。