String a = "hello6";
String b = "hello"+6;
String c = "hello"+a.length();
System.out.println("a==b:"+(a==b));
System.out.println("b==c:"+(b==c));
System.out.println("a==c:"+(a==c));
-----------------------------------
输出结果为:
a==b:true
b==c:false
a==c:false*******************************************
关键是这个:a==b:true
为什么呢?

解决方案 »

  1.   

    关于String类的话题永远不断啊。
      

  2.   

    1#说的没错,永远扯不完啊。你就住,Java在编译的时候对String b = "hello"+6;进行了优化,就等同于a了。更多的查看我的这篇blog吧,里面也有别人的帖子,你去看看吧:对于String的认识
      

  3.   

    因为b = "hello"+6;
    由于和"hello"是String 类型的,+号会把6也转成String;和b = "hello"+"6";其实就是一个意思了.
    也就是和b也是和hello6的引用;而以a="hello6"这种方式,hello6会存在虚拟机开辟的一块常量池中.由字符串片断连接而成的也是属于这种方式.而在常量池中相同的字符串只会有一片存储空间,所有引用都会指向它.
      

  4.   

    http://blog.csdn.net/luojihaidao/archive/2009/02/05/3863658.aspx 这个对你应该有帮助。
      

  5.   

    现在的java会在编译期进行优化,所以a==b,如果是早的jdk,就是false了
      

  6.   

    确实,对String的 话题永远不断啊·
      

  7.   

    楼主,我不是很清楚我只知道下面的情况:
                      String a = "hello6"; 
                      String b = "hello6"; 
         如果是这种情况的话,因为String 池(pool)中已经存在对象"hello6",在创建对象b的时候,先到池中检索,因为对象"hello6"已经存在,所以b直接引用"hello6"这个对象,这时候a和b引用同一个对象,所以会显示true.不好意思,只知道这么多了……
      

  8.   

    编译时被优化了,"hello"+6被当做a, 指向同一存储空间。
      

  9.   

    听说JDK1.4之前会是false。后来改进了,的却是比以前省空间了
      

  10.   

    String a = "hello6" 相当于String a = "hello"+'6';  结果a="hello6"
    String b = "hello"+6 相当于String b = "hello"+'6';  因为一个字符串或者字符加上一个数字时,这个数字会往比它高级的类型转,强转成字符或者字符串类型所以b的结果为:b="hello6"
    在System.out.println("a==b:"+(a==b)); 中表达式(a==b)是一个boolean类型所以输出的结果为 a==b:true 
      

  11.   

    的确,是编译器的优化
    字符串常量放在data segment,编译器会首先检查数据区有没有这个,如果有的话
    就会把那个引用指向那个,而不会重新new一个
    跟heap不一样的!
      

  12.   

    的确,是编译器的优化
    字符串常量放在data segment,编译器会首先检查数据区有没有这个,如果有的话
    就会把那个引用指向那个,而不会重新new一个
    跟heap不一样的!
      

  13.   

    public class TestPool {
    public static void main(String[] args) {
    String s1="abc";//创建1个对象
    String s2="abc";//创建0 个对象,累计1 个对象;
    String s3=new String("ab");//创建了2个对象,一个在堆区,一个在String常量池中!累计3 个对象;
    String s4=new String("ab");//创建 1 个对象,在堆区并且个对象指针指向String常量池中的“ab“;累计4个对象;
    System.out.println(s1==s2);//t s1和s2指向相同的地址;
    System.out.println(s1.equals(s2));//t s1和s2的内容相同;
    System.out.println(s3==s4);//f s3和s4的地址不同,指向堆区的不同地址;
    System.out.println(s3.equals(s4));//t s3和s4的值相同;
    String s5=s1+"d";//s1 是一个变量;创建2 个对象,一个是“d”在String常量池中,一个是(s1+"d")的和“abcd“当然是在堆区;累计6 个对象;
    String s6="abc"+"d";//创建1 个对象,在String常量池中 "abcd" 累计7个对象;
    String s7="abcd";//创建 0 个对象  累计 7个对象;
    System.out.println(s5==s6);//f  s5指向堆区,s6指向String常量池
    System.out.println(s6==s7);//t s6和s7都指向String常量池的相同的地址;
    System.out.println(s5==s7);//f s5指向堆区,s7指向String常量池
    }}这个可以帮帮你!!!