`

HashSet初步认识

阅读更多

HashTree:底层数据结构是:哈希表,线程不安全(其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75,如果对于迭代性能要求比较高,对加载因子设置降低或者默认),通过hashCode方法和equals方法来保证元素的唯一性。

 

    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
	map = new HashMap<E,Object>();
    }

 

 

 

比较原理:先判断类中的属性各个hashcode 计算的值,如hashcode值相同才会去判断equals,否则,是不会调用equals方法的。

根据以上原理得知,我们必须要重写hashcode()和equals()方法,

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Student {

	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	private int age;

	public Student(String id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;// 为什么是31,可以思考一下,到时再整理出来
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		System.out.println("hashCode method :" + result);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age) {
		
			return true;
		}
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public static void main(String[] args) {
		Set<Student> set = new HashSet<Student>();
		Student student1 = new Student("1", "Tom", 16);
		Student student2 = new Student("2", "Lucy", 13);
		Student student2_1 = new Student("2", "Lucy", 13);
		Student student3 = new Student("3", "Peter", 14);

		set.add(student1);
		set.add(student2);
		set.add(student2_1);
		set.add(student3);
		Iterator<Student> iterator = set.iterator();
		while (iterator.hasNext()) {
			Student next = iterator.next();
			System.out.println(next.getName() + " :" + next.getAge());

		}

	}
}

 

 

 

 

同样contains(obj)方法中,也对比顺序是 hashCode 和equals(o) 代码如下

    /**
     * Returns the entry associated with the specified key in the
     * HashMap.  Returns null if the HashMap contains no mapping
     * for the key.
     */
    final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

 

 

 

 

 

分享到:
评论

相关推荐

    实验二、Java集合与XML实验.doc

    在Java编程中,集合框架是处理对象集合的重要工具,提供了多种数据结构和操作方式。本实验主要关注两个方面...同时,也对XML编程有了初步的认识。在实际编程中,根据需求选择合适的集合类型和XML处理方法是非常关键的。

    《Java程序设计大学教程》课件

    13. **Java EE基础**:对Java企业级开发有一个初步认识,包括Servlet、JSP和MVC模式。 14. **数据库操作**:掌握JDBC(Java Database Connectivity),了解如何连接数据库,执行SQL语句,处理结果集。 15. **设计...

    Head First JAVA 第二版(英文)

    "程序,帮助初学者建立起对编程的初步认识。 书中详尽地讲解了变量、数据类型、运算符、控制流(条件语句和循环结构)等基础概念。通过实例,读者可以学习到如何声明和使用变量,理解不同数据类型的特点,以及如何...

    十五天的时间进行JAVA学习的入门

    十五天的学习时间虽短,但通过有计划地学习和实践,你将能够建立起对Java的初步认识,为后续深入学习打下坚实基础。记住,理论知识与实际编程相结合,不断练习和解决问题是提升技能的关键。祝你在Java学习的道路上越...

    21天学通java pdf格式

    通过《21天学通Java》的系统学习,初学者不仅能够掌握Java编程的基本技能,还能建立起对整个Java生态系统的初步认识。无论是为了个人兴趣还是职业发展,这本书都是一份宝贵的资源。同时,配合实际编程练习,将理论...

    ACCP6.0 JAVA第一章TP01.ppt

    本章“TP01”着重讲解Java语言的入门知识,帮助学员建立起对Java编程的初步认识。 1. **Java简介**:Java是由Sun Microsystems公司(现已被Oracle收购)于1995年推出的面向对象的编程语言,以其“一次编写,到处...

    JAVA程序设计教程与课件

    在Java基础教程部分,首先会介绍Java的历史和应用领域,让学习者对这门语言有一个初步的认识。接着,会深入讲解Java的环境搭建,包括JDK的下载、安装以及配置环境变量,这是开始编程的第一步。 课程会逐步引导学习...

    Head First Java 中文高清

    这一部分是入门的基础,让读者对Java有一个初步的认识。 第二章至第四章会逐步讲解Java的基本语法,如数据类型、变量、常量、运算符、控制结构(如if语句和循环)等。这些内容构成了程序的基本骨架,是编写任何程序...

    java学习PDF下载地址全 百度云盘下载

    1. **Java简介**:介绍Java的历史、特点、应用领域以及与其它编程语言的对比,使学习者对Java有一个初步认识。 2. **环境配置**:讲解如何安装Java Development Kit (JDK) 和设置环境变量,为后续开发工作奠定基础...

    Java程序设计实践教程.rar

    这一部分让初学者对Java有一个初步的认识,知道它为何被广泛应用,以及如何在自己的计算机上建立开发环境。 接下来,`ch3.ppt`深入讲解了Java的语法基础,如数据类型、变量、运算符、流程控制语句(如if、switch、...

    java初级教程~~~

    尽管这个教程分为两部分,但每部分都可以独立学习,因为内容是连贯的,所以即使只学习第一部分,也能获得对Java编程的初步认识。为了深入学习,建议读者按照教程顺序逐步学习,并结合实践,编写自己的Java程序,从而...

    JAVA课件 辽宁工业大学

    通过学习这些内容,初学者不仅能了解JAVA的常用类,还能建立起对JAVA标准库的初步认识,为后续的进阶学习打下坚实的基础。在实际编程中,熟练运用这些类可以大大提高代码的效率和可读性。因此,掌握第五章的内容对于...

    传智播客 刘意-2015年Java基础视频-深入浅出精华版 笔记day01-day27

    ",让学员对Java编程有个初步认识。 **Day02-03: Java语法基础** 这部分涵盖了Java的基础语法,如变量、数据类型(包括基本类型和引用类型)、运算符、流程控制语句(if、switch、for、while等)、数组的声明、初始...

    精简java.rar

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...通过学习这些内容,读者可以建立起对Java编程的初步认识,并为进一步深入学习和实践打下坚实基础。

    Java课件-张孝详

    14. **Java EE**:简述Java企业版,包括Servlet、JSP、Filter、Listener等Web开发技术,以及MVC设计模式和Spring框架的初步认识。 通过【Java课件_张孝详】中的内容,学习者可以系统性地学习Java编程,逐步提高编程...

    JAVA简易基础(速成版)

    Java简易基础(速成版)课程...通过这个速成版的Java简易基础课程,你可以快速建立起对Java编程的初步认识,并具备基本的编程能力。然而,Java语言的深度和广度远不止于此,深入学习和实践将是持续提升编程技能的关键。

    21天学通java

    本书首先会介绍Java的历史和发展,让读者对这门语言有初步的认识。接下来,会详细讲解Java环境的搭建,包括JDK(Java Development Kit)的下载与安装,以及配置Java开发环境变量。 在基础语法部分,读者会学习到...

    Thinking in Java(pdf+chm).zip

    1. **Java基础**:Java语言的基础包括数据类型(如整型、浮点型、字符型和布尔型)、变量、运算符、流程控制(如if语句、switch语句、for循环、while循环等)、方法定义和调用,以及类和对象的初步认识。 2. **面向...

    Thinking in Java 第三版 cn.zip

    - **intro.pdf**:通常是对全书内容的概览,帮助读者对整个学习过程有个初步认识。 - **preface.pdf**:前言部分,作者可能会分享写作动机、目标读者以及本书的结构。 10. **其他**: - **chap5**、**chap6**等...

    Day02实习日记1

    在Java编程中,集合是存储和管理对象的重要工具。在暑期Java实训的第二天,学员们...通过这一天的学习,学员们不仅掌握了集合的基本操作,还对抽象类、接口和IO流有了初步的认识,为后续的编程实践打下了坚实的基础。

Global site tag (gtag.js) - Google Analytics