Java学习笔记13

Object类是所有类、数组、枚举类的父类,是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括

数组)都实现这个类的方法。

Object类实现了以下方法:

我们来看看源码中hashCode()方法:

public native int hashCode();

Object.hashCode() 就是一个哈希函数,用来计算散列值以实现哈希表这种数据结构。


返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

1、在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是

将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,

该整数无需保持一致。

2、如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode 方法都必须生

成相同的整数结果。

3、如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode

方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高

哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象

的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

在实际开发中,除了重写了hasCode()方法时,还要重写equals()方法。

我们来看看源码中equals()方法:

public boolean equals(Object obj) {
        return (this == obj);
    }

我们从以上程序中可以看出equals()方法的作用就是与某个对象进行比较,是否相等。

equals 方法在非空对象引用上实现相等关系:

1、自反性:对于任何非空引用值xx.equals(x) 都应返回true

2、对称性:对于任何非空引用值xy,当且仅当y.equals(x)
返回true 时,x.equals(y) 才应返回true

3、传递性:对于任何非空引用值xyz,如果x.equals(y)
返回true,并且y.equals(z) 返回true,那么x.equals(z)

应返回 true

4、一致性:对于任何非空引用值xy,多次调用x.equals(y)
始终返回true 或始终返回false,前提是对象上

equals 比较中所用的信息没有被修改。

5、对于任何非空引用值 xx.equals(null) 都应返回false

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值xy,当且仅当x

y 引用同一个对象时,此方法才返回 truex == y 具有值true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护
hashCode
方法的常规协定,该协定声明相等

对象必须具有相等的哈希码。

关于如何重写equals()和hashCode()方法请参看以下程序:

class User {
    private String name;

    protected String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof User)) {
            return false;
        }else{
        	return true;
        }
    }

    @Override
    public int hashCode() {
        return 30;
    }
}
public class Main {

	public static void main(String[] args) {
		User u1 = new User();
		u1.setName("GU");

		User u2 = new User();
		u2.setName("Bill");
		System.out.println(u1.equals(u2));
	}

}

输出结果:

true

在上面程序中,User类中重写了equals()方法和hashCode()方法。

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/43899101
  情绪控_

时间: 2024-10-09 19:50:59

Java学习笔记13的相关文章

我的java学习笔记(13)关于反射(part 2)

呜呜呜...今天因为晚上有点事...结果在实验室没有eclipse,用的命令行,结果环境变量没配好,搞了半天..弄到现在..哎.. 1.查看对象域的关键方法是Field类中的get方法. Field f = c1.getDeclareFields("name"); Object value = f.get(obj); //value是obj 中name域的当前值. 2.反射机制的默认行为受限于java的访问控制. 3.如果一个java程序没有受到安全管理器的控制,就可以覆盖访问控制.

Java学习笔记-13.创建窗口和程序片

1.init()方法:程序片第一次被创建,初次运行初始化程序片时调用. start()方法:每当程序片进入web浏览器中,并且允许程序片启动他的常规操作时调用(特殊的程序片被stop()关闭):同样在init()后调用. paint()方法:基础类Component的一部分(继承结构中上朔三级).作为update()的一部分调用,以便对程序片的画布进行特殊的描绘. stop()方法:每次程序片从web浏览器的视线中离开时调用,时程序片能关闭代价高昂的操作:同样在调用destroy()前调用. d

Java 学习笔记(2015.7.13~17)

Java 学习笔记(2015.7.13~17) Java this关键字 表示本类中的属性,调用本类中的方法 class Person {        private String name;         private int age;         public Person(String name, int age) {         this.name = name;//调用本类中的属性         this.age = age;//同上} //get&set方法:    

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在

Java 学习笔记(2015.7.20~24)

Java 学习笔记(2015.7.20~24) Java Java 学习笔记(2015.7.20~24) 1.StringBuffer与StringBuilder的区别: 2.基本数据类型包装类 3.Date.Calendar.DateFormat等与时间相关的类 1.常用类String 2.正则表达式 3.常用类 StringBuffer 代表可变的字符序列 拆箱与装箱 包装类的应用 匿名内部类 数组 day11 day12 day13 day14 day11 父类中使用public定义的方法

Swift学习笔记(13)--属性 (Properties)

普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类. 这个类的初始化会消耗不少时间. */ var fileName = "data.txt" // 这是提供数据导入功能 } class DataManager { @lazy var importer = D