public class StringTest01
{
public static void main(String[] args) 
{
int i1 = 10;
int i2 = 10; Integer i3 = new Integer(10);
Integer i4 = new Integer(10);
Integer i5 = 10;
Integer i6 = 10; System.out.println("i1 == i2?" + (i1 == i2)); //true
                //在输出的情况下,系统才自动调用toString()方法;在操作引用的时候,系统不会调用toString()方法。 System.out.println("i3 == i4?" + (i3 == i4)); //false System.out.println("i1 == i3?" + (i1 == i3)); //true
               //自动拆箱 Integer i3 --> 拆箱 --> int temp System.out.println("i5 == i6?" + (i5 == i6)); //true  
               //java体制中的字符串常量区中已经存在了-128到127的常量数,所以在赋值这个范围内的常量时,自动找到对应常量的地址,而超过这个范围后,值就不会存在常量区了,而是相当于new了一个常量,也就是引用为地址 System.out.println("i1 == i6?" + (i1 == i6)); //true 
               //自动拆箱 Integer i3 --> 拆箱 --> int temp String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");

System.out.println("s1 == s2?" + (s1 == s2)); //true
System.out.println("s3 == s4?" + (s3 == s4)); //false
System.out.println("s1 == s3?" + (s1 == s3)); //false System.out.println("s3 == s4?" + s3.equals(s4));/true String s5 = "Abc";
System.out.println("s1 == s5?" + s1.equalsIgnoreCase(s5));//true
                  //不区分大小写的比较
}
}请教下 System.out.println("i3 == i4?" + (i3 == i4)); //false  这句话的输出结果为什么是false
我记得Integer()对toString()方法做了覆盖  所以返回的应该是值  值的比较为什么是不等的?
还有请高手看看我的注释对不对?

解决方案 »

  1.   

    比较的不是值,是对象的引用地址。System.out.println("s3 == s4?" + (s3 == s4)); //false就像这句一样。
      

  2.   

    lz== 比较的永远是地址   i3 == i4 // false 很正常你说的重写了toString() 在  i3.equals(i4)  的 时候才派的上   // true ---先 一下  , 明早接着想, 这题很有意思, 学习了。 嘿嘿
      

  3.   

    如果==两边的是对象,则比较的是两个对象的引用地址。equals()比较的是值,该方法可覆盖。
      

  4.   

    字符串比较用的是equals方法!用==比较的只是物理地址
      

  5.   

    System.out.println("i1 == i2?" + (i1 == i2)); 帮忙解释下这个语句,新生,谢谢
      

  6.   

    String s1 = "abc";            // 是基本数据类型;
    String s3 = new String("abc");// 不是基本数据类型;
    不知道这样理解对你有帮助不?
      

  7.   

    String s1 = "abc"; // 是基本数据类型;???????
    String 不是基本类型
      

  8.   

    其实你的注释已经写的很好了- -!  以后知道==比较的是地址就行了。通过new 出来的东西肯定地址不同!
      

  9.   

    一、“对于基本类型,==比较的是值 ”
    为什么这么讲呢,因为对象分为栈对象和堆对象。
    基本类型是栈对象,栈对象有个特点就是:多个引用所指向的内存数据就一份,即新建的变量指向原来的内存数据,并没有新创建数据。(为节省内存)
    而堆对象:new的时候就创建了一个新的内存数据拷贝。二、S3==S4为什么是false
    因为String是一种特殊的包装类
    String str = new String("abc");
    String str = "abc";
    第一种,在堆中new新对象,每new一次创建一个新对象!
    第二种,在栈中,先查找后指向,与基本数据类型一致三、toString()方法。
    可以使用“+”运算符来将两个字符串连接起来产生一个新的String对象。只要+运算符有一个运算数是字符串(String)实例时,编译器就将另一个运算数转换为它的字符串形式。这种操作是通过调用一个由String类定义的字符串转换方法valueOf()来完成的。对于简单类型,valueOf()方法返回一个字符串,该字符串包含了该类型的值的字符串。对于对象,valueOf()方法调用toString()方法。每一个类都执行toString()方法,因为它是由Object定义的。四、
    int i1 = 10;
    int i2 = 10;
    Integer i3 = new Integer(10);
    Integer i4 = new Integer(10);
    Integer i5 = 10; 
    Integer i6 = 10;
    System.out.println("i1 == i2?" + (i1 == i2)); //true   i1和i2相等,指向一个内存数据10
    System.out.println("i3 == i4?" + (i3 == i4)); //false  i3/i4指向的不同的堆内存数据
    System.out.println("i5 == i6?" + (i5 == i6)); //true   同i1/i2
    System.out.println("i1 == i6?" + (i1 == i6)); //true   栈中的有数据10.创建新的引用变量的时候,会搜索栈中是是否有10,如果有就直接指向它。所以i1==i6
    System.out.println("i1 == i3?" + (i1 == i3)); //true   ????这个有问题了。。应该是FALSE. 两个引用一个指向栈,一个指向堆,,不可能有相同地址的。
      

  10.   


    System.out.println("i1 == i3?" + (i1 == i3)); //true 能回答一下为什么是ture么??
      

  11.   

    int i1 = 10;
    Integer i3 = new Integer(10); 
    System.out.println("i1 == i3?" + (i1 == i3));
    结果是false
      

  12.   

    你们说的都不对
    和StringBuffer有关