浅谈Java集合

自己绘制的常用的集合接口及实现类

一、Celletion接口

Cellection接口下常用的有Set、List接口

1.Set

 


  • SortedSet接口是Set的子接口,其主要的实现类就是TreeSet。大家都知道,Set类存储的数据是无序,且不重复的。但是这个接口比较特殊,看这个名字应该也能知道,作为SortedSet的实现类TreeSet是有序的。它对存储的数据也是有要求的,需要存储的数据类型一致。
  • HashSet存入的数据是无序(要遍历的话需要用迭代器)不重复的,其底层实现的是HashMap。附上代码:
 1     public HashSet() {
 2     map = new HashMap<E,Object>();
 3     }
 4 
 5   
 6     public HashSet(Collection<? extends E> c) {
 7     map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
 8     addAll(c);
 9     }
10 
11     public HashSet(int initialCapacity, float loadFactor) {
12     map = new HashMap<E,Object>(initialCapacity, loadFactor);
13     }
14 
15  
16     public HashSet(int initialCapacity) {
17     map = new HashMap<E,Object>(initialCapacity);
18     }

 

2、List

List接口下的实现类都是可以存储相同的数据的,并且能排序。


  • ArrayList:通过变长数组的方法来实现的,线程不安全。默认长度为10,当空间不足时会自动扩充,扩充为当前的1.5倍,再加1。
  • Vector:与ArrayList相似,但是是线程安全的,通过synchronized来控制的。
  • LinkedList:通过双向循环链表实现的。

ArrayList与LinkedList的区别:

  • ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
  • 相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

  • LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

 

3、Map

  • SortedMap:是Map子接口,主要提供了TreeMap的实现,是Map下有序的一个实现类。顺序是按照key值的升序来排。与HashMap不同的是,它的键值都不能为null。
  • HashMap:是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。HashMap的值不相同是由hashcode(),equals()两个方法来保证的。

 

HashMap和TreeMap比较:

 

  1. HashMap:适用于在Map中插入、删除和定位元素。 
  2. TreeMap:适用于按自然顺序或自定义顺序遍历键(key)。 
  3. HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap. 
  4. HashMap 非线程安全 TreeMap 非线程安全 
  5. HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。

    在HashMap中通过get()来获取value,通过put()来插入value,ContainsKey()则用来检验对象是否已经存在。可以看出,和ArrayList的操作相比,HashMap除了通过key索引其内容之外,别的方面差异并不大。

  • HashTable\SynchronizedMap\ConcurrentHashMap:这三个都是线程安全的。ConcurrentHashMap采用的是红黑树和CAS算法,效率提高了不少。

Hashtable是线程安全的,它的方法是同步了的,可以直接用 在多线程环境中。而HashMap则不是线程安全的。在多线程环境中,需要手动实现同步机制。

 

转载于:https://www.cnblogs.com/bqylister/p/9570869.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值