两者本身是接口 Set 的实现类。有 Set 属性 不允许包含相同元素等。
HashSet 特点:
1 . 可以放null 但是只能存在一个null
代码段
HashSet<Object> set = new HashSet<Object>() ;
set.add("3");
set.add("4");
set.add("1");
set.add("2");
set.add(null);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
Object setStr = iterator.next();
System.out.print(setStr+"\t");
}
运行结果
null 1 2 3 4
将HashSet 换成 TreeSet 会报空指针异常的错误
2 . HashSet 不能保证元素的排列顺序,顺序有可能发生变化
3 . 不是同步的
HashSet 存放一个元素时 是通过equals 比较的,同时根据HashCode的值来判断这些元素的位置。
TreeSet 是 SortedSet 接口的实现类 是唯一一个。可以确保集合处于排序状态。支持两种排序 自然排序 和 定制排序。默认是当然是自然排序,也是equals 对两个元素进行比较。通过 CompareTo(Object object)进行大小比较并按照升序排序
说一下 compareTo 这个方法 ,是Comparable 接口中的方法。
上String类实现Comparable中的源码
` public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}`
比较 基于比较是基于每个字符的Unicode值 如果前者 大于 后者 返回 正数;
如果相等 返回 0;
如果前者小于后者 返回负数。
添加一个LinkedHashSet
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
HashSet<String> hashSet = new LinkedHashSet();
hashSet.add("1");
hashSet.add("4");
hashSet.add("8");
hashSet.add("2");
hashSet.add(null);
Iterator iterator = hashSet.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.print(obj+"\t");
}
}
输出 1 4 8 2 null