`
pda158
  • 浏览: 193069 次
社区版块
存档分类
最新评论

Java中对象的等价性比较

阅读更多

Java中不能简单的用==、!=等比较符对两个对象进行比较,尽管有时候两个对象的内容完全一样,但是对象的引用却是不一样的!因此,对两个对象的实际内容进行比较时,必须使用所有对象都适用的特殊方法equals()。   看下面一个例子:

public class EqualsMethod{
    public static void main(String[] strs){
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        //不能直接将两个引用比较,输出false
        System.out.println(n1==n2);
        //用特殊方法equals(),比较两个对象的实际内容,输出true
        System.out.println(n1.equals(n2));
       
        int n3 = 47;
        int n4 = 47;
        //基本类型比较,可直接用比较符即可,输出true
        System.out.println(n3==n4);
    }
}

 equals()方法不适用于“基本类型”,基本类型直接使用==和!=即可,这点从上例中也可以看出来。

  但是,事情并不是这么简单,对于我们自己创建的类,equals()默认比较两个对象的引用,如下例:

class Value{
    int i;
}

public class EqualsMethod{
    public static void main(String[] strs){
        Value n1 = new Value();
        Value n2 = new Value();
        n1.i = n2.i = 100;
        //对于自己创建的类,用equals(),默认比较两个对象的引用,输出false
        System.out.println(n1.equals(n2));
    }
}

 

7
1
分享到:
评论
2 楼 小虫大人 2013-12-04  
[/color][color=green][color=blue][/color][size=large][/size]
[/aqwewqeqweqweqwelign][align=left]
[b][/b][/u][u]
引用
引用
引用
引用
引用
引用
引用
引用
引用
引用
1 楼 spiniper 2013-11-29  
- -看来你java刚入门么。
对于这点我稍微多说一点,java中有实现对象的规范。
自己实现的任何对象,都需要实现3个方法,这三个方法继承与java.lang.Object,但是这三个方法必须覆盖。
toString
equals
hashCode
toString是用来输出自己实现的对象的基本信息,
equals是比较对象的一致性,自己实现的对象的一致性由你自己实现。
hashCode是对象自身校验码。
这三个方法由的规范是,如果认为两个对象相同,那么这三个方法必须保持一致,这句话的意思就是说,如果equals返回的true,两个对象的hashcode必须相同,toString输出结果也必须相同。
对于这点,你可以去比较java.lang.Object java.lang.Integer java.lang.String 这三个类,这三个类对于这三个方法有完整实现。当然最原始的是java.lang.Object类,任何未实现这三个方法的类,沿用这个类的这三个方法的逻辑。
另外说一句java.lang.Object的hashcode方法是native方法,其通过对象的内存指针产生校验值,而equals方法内部就是使用 return this==o;的方式完成对象比对。

相关推荐

    【IT十八掌徐培成】Java基础第10天-04.List-迭代器-对象等价性.zip

    3. **对象等价性**:在Java中,对象等价性分为两种:引用等价性和逻辑等价性。引用等价性是指两个对象是否指向内存中的同一个位置,即它们的引用是否相同。而逻辑等价性关注的是对象的内容是否相同,即使它们在内存...

    面向对象编程:C++与Java比较教程 英文版

    本书《面向对象编程:C++与Java比较教程》详细比较和对比了当今最流行的两种编程语言C++和Java,旨在教授互联网时代至关重要的技能和面向对象编程技术。作者Avinash C. Kak凭借其成功教授的课程,撰写了一本全面的...

    Java泛型的理解与等价实现

    Java泛型是自JDK 5.0引入的一项重要特性,极大地增强了代码的类型安全性和重用性。本文将深入探讨Java泛型的概念、使用方式以及等价的非泛型实现,帮助读者全面理解这一强大的工具。 首先,泛型允许在类、接口和...

    java中instanceof与Class的等价性代码示例

    Java 中 instanceof 与 Class 的等价性代码示例 Java 中的 `instanceof` 运算符是一个二元操作符,用于检查对象是否属于某个特定类或其子类。它返回一个布尔值,指示对象是否是该类或其子类的一个实例。在 Java 中...

    java中文繁体转中文简体

    Java是一种广泛使用的编程语言,它的灵活性和跨平台性使其在处理文本转换任务时也非常得心应手。在“java中文繁体转中文简体”这个主题中,我们主要讨论的是如何利用Java技术来实现中文繁体字到简体字的转换。 首先...

    Thinking in java4(中文高清版)-java的'圣经'

    3.5.1 一元加、减操作符 3.6 自动递增和递减 3.7 关系操作符 3.7.1 测试对象的等价性 3.8 逻辑操作符 3.8.1 短路 3.9 直接常量 3.9.1 指数记数法 3.10 按位操作符 3.11 移位操作符 3.12 三元操作符 if-else 3.13 ...

    effective-java.pdf

    - 静态工厂方法允许实现实例控制类,保证类是单例的,不可实例化的,或者确保不可变类中等价对象的唯一性。这可以减少实例化的次数,避免创建不必要的重复对象。 - 静态工厂方法可以返回任何子类型的对象,提供更大...

    C++代码转java工具

    6. **函数调用和库集成**:如果C++代码使用了库,工具可能需要处理库的迁移问题,或者提供Java的等价实现。 标签“java C++ C++转java”表明这个话题是关于这两门语言之间的互操作性。C++到Java的转换可能涉及Java ...

    java 面向对象的程序设计讲义

    - **对象等价性与比较**: - `equals` 方法的理解与实现。 - `Comparable` 接口的使用。 - `hashCode` 方法的作用及其与`equals`方法的关系。 - **工具类**: - 静态类与非静态类的区别。 - 泛型的使用,包括泛型...

    C转java工具

    接着,它将这些结构映射到相应的Java语法,例如,将C中的指针转换为Java的对象引用,将C的结构体转换为Java的类,将C的函数转换为Java的方法等。在这个过程中,工具还需要处理类型映射、内存管理等方面的差异,确保...

    关于java的一个有趣的问题

    String类在Java中是final的,这意味着它不能被继承,保证了其安全性和不变性。 首先,我们来看看标题中提到的有趣问题:`String str=new String("abc");` 这行代码会创建几个String对象。答案是两个。`"abc"`在Java...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    Effective Java第三版1

    在Effective Java中,作者可能会讨论最佳实践的重要性,以及遵循这些实践如何提升代码质量。 ### 第二章 创建和销毁对象 这一章深入探讨了对象的生命周期管理,包括: 1. **静态工厂方法**:相比构造器,静态工厂...

    c++ 转换 java c# 转换 java c++ 转换 c#

    转换器可能会尽可能保留原始代码的逻辑,但无法保证完全的等价性,因此人工审查和修改通常是必要的。同时,理解源代码的结构和目的对于成功转换至关重要。 总的来说,这三种转换反映了跨语言编程的挑战和需求。虽然...

    面向对象与java程序设计实验内容.doc

    的前20项和,展示了两种不同类型的循环在解决相同问题时的等价性。最后,通过查找完数(因子和等于自身的数)展示了条件判断和循环在数值分析中的应用。 实验三则涉及素数计算和字符串操作。首先,计算10000以内...

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java编程思想(完整版)

    - **2.2.1 保存在什么地方**:Java对象存储在堆内存中。堆是Java虚拟机(JVM)管理的一部分内存区域,用于存放所有的Java对象实例。 - **2.2.2 特殊情况:主类型**:Java中的一些基本数据类型(如int、double等)不...

    Java与C++的比较

    Java中的static关键字和C++中的含义相似,但Java中的static成员属于类本身而非对象实例。Java的类的Persistence是指类加载机制,它负责加载类到内存,执行类的静态初始化。Java程序的可移植性来自于它的字节码可以在...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

Global site tag (gtag.js) - Google Analytics