Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
上一篇总结了下ArrayList 、LinkedList和Vector比较,今天泥瓦匠总结下Hash 、LinkedList和Vector比较。其实大家都是Collection,只不过有点各自特性。那就是数据结构的不同表现。
一、Set回顾
一个不包括重复元素(包括可变对象)的Collection,是一种无序的集合。Set不包含满 a.equals(b) 的元素对a和b,并且最多有一个null。
泥瓦匠的记忆宫殿:
1、不允许包含相同元素
2、判断对象是否相同,根据equals方法
二、HashSet
一个按着Hash算法来存储集合中的元素,其元素值可以是NULL。它不能保证元素的排列顺序。同样,HashSet是不同步的,如果需要多线程访问它的话,可以用 Collections.synchronizedSet 方法来包装它:
[HashCodeObj@1, HashCodeObj@1, HashSetObj@2, EuqalsObj@1471cb25, EuqalsObj@3acff49f]
泥瓦匠根据结果,一一到来。首先,排列顺序不定。
HashSetObj 类满足我们刚刚的要求,所以集合中只有一个且它的HashCode值为2。
HashCodeObj 类虽然它们HashCode值为1,但是他们不相等。(其实当HashCode值一样,这个存储位置会采用链式结构保存两个HashCodeObj对象。)
同样,EqualsObj 类他们相等,但是他们HashCode值不等,分别为1471cb25、3acff49f。
因此,用HashSet添加可变对象,要注意当对象有可能修改后和其他对象矛盾,这样我们无法从HashSet找到准确我们需要的对象。
三、LinkedHashList
HashSet的子类,也同样有HashCode值来决定元素位置。但是它使用链表维护元素的次序。记住两个字:有序。
有序的妙用,复制。比如泥瓦匠实现一个HashSet无序添加,然后复制一个一样次序的HashSet来。代码如下:
四、TreeSet
TreeSet使用树结构实现(红黑树),集合中的元素进行排序,但是添加、删除和包含的算法复杂度为O(log(n))。
举个例子吧,首先我们定义一个Bird类。(鸟是泥瓦匠最喜欢的动物)
Exception in thread "main" java.lang.ClassCastException: Bird cannot be cast to java.lang.Comparable at java.util.TreeMap.compare(Unknown Source)
答案很明显,TreeSet是排序的。所以Bird需要实现Comparable此接口。
java.lang.Comparable此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
修改Bird如下:
Java集合容器面试题 TreeSet 要求存放的对象所属的类必须实现 Comparable 接口,该接口提供了比较元素的 compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进 行排 序。
为什么 java 容器推荐使用 ExitOnOutOfMemoryError 而非 HeapDumpOnOutOfMemoryError ? 好久没写文章了, 今天之所以突然心血来潮, 是因为昨天出现了这样一个情况: 我们公司的某个手机APP后端的用户(customer)微服务出现内存泄露, 导致OutOfMemoryError, 但是
二哥聊RPA 公号「二哥聊RPA」。关注我,一起洞察 RPA ◎ RPA创业者 ◎ 现明堂红木商业顾问,为十月结晶、可啦啦、鑫蜂维等多家企业提供 RPA 咨询服务 ◎ 希望帮助大家在 RPA 上做一些力所能及的事情
相关文章
- java:投个票程序
- Java 容器 & 泛型:五、HashMap 和 TreeMap的自白
- Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法
- Java 容器 & 泛型:四、Colletions.sort 和 Arrays.sort 的算法
- 【JAVA】java中的length和length()
- java 11 Java Flight Recorder
- [Java Spring] Controlling API Exposure & Override Endpoint Name
- 华为OD机试 - 去除多余空格(Java & JS & Python)
- 华为OD机试 - 投篮大赛(Java & JS & Python)
- 华为OD机试 - 最大平分数组(Java & JS & Python)
- 华为OD机试 - 英文输入法(Java & JS & Python)
- Java 两个日期之间相差的天数计算 & Calendar的DAY_OF_MONTH, DAY_OF_YEAR, DATE的区别
- Java 线程池 ThreadPoolExecutor源码简析
- Java 8 中的 java.util.Map#computeIfAbsent
- java性能分析工具 jconsole.exe
- Java 异常解决之java.lang.IllegalArgumentException: Comparison method violates its general contract!
- java-基础-【四】实际编程中的对象
- Java开发技术之成为高级java工程师必须学习的三个技术
- java判断给定路径或URL下的文件或文件夹是否存在?
- 【java】Spring Boot --spring boot项目整合xxl-job
- JAVA开发讲义(一)-Java的自白
- 汇智动力学院——Java 浅谈数据结构和算法