Java Collection 中 List,Set,Map的区别

Collection 为Collection层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。

 

1.  List:List可以理解为一组有序的对象的集合。也就是它保证list中中对象元素的顺序。

  •    ArrayList:类似于数组,可以进行随机访问和存储,也可以进行迭代。但在ArrayList的中间插入和删除一些对象效率会较低,如果在List中间要多次操作数据,可以考虑使用LinkedList代替。
  •    LinkedList:是List接口的双向链接列表实现,因此可以高效地在中间插入或删除对象。此外,LinkedList也实现了Queue和DeQueue(双向队列),所以LinkedList也可以作为队列使用,同时LinkedList也实现了pop和push方法,所以LinkedList实际上也可以作为栈使用。因为是链表实现,所以随机访问也会比较慢(使用ArrayList取代)。 此外,LinkedList是不同步的。

2.  Set:Set为一个不包含重复元素的 collection,其判断重复的标准为元素的equels方法的返回。Set通常拥有自身的排序,它不保证按插入顺序排序。

  • HashSet:利用了HashMap的实例来实现Set,其实就是HashMap中的Value 的Set。存入HashSet的对象必须定义其hashCode()。由于HashMap是不同步的,所以HashSet也是不同步的。其迭代性能取决于HashMap的容量,因此选择适合的容量很重要。
  • TreeSet:以树的数据结构存储的Set。基于 TreeMapNavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序(TreeSet 实例使用它的 compareTo(或 compare)方法对所有元素进行比较),具体取决于使用的构造方法。也就是说,TreeSet里面的元素都是有序的,排序方法根据构造时指定。TreeSet为基本操作(addremovecontains)提供受保证的 log(n) 时间开销。也是不同步的的。
  • LinkedHashSet:具有HashSet的查询速度,并使用链表来记录和维护元素插入的顺序,具体是维护着一个运行于所有条目的双重链接列表。LinkedHashSet由于增加了维护链接列表的开支,其性能很可能会比 HashSet 稍逊一筹,不过,由于有链表的支持,其迭代的性能只与set中的元素个数有关,而HashSet是与其容量有关。

3.  Map:相当于一种Key-》Value映射的集合。Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。

  • HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。此实现不保证顺序。
  • HashTable:与HashMap基本相同,是HashMap的同步版本。其实是HashTable先有的,后来才出了HashMap。
  • LinkedHashMap:Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序。但通过构造方法也可以改变其排序规则,有插入顺序和最近最少使用(LRU)两种。
  • TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现为 containsKeygetputremove 操作提供受保证的 log(n) 时间开销。
  • WeakHashMap:弱键Map,即如果没有Map之外的引用指向某个“键”,则此键可以被垃圾回收。
  • IdentityHashMap:使用==代替equals()对键进行比较操作的HashMap。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值