java集合
一、 java集合类:实现常用的数据结构(栈,队列)
大致可以分为四种体系:set,list,queue,map
| set | list | map | queue |
|---|---|---|---|
| 无序,不可重复 | 有序,重复 | 映射关系的集合-key-value | 队列 |
二、.java集合类接口-Collection-Map接口继承树
1.Collection接口继承树

2.Map接口继承树

三、Set集合详解
1. 概述:
set集合类似于一个箱子,程序把各对象放进箱子里面,通常是没有办法记住放进箱子对象的先后顺序,各个对象在箱子里随意摆放。而且不允许把相同的元素对象放进同一个箱子。还有一点值得注意的是:不建议把可变对象放进箱子里,因为后面程序如果修改可变对象可能导致可变对象与箱子里其他对象相等,箱子无法准确找到这个对象。
2. HashSet类
HashSet类是Set类的典型实现,HashSet按照Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
特点:
- 无法保证元素的顺序;
- HashSet不是同步的(线程不安全),若多个线程同时访问一个HashSet,修改了这个集合,则必须要用代码来保证其同步;
- 其值可为null;
问题一:
HashSet是如何判断两个元素相等的?
首先我们要明白,当在HashSet存入一个元素的时候,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该hashCode值来确定该对象的在HashSet的存储位置。
当HashSet判断两个元素是否相等的时候,首先是让两个对象通过equals()方法比较相等,再比较两个对象的hashCode()方法的返回值相等,同时满足以上两个条件时则两个元素相等。
这里有个有趣的现象,两个元素通过equals()方法比较返回true的时候,要是它们的hashCode()方法返回值不相等,HashSet将把它们存储在不同的位置,依然可以添加成功。
- 值得注意的是,当需要把某个类的对象保存到HashSet集合中,重写这个类的equals()方法时,应该尽量保证两个对象通过equals()方法比较返回true时,它们的hashCode()方法返回值也相等。
拓展:
为什么HashSet里面add的时候,不可以add相同的值?(为什么可以用HashSet的这个不重复的值的特性来去重复呢?)
HashSet的值是存储在一个HashMap的key里面的。正好HashMap的key是不能重复的。HashMap在add()时候,若key没有存值,则存进去,返回oldValue;此值初始值是null;
若key已经有值了,那么add成功也返回oldValue,此时key有值,若HashSet的add中 == null 则会返回false,set的add失败。
为什么要用HashSet去重复的时候,要重写hashcode()和equals()方法?
重写equals的目的是:让两个对象引用地址不一样,但内容一样的对象是相等的。
重写hashCode的目:让ObjectA.equals(ObjectB)为true的两个对象的hashCode返回值一样。
3.LinkedHashSet类
概述:
LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置。但是它同时使用链表维护元素的次序(按照插入顺序来保存),即当遍历LinkedHashSet里的元素的时候,LinkedHashSet会按照插入顺序来访问LinkedHashSet集合里的元素。
参考:疯狂java讲义、CSDN博客
未完待续
意见和建议欢迎➡右下角联系我