开发工具与关键技术:Java、myEclipse
作者:吴晓佩
撰写时间:2019年07月03日
Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但set集合不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。
Set接口继承了Collection接口,因此Set几口包含Collection接口的所有方法。
Set无序不可重复,当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。
Set判断两个对象是否相等时不可以使用“==”,而应该使用“equals”。
Set的常用子类:
1、 TreeSet:有序存放,底层的数据结果结构是二叉树,对Set集合中的元素进行指定顺序的的排序,线程不同步。TreeSet是set的子类,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。
如下是TreeSet常用的方法示例与解析:
2、HashSet:散列存放,底层数据结构是哈希表,线程不同步的,如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通 过代码来保证其同步;不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化,HashSet具有高效无序性。
HashSet集合保证元素唯一性:通过元素的hashCode方法和equals方法来完成。当元素的hashCode值相同时,才继续判断equals是否为true。如果为true,那么视为相同元素,不保存此元素,如果为false,就储存。如果hashCode值不相同,则无需判断equals,从而提高了对象比较的速度。
(1)LinkedHashSet:LinkedHashSet是HashSet的子类,ListedHashSet集合是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序来保存的,性能略低于HashSet,但在迭代访问Set里的全部元素时性能好。
下面以我们常用的HashSet来举例,介绍set的常用方法,如下图:
注意:
1、Set的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象,如果一个Set中的可变元素改变了自身状态导致Object.equals(Object )=true,则会出现一些问题。
2、HashSet集合里面存入数据,主要是先后调用了两个方法:hashCode方法和equals方法。