java集合概述

   


左边为简易图,右边为详细图
List的实现类有哪些?底层分别是用什么实现的?他们之间有什么区别?什么时候用哪个?
---|Collection: 单列集合  
     ---|List: 有存储顺序, 可重复  
         ---|ArrayList: 数组实现, 查找快, 增删慢  
                     由于是数组实现, 在增和删的时候会牵扯到数组  
                                         增容, 以及拷贝元素. 所以慢。数组是可以直接  
                                         按索引查找, 所以查找时较快  
         ---|LinkedList: 链表实现, 增删快, 查找慢  
                     由于链表实现, 增加时只要让前一个元素记住自  
                                        己就可以, 删除时让前一个元素记住后一个元  
                                        素, 后一个元素记住前一个元素. 这样的增删效  
                                        率较高但查询时需要一个一个的遍历, 所以效率  
                                         较低  
         ---|Vector: 和ArrayList原理相同, 但线程安全, 效率略低  
                      和ArrayList实现方式相同, 但考虑了线程安全问  
                                         题, 所以效率略低  
     ---|Set: 无存储顺序, 不可重复  
         ---|HashSet  
         ---|TreeSet  
         ---|LinkedHashSet  
---| Map: 键值对  
 ---|HashMap  
 ---|TreeMap  
 ---|HashTable  
 ---|LinkedHashMap


Collection(单列集合)
    List(有序,可重复)
        ArrayList
            底层数据结构是数组,查询快,增删慢
            线程不安全,效率高
        Vector
            底层数据结构是数组,查询快,增删慢
            线程安全,效率低
       LinkedList
           底层数据结构是链表,查询慢,增删快
           线程不安全,效率高
   Set(无序,唯一)
       HashSet
           底层数据结构是哈希表。
           哈希表依赖两个方法:hashCode()和equals()
           执行顺序:
               首先判断hashCode()值是否相同
                   是:继续执行equals(),看其返回值
                       是true:说明元素重复,不添加
                       是false:就直接添加到集合
                   否:就直接添加到集合
           最终:
               自动生成hashCode()和equals()即可
                      
           LinkedHashSet
               底层数据结构由链表和哈希表组成。
               由链表保证元素有序。
               由哈希表保证元素唯一。
       TreeSet
           底层数据结构是红黑树。(是一种自平衡的二叉树)
           如何保证元素唯一性呢?
               根据比较的返回值是否是0来决定
           如何保证元素的排序呢?
               两种方式
                   自然排序(元素具备比较性)
                       让元素所属的类实现Comparable接口
                   比较器排序(集合具备比较性)
                       让集合接收一个Comparator的实现类对象
 Map(双列集合)
   A:Map集合的数据结构仅仅针对键有效,与值无关。
   B:存储的是键值对形式的元素,键唯一,值可重复。
          
   HashMap
       底层数据结构是哈希表。线程不安全,效率高
           哈希表依赖两个方法:hashCode()和equals()
           执行顺序:
               首先判断hashCode()值是否相同
                   是:继续执行equals(),看其返回值
                       是true:说明元素重复,不添加
                       是false:就直接添加到集合
                   否:就直接添加到集合
           最终:
               自动生成hashCode()和equals()即可
       LinkedHashMap
           底层数据结构由链表和哈希表组成。
            由链表保证元素有序。
            由哈希表保证元素唯一。
   Hashtable
       底层数据结构是哈希表。线程安全,效率低
           哈希表依赖两个方法:hashCode()和equals()
           执行顺序:
               首先判断hashCode()值是否相同
                   是:继续执行equals(),看其返回值
                       是true:说明元素重复,不添加
                       是false:就直接添加到集合
                   否:就直接添加到集合
           最终:
               自动生成hashCode()和equals()即可
   TreeMap
       底层数据结构是红黑树。(是一种自平衡的二叉树)
           如何保证元素唯一性呢?
               根据比较的返回值是否是来决定
           如何保证元素的排序呢?
               两种方式
                   自然排序(元素具备比较性)
                       让元素所属的类实现Comparable接口
                   比较器排序(集合具备比较性)
                       让集合接收一个Comparator的实现类对象
      
 .关于集合选取原则
 是否是键值对象形式:
   是:Map
       键是否需要排序:
           是:TreeMap
           否:HashMap
       不知道,就使用HashMap。
              
   否:Collection
       元素是否唯一:
           是:Set
               元素是否需要排序:
                   是:TreeSet
                   否:HashSet
               不知道,就使用HashSet
                      
           否:List
               要安全吗:
                  是:Vector
                  否:ArrayList或者LinkedList
                      增删多:LinkedList
                      查询多:ArrayList
                  不知道,就使用ArrayList
      不知道,就使用ArrayList
             
a中 collection 与 collections 的区别
java.util.Collection 是一个集合接口
java.util.Collections 是一个包装类

有些说法认为LinkedList做插入和删除更快,这种说法其实是不准确的:这个说法不是绝对的
(1)LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址
(2)ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址
所以,如果待插入、删除的元素是在数据结构的前半段尤其是非常靠前的位置的时候,LinkedList的效率将大大快过ArrayList,因为ArrayList将批量copy大量的元素;越往后,对于LinkedList来说,因为它是双向链表,所以在第2个元素后面插入一个数据和在倒数第2个元素后面插入一个元素在效率上基本没有差别,但是ArrayList由于要批量copy的元素越来越少,操作速度必然追上乃至超过LinkedList。

从这个分析看出,如果你十分确定你插入、删除的元素是在前半段,那么就使用LinkedList;如果你十分确定你删除、删除的元素在比较靠后的位置,那么可以考虑使用ArrayList。如果你不能确定你要做的插入、删除是在哪儿呢?那还是建议你使用LinkedList吧,因为一来LinkedList整体插入、删除的执行效率比较稳定,没有ArrayList这种越往后越快的情况;二来插入元素的时候,弄得不好ArrayList就要进行一次扩容,记住,ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作。


 
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值