我面试的时候,考了这样一个问题 : 为什么int型的数据可以用==判断是否相等   
我查了一下 : == 比较的是内存中的地址,比较的是对象的句柄;
              equals()比较的是地址内的内容,比较的是对象.
但是我不知道关于int型的应该怎么理解。
麻烦各位给俺详细的讲解一下。还有  equals()比较的是对象  这句话我也不太理解

解决方案 »

  1.   

    int 是基本数据类型 不可能有 equals()方法.
      

  2.   

    equals()比较的是对象  这句话我也不太理解
    简单理解.
    String s =new String("aaa");
    String s2 =new String("aaa");s==s2 : false;
    s.equals(s2) : true; 这就是它们的区别.
      

  3.   

    java中有基本数据类型和对象之分,对于基本数据类型 ,例如int ,long等采用==比较是直接比较值。 它们不是对象。但是他们有对应的对象版本,如:int ->Integer,long->Long ,如果你的数字是Integer的对象,如 Integer t=1; 那么这个t就是对象,你使用==,他就比较内存地址。 equals就比较内存地址中存放的内容。
      

  4.   

    ==是比较的是内存地址,如果内存地址相等的话就说明它指向的内容也就相等,换句话就是指向同一个对象,而equals是比较的是对象的内容,比较它们是不是相同的,但是如果在Object层次来比较==与equals 的话,2者是没有区别的
      

  5.   


    这是java的实现机制问题,对于对象来说,你使用==来比较,那么虚拟机就会认为你是在比较对象在内存中存放的物理地址,其实这个我们一般都不是这个意思,所以就需要一个比较对象实际内容的方法存在,那么就出现了equals,所以,equals就成了对象比较内容的标准方法,涉及到对象内容的比较相等,那么就使用他
      

  6.   

    因为int是基本数据类型,我理解为:
    内存区域:int a = 2;
    地址x
    -----------
    |  a |  2 |     这是int型存储。
    -----------Object obj = new Object();
    Object obj1 = obj;
    地址m
    -----------
    | obj |  n |     这是对象引用obj的存储。
    -----------
    -----------
    | obj |  n |     这是对象引用obj1的存储。
    -----------
    地址n
    ----------------
    | new Object() |     这是对象的存储。
    ----------------==判断的是XXXXX位置的值是否相等。
    -----------
    |   |XXXXX|    
    -----------
      

  7.   

    楼主要知道基本数据类型、对象、地址的几个概念
    == 比较的是内存中的地址,比较的是对象的句柄; 
    对基本数据类型,内存地址存放的就是值,所以比较也就是值。
    对对象,内存地址存放的是对象的引用,具体对象内容不在这个地址,具体对象内容在内存地址存放的值中对应的内存地址中。equals()比较的是地址内的内容,比较的是对象. 
    equals比较的时候会根据对象的引用找到对象的内容进行比较。
      

  8.   


    /*
     * 如果两个对象用对象的equals()方法比较是相等的,
     * 那么它们调用hashCode()方法必须生成同样的整数值。
     * 例如下面的代码
     * */public class HashCodeTest { /**
     * @param args
     */

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s1 = new String("Hello");
    String s2 = new String("Hello");
    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    Integer i1 = new Integer(10);
    Integer i2 = new Integer(10);
    System.out.println(i1.hashCode());
    System.out.println(i2.hashCode());
    }}
      

  9.   

    String 比较特殊要分开
    ==比较得失地址
    equals  比较的是值
      

  10.   


    顶,感觉说的很容易理解。
    还有一点就是,非基本数据类型判断m和y ,是不是判断m和y地址下的n地址里面的内容是否相等呢?吾愚笨,望高手指点阿
      

  11.   

    equal比较的是值 ==比较的是地址
      

  12.   

    ==是判断两个变量或实例是不是指向同一个内存空间
    equals是判断两个变量或实例所指向的内存空间的值是不是相同  示例代码:public class Hello1 { 
    public static void main(String[] args){ String str1 = new String("test"); 
    String str2 = "test"; if(str1.equals(str2)) 

    System.out.println("str1.equals is true" ); 

    else 

    System.out.println("str1.equals is false" ); 

    if(str1 == str2) 

    System.out.println("str1.== is true" ); 

    else 

    System.out.println("str1.== is false" ); 
    } } 
    }   
          
        
        
    结果:str1.equals is true 
    str1.== is false  
     
      

  13.   

    顶,感觉说的很容易理解。
    还有一点就是,非基本数据类型判断m和y ,是不是判断m和y地址下的n地址里面的内容是否相等呢?吾愚笨,望高手指点阿---------------------------------------------------------------------------------------------------------------
    对,就是判断m和y下的n的部分是否相等。
      

  14.   

    equals它是对两个字符串的比较:
    例如:String name="java";
          String name1="C#";
          name.equals(name1);
      

  15.   

    int是放在栈空间里的吧..对象都是放在堆空间里的.比栈空间里的东西用==,比堆空间里的东西用equals.对象的名字指向的堆空间中的地址就是在栈空间中,所以obj a,obj b,a==b是比的a,b是不是指向了同一个堆空间中的对象.
      

  16.   

    int是没有equals方法的,因为int是基本数据类型,是存放在内存堆栈中的,
    而对象就有equals方法,比如说字符串
    String的equals方法比较的是字符串的内容是否相通
    而==则比较的既是内容又是内存的地址
      

  17.   

    读一下下面从编程思想里拷出来的语句,也许有帮助第2章 一切都是对象“尽管以C++为基础,但Java是一种更纯粹的面向对象程序设计语言”。
    无论C++还是Java都属于杂合语言。但在Java中,设计者觉得这种杂合并不象在C++里那么重要。杂合语言允许采用多种编程风格;之所以说C++是一种杂合语言,是因为它支持与C语言的向后兼容能力。由于C++是C的一个超集,所以包含的许多特性都是后者不具备的,这些特性使C++在某些地方显得过于复杂。
    Java语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,正式用它设计之前,必须先将自己的思想转入一个面向对象的世界(除非早已习惯了这个世界的思维方式)。只有做好这个准备工作,与其他OOP语言相比,才能体会到Java的易学易用。在本章,我们将探讨Java程序的基本组件,并体会为什么说Java乃至Java程序内的一切都是对象。2.1 用句柄操纵对象
    每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C++里的指针)?
    所有这些在Java里都得到了简化,任何东西都可看作对象。因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)。在其他Java参考书里,还可看到有的人将其称作一个“引用”,甚至一个“指针”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。只要握住这个遥控板,就相当于掌握了与电视机连接的通道。但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(句柄),再由遥控板自己操纵电视机(对象)。如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。
    此外,即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。所以如果想容纳一个词或句子,可创建一个String句柄:
    String s;
    但这里创建的只是句柄,并不是对象。若此时向s发送一条消息,就会获得一个错误(运行期)。这是由于s实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无论如何都进行初始化:
    String s = "asdf";
    然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初始化类型。2.2 所有对象都必须创建
    创建句柄时,我们希望它同一个新对象连接。通常用new关键字达到这一目的。new的意思是:“把我变成这些对象的一种新类型”。所以在上面的例子中,可以说:
    String s = new String("asdf");
    它不仅指出“将我变成一个新字串”,也通过提供一个初始字串,指出了“如何生成这个新字串”。
    当然,字串(String)并非唯一的类型。Java配套提供了数量众多的现成类型。对我们来讲,最重要的就是记住能自行创建类型。事实上,这应是Java程序设计的一项基本操作,是继续本书后余部分学习的基础。2.2.1 保存到什么地方
    程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:
    (1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
    (2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。
    (3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
    (4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
    (5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
    (6) 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。Java 1.1提供了对Lightweight persistence的支持。未来的版本甚至可能提供更完整的方案。2.2.2 特殊情况:主要类型
    有一系列类需特别对待;可将它们想象成“基本”、“主要”或者“主”(Primitive)类型,进行程序设计时要频繁用到它们。之所以要特别对待,是由于用new创建对象(特别是小的、简单的变量)并不是非常有效,因为new将对象置于“堆”里。对于这些类型,Java采纳了与C和C++相同的方法。也就是说,不是用new创建变量,而是创建一个并非句柄的“自动”变量。这个变量容纳了具体的值,并置于堆栈中,能够更高效地存取。
    Java决定了每种主要类型的大小。就象在大多数语言里那样,这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。
      

  18.   

    ==比较的是基本数据类型
    equal()比较的是引用数据类型
      

  19.   

    终级回答:
    我们都知道在内存中是分栈和堆的,基本数据类型的值直接存放在栈中,而类类型对象栈中放对象指向堆中的地址,堆中放该对象的内容。“==”直接获取栈中的值进行比较,这对于基本数据类型来说是对的,而对于类类型对象来说就不会相等,因为比较的是相应的在堆区的地址值;而"equals"是获取栈中的地址,然后获取堆区中的值进行比较。
    这就是 “== 比较的是内存中的地址,比较的是对象的句柄;
      equals()比较的是地址内的内容,比较的是对象.”这句话的意思