hashSet linkedHashSet treeSet 一点区别
来源:互联网 发布:卵巢癌的早期b超数据 编辑:程序博客网 时间:2024/05/18 00:21
上代码先:
Set<String> hashSet=new HashSet<String>(); hashSet.add("thireBottom"); hashSet.add("thirdTop"); System.out.println(hashSet); Set<String> linkedSet=new LinkedHashSet<String>(); linkedSet.add("thireBottom"); linkedSet.add("thirdTop"); System.out.println(linkedSet); Set<String> treeSet=new TreeSet<String>(); treeSet.add("thirdTop"); treeSet.add("thireBottom"); System.out.println(treeSet);
结果如下:
[thirdTop, thirdBottom]
[thirdBottom, thirdTop]
[thirdBottom, thirdTop]
工作了许久有时候也没注意到这些细节上的东西,今天刚好碰到一个需求就是要求Set集合按照一定的顺序输出,翻了下hashSet的源码,简单mark下.
对于hashSet这个集合,本质是基于hashMap的ketSet()实现的. keySet()类似一个数组集合, 当往里面add数据的时候, 会先计算该数据的hashCode值, 根据该值存入到数组集合中.例子中: thirdTop 的hashCode值对应的数组下标排在thirdBottom前面,所以输出 thirdTop, thirdBottom
在来看一个列子:
import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;public class Test { public static void main(String args[]){ testB(); } public static void testB(){ Set<HashObject> set=new HashSet<HashObject>(); HashObject object1=new HashObject(); object1.setCode(10); System.out.println(object1); HashObject object2=new HashObject(); object2.setCode(54); System.out.println(object2); HashObject object3=new HashObject(); object3.setCode(32); System.out.println(object3); set.add(object1); set.add(object2); set.add(object3); System.out.println(); System.out.println("object1在数组中的下标:"+String.valueOf(15&41)); // 长度&hashCode System.out.println("object2在数组中的下标:"+String.valueOf(15&85)); // 长度&hashCode System.out.println("object3在数组中的下标:"+String.valueOf(15&63)); // 长度&hashCode System.out.println(); System.out.println(set); } static class HashObject{ private Integer code; @Override public int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((code == null) ? 0 : code.hashCode());return result;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;} }}
hashObject 对象的hashCode值可以通过重写 该类的hashCode()方法实现, 但是需要区分的是hashCode不等于hashOject所存储的数组列表的下标,即不是按照hashCode大小顺序存入数组列表, hashCode到数组下标转换方法如下(在hashMap源码中定义):
/** * Returns index for hash code h. */ static int indexFor(int h, int length) { return h & (length-1); }
当前数组列表的长度-1 & hashCode 即得到数组下标,输出顺序,结果如下:
Test$HashObject@29Test$HashObject@55Test$HashObject@3fobject1在数组中的下标:9object2在数组中的下标:5object3在数组中的下标:15[Test$HashObject@55, Test$HashObject@29, Test$HashObject@3f]
结论: hashSet 中的数据排序和你插入顺序无关, 也没有指定的排序方法供你选择, 结果可以简单理解为不可预知的(其实还是根据hashCode来的)
linkedHashSet 数据插入不是基于数组,而是以链式存储,通过前后指针相互关联.所以数据插入顺序决定了输出顺序
treeSet <E> 相比上面则提供了,排序的方法。 插入的对象必须实现 comparable接口以提供排序方法, 如果是字符串默认就是按照字母顺序排序。
0 0
- hashSet linkedHashSet treeSet 一点区别
- HashSet TreeSet LinkedHashSet 区别
- HashSet、LinkedHashSet、TreeSet区别
- HashSet TreeSet LinkedHashSet 区别
- HashSet、LinkedHashSet、TreeSet使用区别
- HashSet、LinkedHashSet、TreeSet使用区别
- HashSet、TreeSet、LinkedHashSet的区别
- HashSet、LinkedHashSet、TreeSet使用区别
- HashSet LinkedHashSet和TreeSet区别
- HashSet、LinkedHashSet、TreeSet使用区别
- HashSet,LinkedHashSet ,TreeSet使用区别
- HashSet、LinkedHashSet、TreeSet使用区别
- HashSet,linkedHashSet,TreeSet的区别
- HashSet、LinkedHashSet、TreeSet的区别
- HashSet、TreeSet、LinkedHashSet的区别
- HashSet、LinkedHashSet、TreeSet使用区别
- HashSet,TreeSet和LinkedHashSet的区别
- HashSet,TreeSet和LinkedHashSet的区别
- hdu 3341 Lost's revenge(AC自动机+变进制状压DP)
- SQL_数学函数
- 又是一个没有开通博客的啊
- Python中的__init__()方法及其继承
- 并发和任务调度的高级知识点
- hashSet linkedHashSet treeSet 一点区别
- 表空间正在热备份时关闭实例重启报错的重现和解决
- 十一月你好
- SharePoint Search之(四)Promoted Results—让搜索结果置顶
- OpenCV学习笔记1
- linux在weblogic上发布web应用以及weblogic输入密码后报错的问题
- 基于动态代理的CharacterEncodingFilter,GzipFilter
- JAVA程序设计(14.3)----- 图书馆管理系统 初步设计 界面篇~借书目录查看窗口,新书添加窗口
- maven的使用