Set集合各种实现类性能分析
HashSet
- 是基于Hash算法来实现的,功能是能快速查到到检索的对象,hash算法在于速度,查询某个元素是根据hashCode()值计算出存储位置从而找得的
- 不会记住添加顺序.添加顺序位置随机
- 不会添加重复元素,在同一个集合输入相同元素,add()方法返回false,且新元素不会加入
- HashSet类似于HashMap的key,把key封装起来就HashSet,
- HashSet访问元素也是根据hashCode()的值来快速定位
- HashSet比较两个元素相等的标准是通过equals()方法与hashCode( )方法比较的对象返回值相等,但如果两个元素的equals相等,hashCode()不相等也是会添加成功
代码如下:
public static void main(String[] args) {
HashSet<String> set=new HashSet<String>();
set.add("小陈");
set.add("小红");
set.add("小花");
set.add("小明");
set.add("小亮");
//并不会添加相同元素
set.add("小陈");
for (String obj: set) {
System.out.println(obj);
}
}
结果是: 小陈 小明 小亮 小红 小花
可以看来并不会添加相同元素进来
LinkedHashSet
- 也是根据hashCode()来访问元素位置,但同时使用链表来维护元素的次序,使元素维持插入的顺序保存起来,遍历输出后也是按照添加顺序输出
- 也不允许集合元素重复。
- 因为需要维持元素的插入顺序,性能比HashSet低
- 访问Set里的全部元素有很好的性能,因为它以链表来维护顺序
代码如下
public static void main(String[] args) {
LinkedHashSet itn=new LinkedHashSet();
itn.add(5);
itn.add(2);
itn.add(8);
itn.add(10);
Iterator abn=itn.iterator();
//使用lambda表示式来来遍历集合,减少过多的代码
abn.forEachRemaining(obj ->System.out.println("排序元素是:"+obj));
}
结果是:
元素的集合是5
元素的集合是2
元素的集合是8
元素的集合是10
TreeSet
- 要求内部元素实现Comparable接口
- 使用树结构实现(红黑树),集合中的元素进行排序
- 其中自然排序与自定义排序
代码如下
public static void main(String[] args) {
TreeSet itn=new TreeSet();
itn.add(65);
itn.add(30);
itn.add(34);
itn.add(21);
Iterator st=itn.iterator();
//使用lambda表示式来来遍历集合,减少过多的代码
st.forEachRemaining(ele ->System.out.println("元素的集合是"+ele));
}
结果是:
元素的集合是21
元素的集合是30
元素的集合是34
元素的集合是65
总结:Set集合性能分析 HashSet性能是比TreeSet好(在添加查询等方面,因为TreeSet需要在额外的红黑树来维持排序,只有当需要保持一个排序的Set才使用TreeSet,不然都使用HashSet
LinkedHashSet对于普通的插入与删除比HashSet慢,但有了链表,遍历LinkedHashSet会快很多