int a = 1;
Integer b = new Integer(1);
System.out.println(a==b);
结果为什么是true
但是
String c = "abc";
String d = new String("abc");
System.out.println(c == d);
结果就是false了?
请说一下具体的原因

解决方案 »

  1.   

    String c = "abc";
    String d = new String("abc");
    System.out.println(c == d);
    结果就是false了?
    c 为常量池中的,而d为堆中的地址
      

  2.   

    整数的那部分是因为自动拆箱的原因,
    Integer b = new Integer(1);
    这样就拆箱为了Integer b=1;
    a==b 就是比较的数值了 而不是对象了 
    而字符串那个就不是了 他比较的是两个对象是否相等 你new 了两个对象 那么肯定不是相等的了
    String c = "abc";
    String d = new String("abc");
    c 和 d的引用指向了不同的对象 也就是内存地址不是一样的。
    如果是equals方法的话就是相等的了,用为String类覆写了Object类中的equals方法
    我是个新手 ,,理性采纳哈。。可能有说的不对的地方。
      

  3.   

    ==在java中的作用是比较,比较的是左右两个操作数的“直接值”,所谓直接值,对基本类型而言就是其值本身,比如int a = 1,就是1;对引用类型而言,就相当于“内存地址”,引用对象内部所包含的内容(比如String的字符串)不是它所关心的。Integer对象有在一定范围内自动拆箱概念,为什么会自动拆箱,可能认为这类数值型对象更多的使用价值是其数值内容,而非对象地址,为更实际方便使用。String对象有intern(internalize)概念,是为了节省空间,同样内容的String对象只需一个内存实例即可,防止堆中出现过多相同内容的String对象造成使用上的浪费。String c = "abc"; 这样定义是liternal string,天生就是interned的。
      

  4.   

    int 与 Integer 比较, Integer有一个自动拆箱的过程,把对象转成数值,再比较数值,所以他们就相等了String 与  new String。 首先要明白 new String 会产生两个对象,一个是在堆中,一个是在栈,返回的是堆指向的地址。 而直接使用 String str = "value"; 返回的是栈地址, 它们肯定不是相等的
      

  5.   

    拆箱,装箱操作Integer是比较数值相等
    String是比较地址值类型和引用类型的区别