Set集合
<一>HashSet类
HashSet按照Hash算法来存储集合中的元素,因此有很好的存取和查找性能
HashSet具有以下特点
1.不能保证元素的排列顺序,顺序可能与添加顺序不同
2.集合元素可以是null值
3.HashSet不是同步的,如果多线程同时访问一个 HashSet,假设有两个或者两个以上线程同修改了HashSet集合时,则必须通过代码来保证其同步
向HashSet存入一个对象时,它会调用该对象的hashCode()来得到该对象的hashCode值,然后根据hashCode值来确定该对象在HashSet中存储的位置,
如果有两个元素通过equals()方法比较后返回true,但是这两个对象的hashCode值不同,HashSet依然把他们存储在不同的位置,添加成功
一句话说就是HashSet判断两个对象是否相等是通过equals()方法返回true,并且两个对象hashCode值相等
<二>LinkedHashSet类
LinkedHashSet类是HashSet类的子类,它也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,
当遍历LinkedHashSet集合里的元素时,LinkHashSet将会按元素的添加顺序来访问集合里的元素,输出LinkHashSet集合的元素时,元素的顺序总是与添加顺序一致
<三>TreeSet类
TreeSet可以确保集合元素处于排序状态,与HashSet集合采用hash算法来决定元素的存储位置不同,TreeSet采用二叉树的数据结构来存储集合元素
TreeSet类还额外提供几个方法
Object first(); //返回集合的第一个元素
Object last(); //返回集合的最后一个元素
Object lower(Object e);// 返回位于指定元素之前的元素
Object higher(Object d);//返回位于指定元素之后的元素
SortedSet subSet(ObjectfromElement,ObjecttoElement);返回此set的子集合,范围从fromElement到toElement
SortedSet headSet(Object toElement);返回此set的子集合,由小于toElement的元素组成
SortedSet tailSet(Object fromElement);返回此set的子集合,由大于或者等于fromElement的元素组成
当向TreeSet添加集合时,TreeSet会调用该对象的compareTo(Object obj)方法与集合中的其它元素进行比较,所以这需要集合中的其它元素
必须与该元素时同一个对象的实例。所以TreeSet比较两个对象是否是同一个对象的标准是:通过compareTo()方法比较是否返回0,如果返回0,TreeSet会认为这两个对象相同,否则不相同。
如果是程序员自定义的类还需要实现Comparable接口各Set类的性能分析
<四>HashSet类的性能比TreeSet类的性能好,特别体现在添加,查询元素等操作。对于普通的插入,删除操作,linkedHashSet比HashSet要略慢一点,
这是由维护链表所带来的额外开销造成的,不过,因为有了链表,遍历LinkedHashSet会更快。如果需要一个排序的Set时,才该使用TreeSet。
java笔记8.4
最新推荐文章于 2023-08-19 23:00:58 发布