我也来说说自己的认识把。在java中内存分为 “栈”和“堆”(Stack and Heap) 基本数据类型存储在 "栈"中
对象引用类型实际存储在 "堆"中,在“栈”中只是保留引用内存的地址值,就好像知道你家门牌号码就可以找到你家。在Java中利用"=="比较变量时候,系统使用变量在stack(栈)中所存的值来作为对比的依据,基本数据类型(int float double boolean)在stack中所存的值就是其內容值,而引用类型在stack中所存放的值是本身所指向Heap中对象的地址值,而不是原先所設定的值。Java.lang包中的Object类有public boolean equals (Object obj)方法。它比较两个对象是否相等。仅当被比较的两个引用指向同一对象时,对象的equals()方法返回true。
==运算符也进行等值比较。也就是说,对于任何引用值X和Y,当且仅当X和Y指向同一对象时, X==Y返回真。
当两个分离的对象的内容和类型相配的话,String,Date,File类和所有其它override equals()的包装类(Integer,Double,等等)将返回真。
例如,String类中的equals()方法返回true,当且仅当参数不为null并且是一个String对象,该对象与调用该方法的String对象具有相同的字符顺序。
String s1=new String(“JDK1.2”);
String s2=new String(“JDK1.2”);
方法s1.equals(s2)返回真,尽管s1和s2指向两个不同的对象。方法是可以被重载的,按照java语言的本意来说:如果没有重写(override)
新类的equals(),则该方法和 == 操作符一样在两个变量指向同一对象时返回真,
但是java推荐的是使用equals()方法来判断两个对象的内容是否一样.也就是说一般的类的比较使用override的equals()比较的是Heap而不是stack中的内容

解决方案 »

  1.   

    引用应该放在stack里吧
    n3和n4当然相等呀,他们都是指向null对象呀
      

  2.   

    public class Try
    {
    public static void main( String[] args )
    {
    /* Integer n1 = new Integer( 47 );
    Integer n2 = new Integer( 47 );
    Integer n3 = null;
    Integer n4 = null;
    */

        int n1=47;
        int n2=47;
    int n3=0;
    int n4=1;

    /* System.out.println(n1);
    System.out.println(n2);
    System.out.println(n3);
    System.out.println(n4);
    */

    System.out.println( n1 == n2 );
    System.out.println( n3 == n4 ); }
    }
    请执行这个程序,你就会得到截然相反的答案。
    这说明以int定义的是变量,用"=="得到的是二者的值是否相等;
    用Integer定义的是对象,用"=="是判断两个对象的值和址是否相等;用equals判断二者的值是否相等,请看下面的:
    public class Try
    {
    public static void main( String[] args )
    {
    Integer n1 = new Integer( 47 );
    Integer n2 = new Integer( 47 );
    Integer n3 = null;
    Integer n4 = null;

    /*
        int n1=47;
        int n2=47;
    int n3=0;
    int n4=1;
    */
    /* System.out.println(n1);
    System.out.println(n2);
    System.out.println(n3);
    System.out.println(n4);
    */

    System.out.println( n1 == n2 );
    System.out.println( n3 == n4 );
    System.out.println(n1.equals(n2));
    System.out.println(n3.equals(n4));
    }
    }
      

  3.   

    执行到最后一句出现System.out.println(n3.equals(n4));
    会抛出异常,是因为对象n3和n4初始化为null,系统还没给这两个对象分配地址呢
    这下你明白了吧