集合中的元素不能重复。(即不能重复对同一地址的引用)
集合中存储的是对象的引用(地址)。
Hashset的内部机制:也使用到了equals方法(所以经常需要重写)
1.当向集合(set)中添加对象是,首先计算该对象的hashcode值,当该hashcode值所在位置无对象时,直接添加。
2.否则,则进行equals方法比较,如果返回true,说明就是同一个对象,不再添加该对象;如果返回false,继续散列添加该对象。
此处,如果没有重写equals方法,那么就是判断内存地址,只有重写了equals方法,才能判断内容是否相同。
同时,当重写了equals方法后,必须要重写hashcode方法。因为要保证下3的成立!(我们重写equals方法的目的就是为了使equals方法表示两个对象是否真正是同一个对象,如果是同一个对象就应该具有相同过的hashcode值)
3.如果一个类的两个对象的equal值为true,说明两个对象具有相同的hashcode值,反之,如果两个对象具有相同的hashcode值,则说明两个对象的equal值为true。但是两个对象的equals方法为true,并不能说明两个对象是否相同,也有可能内容相等,要看是否重写了equals方法。
我们应该把字符串作为类的特例进行理解。
4.equals方法为false就肯定不是同一个对象了!
5.String类重写了hashcode和equals方法!
package Code; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SetTest { public static void main(String[] args) { // Set<String> set = new HashSet<String>(); // set.add("abc"); // set.add("xyz"); // set.add("abc"); // for(Iterator<String> iter = set.iterator(); iter.hasNext();) // System.out.println(iter.next()); Set<People> set = new HashSet<People>(); set.add(new People("zhangsan")); set.add(new People("lisi")); set.add(new People("zhangsan")); for(Iterator<People> iter = set.iterator(); iter.hasNext();) System.out.println(iter.next().getName()); } } class People { String name; public People(String name) { this.name = name; } public String getName() { return name; } @Override public boolean equals(Object object) { if(this == object) return true; if(object instanceof People) { People people = (People)object; if(name.equals(people.getName())) return true; } return false; } @Override public int hashCode() { return name.hashCode(); } }
HashSet是采用HashMap实现的。(对象都是在堆里的)
HashMap的key就是放进HashSet中的对象。
当调用Hashset中的add方法时,实际上是向Hashmap中增加了一行(key-value对)
该行的key就是添加进HashSet中的对象,value就是一个Object类型的常量。
HashMap底层是采用数组来维护的。
Entry(key,value)
以上的数据结构都是为了提高查找效率,使得查找时间不随数组内容增大而增大。
相关推荐
《Java基础复习笔记.docx》是一份宝贵的学习资源,旨在帮助那些已经具有一定Java编程基础的学习者巩固知识、进行复习以及更深入地理解Java编程的核心概念。以下是对这个资源的详细描述: 全面的复习内容:这份资源...
这个笔记对应我的博客的java基础复习-基础总结系列
内含课程所有章节的知识点,主要有Java基础语法、面向对象、多线程、集合(List集合、Map),还有一些小练习
韩顺平版Java基础笔记是一套详尽的Java入门教程,内容包括: Java语言概述和环境搭建 基本数据类型、变量和运算符 控制语句:条件语句和循环语句 数组和字符串处理 面向对象编程:类和对象、继承、封装、多态 异常...
Java领域基础部分aS笔记涵盖了Java编程语言的核心概念,包括但不限于: Java数据类型和变量 控制流程语句(if-else, switch, for, while等) 数组和集合 面向对象编程(OOP)基础(类,对象,继承,封装,多态) ...
包括有corejava,jdbc,hibernate,ejb,c++,servlet,spring,struts,jsp等的学习笔记,个人以前复习时经常看的,非常棒!!下了后请给个留言!!谢谢!!
复习相关教材、笔记、视频教程等。 练习编写简单的Java程序,包括控制流、循环、函数、类和对象等基本概念。 熟悉Java的异常处理机制,了解如何捕捉和处理异常。 了解Java的集合框架和泛型,包括List、Set、Map等...
课堂笔记 抽象类以及接口 集合笔记 集合的继承结构图 数组笔记 线程笔记 线程生命周期 异常笔记 异常的继承结构图 注解
笔记旨在理解Java SE的知识,并构建一个比较系统化的知识结构,而不是停在知其然,而不知其所以然的处境以及方便复习和查阅。在笔记中有很小一部分JVM原理的知识,即反译查看Java的字节码。这对我们理解Java SE的...
包装类 String 类 字符串的特性 String 类的常见方法 StringBuffer 类 Math 类 Arrays 类 System 类 日期类包括1代2代3代 集合 集合的框架体系 Collection 接口和常用方法 Collection 接口实现类的特点 List 接口和...
Java 1. 面试现场】为什么MySQL数据库要用B+树存储索引? 2. 【漫画】以后在有面试官...14. 2020年大厂Java面试前复习的正确姿势(800+面试题附答案解析) 15. 大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?
【一线互联网大厂Java核心面试题库】Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等... 2020年初开始,陆陆续续一直在收集...
文档包含for/while/do-while、方法、方法重载、数组、面向对象、单例、重写、多态、抽象类、内部类、异常、String、八大基本数据类型、日期、集合、文件、多线程、网络编程、反射等基础讲解笔记。
java8 集合源码分析 学习知识总结记录 将知识先读厚,再将知识变薄,最后灵活运用、科学复习以防遗忘。 前言 这个库是archive将知识变薄、和平时知识使用总结的结果,以脑图和Markdown笔记为主。 平时用来科学复习的...