`
roway
  • 浏览: 50680 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第九:hashCode与equals方法的实现机制

 
阅读更多

一.

注意hashCode与equals方法在HashSet中的应用(HashSetTest3)

public class HashSetTest {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Set set =new HashSet();//Set是一个不包含重复元素的 collection
		set.add("zhangsan");
		set.add("lisi");
		set.add("wangwu");
		System.out.println(set.add("zhangsan"));//添加重复元素...失败!
		System.out.println(set.size());//Set集合中元素个数
	}
}

//没写hashCode与equals方法之前
public class HashSetTest2 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Set set = new HashSet();

		People p1 = new People("zhangsan");
		People p2 = new People("lisi");
		People p3 = new People("wangwu");
		People p4 = new People("zhangsan");
		People p5 = new People("zhangsan");

		set.add(p1);
		set.add(p2);
		set.add(p3);
		set.add(p4);
		set.add(p5);
		System.out.println(set.size());
	}
}

class People {
	String name;

	public People(String name) {
		this.name = name;
	}
}

//没写hashCode与equals方法之后
public class HashSetTest3 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Set set =new HashSet();
		
		Student p1=new Student("zhangsan");
		Student p2=new Student("lisi");
		Student p3=new Student("wangwu");
		Student p4=new Student("zhangsan");
		Student p5=new Student("zhangsan");
		
		set.add(p1);
		set.add(p2);
		set.add(p3);
		set.add(p4);
		set.add(p5);
		System.out.println(set.size());
	}
}

class Student{
	String name;
	public Student(String name){
		this.name=name;
	}
	//用系统生成的方法
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Student other = (Student) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	

	/*//自己写的方法
	@Override
	public int hashCode() {
		System.out.println("hashCode executed!");
		return name.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		System.out.println("equals executed!");
		if (this == obj) {
			return true;
		}
		if (obj instanceof Student) {
			Student s = (Student) obj;
			return name.equals(s.name);
		}
		return false;
	}*/
	
}


分享到:
评论

相关推荐

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

    - `equals` 方法的理解与实现。 - `Comparable` 接口的使用。 - `hashCode` 方法的作用及其与`equals`方法的关系。 - **工具类**: - 静态类与非静态类的区别。 - 泛型的使用,包括泛型类和泛型方法。 - **集合...

    面试题java

    #### 第九题:字符串"xyz"创建的对象数量 `String s = new String("xyz");`实际上创建了两个字符串对象:一个在常量池中,另一个通过`new`关键字创建。 #### 第十题:Math.round(11.5)和Math.round(-11.5)的结果 ...

    JAVA经典教材笔记

    #### 第九章:多线程 - **认识多线程** - 多线程的优势:提高程序并发执行能力。 - 线程的创建方式:继承Thread类或实现Runnable接口。 - **线程常用操作方法** - 启动线程:start()方法。 - 线程睡眠:sleep...

    JAVA中软面试题

    #### 题目一:`List`中元素的查找与`equals()`、`hashCode()`方法的关系 在第一题中,我们探讨了`List`集合中元素的查找机制,尤其是当`List`使用`LinkedList`实现时。`List`的`contains()`方法用于判断集合中是否...

    JAVA 面试题总览(书签完整版)

    自动实现hashcode和equals的方法 - 使用`@Data`注解或Lombok库自动生成这些方法。 - 优点:简化代码,减少出错概率。 - 缺点:依赖第三方库,可能影响性能。 #### 20. 访问修饰符的应用设计作用 - **public**:...

    java面试宝典

    "=="与equals方法的区别?** - **"=="** 比较两个对象的引用是否相同。 - **equals** 方法比较的是两个对象的内容是否相等(默认情况下比较的是引用)。 **12. 静态成员与实例成员的区别?** - **静态成员:** 属于...

    最新Java面试题

    - **`HashSet`的使用和原理**:基于`HashMap`实现,不允许重复元素,通过`hashCode()`和`equals()`方法判断元素是否相等。 - **`TreeSet`的原理和使用**:基于红黑树实现,可以自然排序或自定义排序。 - **集合和数...

    java面试笔记整理,包含java,redis,kafka等

    - **正确的做法是在equals方法中验证对象相等性后才返回相同的hashCode。** #### 二十五、Java创建对象的方式 - **使用new关键字创建对象。** - **使用反射API创建对象。** - **使用克隆方法创建对象。** - **使用...

    Java面试八股文十万字总结.docx

    哈希码用于快速查找对象,通常与equals方法一起使用,以提高哈希表的性能。 **10. String、StringBuffer 和 StringBuilder 的区别** - **String**:不可变字符串,适合少量修改场景。 - **StringBuffer**:线程...

    Java经典试题及答案

    - **hashCode**与**equals**方法之间的关系非常重要。根据Java文档,如果两个对象相等(通过`equals`方法),那么它们的`hashCode`也应该是相同的。但是,如果两个对象有不同的`hashCode`,并不意味着它们不相等。 -...

    java简答题答案.pdf

    - **多态**:同名方法在不同类中有不同的实现,或同一方法在不同上下文有不同的行为。 12. **访问控制**: - **private**:仅在本类中可见。 - **default(包级私有)**:在同包内可见。 - **protected**:在同...

    Effective Java第三版1

    1. **覆写equals时遵守通用规定**:重写`equals()`时,应遵循“ Reflexive、Symmetric、Transitive、Consistency 和 Non-null”五原则,同时必须与`hashCode()`一起覆写。 2. **覆写hashCode**:确保相等的对象有...

    JavaJava+EE软件工程师就业求职手册.doc

    ##### 第9章 线程 - **9.1 Java的多线程机制** - **9.1.1 区别进程和线程**:比较进程与线程的概念。 - **9.1.2 了解线程的状态**:介绍线程生命周期中的各种状态。 - **9.1.3 创建线程的两种方式**:比较通过...

    2019年最新版修订版Java程序员面试宝典.pdf

    4. **对象的`equals`方法与`hashCode`**:两个对象的`equals`方法返回`true`时,它们的`hashCode`也应该相等。这是为了保证哈希表等数据结构的正确性。 5. **继承String**:`String`类是final的,因此不能被继承。 ...

    程序员面试题

    - 如果类实现了 `hashCode()` 方法,则建议同时重写 `equals()` 方法,以保持一致性。 #### 3. forward 和 redirect 的区别 **forward:** - 使用服务器端转发,客户端浏览器的URL不会发生变化。 - 效率较高,因为...

    java面试宝典!!

    1. **抽象类**:可以包含抽象方法和具体实现方法,可以有构造器、字段和静态方法。 2. **接口**:只包含抽象方法,从Java 8开始支持默认方法和静态方法。接口主要用于定义行为标准。 #### 十、静态变量与实例变量 1...

    计算机&软件工程&人工智能研究生复试资料整理

    - 当两个对象根据`equals`方法比较是相等的,那么这两个对象的`hashCode`值必须相同。这是为了确保在哈希表中能够正确地定位和检索数据。 3. **什么是拆箱和装箱?** - **装箱**:将基本类型转换为对应的包装类...

Global site tag (gtag.js) - Google Analytics