java中的两种数据类型基本类型和对象,那么int和Integer的区别就是这样呗,int和Integer
的引用是存储在堆栈区的,Integer的数据是放在堆区的。==运用与对象是是比较了两个对象的引用地址是不是一样,如果两个引用是指向同一个对象的话就是为true
equals()比较则要看具体类是怎样实现的,根据具体情况而不同,Object中的equals是
spublic final boolean equals(Object obj) {
            return (this == obj);
        }
这是不是说明如果子类不覆盖它的话就与==号的效果一样呢??那么对基本类型的包装类就出现了问题:
问题如下:
============================================================
《1》
Integer inta=new Integer(4),intb=4;  
System.out.println(“”+inta==intb);//true,为什么(1)?难道它们不是对象的引用吗??
System.out.println(""+inta.equals(intb));//true
/* 当然这里是正确的因为Integer覆盖了object中的equals,判断整数的值是否相等
*/
=======================================================================
《2》
Character ch1='a',ch2='a';
System.out.println("ch1==ch2:"+(ch1==ch2));//true,(2)这里和上面一样的疑问??
System.out.println(""+ch1.equals(ch2));//true
/*为什么为true呢?Character中的equal是这样的
spublic final boolean equals(Object obj) {
            return (this == obj);
        }
这个和Object是一样的判断的是对象的引用是否相等(等价于判断是否引自同一个对象)
下面更怪了:
*/
Character ch3=new Character('a');
System.out.println(""+ch1.equals(ch3));//true,(3)??难道因为它们的值一样就为true;==================================================================================《3》
String str1="abc",str2="abc",str3="d";
str4=str1;
System.out.println(str1==str2);//true (4) ??
System.out.println(str1==str3);//false
System.out.println(str1.equals(str2));//true  (5)??
System.out.println(str1.equals(str4));//true
/*查看jdk发现string的equals如下:
   public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
这里是不是和(5)输出的矛盾呢??
*/
===================================================================
   我在论坛上曾看见,有人说:string串只要它们里面的字符是一样的话它的对象引用就是
一样的,如果这样的话上面String的问题就等到了很好的解释了,我想最好事实也是这样的。
    如果这种说法同样运用于Integer和character上的话,那么它们的上面的问题也一样可以解
决了,问问大家是不是这样的呢???
如果不是的话那么为什么会出现上面5个问题的?小弟初学如果上面提的问题有不正确的请大侠这指正。[/size][/size][/size]

解决方案 »

  1.   

    1、System.out.println(“”+inta==intb);//true,为什么(1)?难道它们不是对象的引用吗??
    java 中对于小于128的整数进行了内存优化,他们都指向了同一个整数值4public class Test {
        public static void main(String[] args) {
            Integer aInteger = 59595, bInteger = 59595;
            System.out.println("" + (aInteger == bInteger));
        }
    }上面的换了一个大的数字,结果就为false了
      

  2.   

    2、System.out.println("ch1==ch2:"+(ch1==ch2));//true,(2)这里和上面一样的疑问?? 
    这个和上面的一样的解释,Character 的取值是可与整数值相互转换的public class Test {
        public static void main(String[] args) {
            Character ch1 = 128, ch2 = 128;
            System.out.println("" + (ch1 == ch2));
        }
    }如果这样结果就为false了
      

  3.   

    是不是你的jdk有问题啊,我用的是jdk1.6的 在运行Integer inta=new Integer(4),intb=4;  
    System.out.println(“”+inta==intb);的时候是false
      

  4.   

    //谁说字符串相同就==   ????
         //只限于常量,String a ="a"会先到字符串常量池里寻找"a",没有找到,new一个;
         //string b = "a" 到常量池找到一个"a",直接引用
         //String c = new ("a");直接new一个,不管有没有,所以false
    String a ="a";
    String b = "a";
    String c = new String("a");
    System.out.println(a==b);//true
    System.out.println(a==c);//false

    Integer i = new Integer(4);
    Integer m = 4;
    Integer n = 4;
    System.out.println(i==m);//false
    System.out.println(n==m);//true
      

  5.   

    有人说:string串只要它们里面的字符是一样的话它的对象引用就是一样的不完全是,下面的结果可以验证public class Test {
        public static void main(String[] args) {
            String string1 = "abc";
            String string2 = "abc";
            String string3 = "d";        System.out.println((string1 + string3).equals(string1 + "d"));
            System.out.println((string1 + string3) == (string1 + "d"));        System.out.println((string1 + "d").equals(string2 + "d"));
            System.out.println((string1 + "d") == (string2 + "d"));    }
    }
    /*查看jdk发现string的equals如下: 
      public boolean equals(Object anObject) { 
    if (this == anObject) { 
        return true; 
    这个API也不是这样的,jdk里的源码为public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }
      

  6.   

    我也是新手,简单点记嘛:基本类型可以用“==”判断内容是否相等,如果是String和其他高级点的对象呀什么的,就用equals判断是否相等!!
      

  7.   

    那要看那个类中有没有重载equals和==
      

  8.   

    同意三楼的说法,JDK1。6的新特性,将常用的放到缓存中,提高效率。
      

  9.   

    学习一下,看看这段代码:public class TryString {
    public static void main(String[]args){
    String s1="JavaSE6.0";
    String s2="JavaSE6.0";
    String s3=new String("JavaSE6.0");
    if(s1==s2)
    System.out.println("字符串s1与s2通过等于测试,结果返回true");

    else System.out.println("字符串s1与s2没有通过等于测试,结果返回false");
    if(s1==s3)
    System.out.println("字符串s1与s3通过等于测试,结果返回true");

    else System.out.println("字符串s1与s3没有通过等于测试,结果返回false");
    if(s1.equals(s3))
    System.out.println("字符串s1与s3內容相同,结果返回true");

    else System.out.println("字符串s1与s3內容不同,结果返回false");
    }}