细说java集合

细说java集合
 
 
 
接口集成关系与实现
 
集合存放在java.util包中,主要包含三类:set(集合),list(列表:包含Queue), Map(映射)。
 
  1.  Collection: Set,List,Queue最基本的接口. 
  2. Iterator: 迭代器,可以通过迭代器遍历集合。
  3. Map: 映射的基础接口
 
 
 
List
 
 
java中的List是一种常用的集合,包含:ArrayList,Vector,LinkList,Stack。
 
ArrayList(数组实现)
     
    ArrayList是基于数组实现,申请一块连续的内存。查询速度快(根据下标索引),插入删除速度慢(需要移动元素位置)。添加元素,当元素数量超过申请的数组大小,会进行扩容,扩为原来大小的1.5倍。因此适合与元素查询,不适合与插入和删除操作。
 
Vector(数组实现,线程同步)
 
    Vector和Arraylist一样都是基于数组实现,线程安全。每个修改接口都使用同步锁,效率比较慢。Stack继承Vector,线程安全,使用栈算法(先进后出)
 
LinkedList(链表实现)
 
    LinkedList基于链表实现,很适合频繁的动态插入或删除集合数据,随机访问熟读比较慢。有专门御用操作表头和表尾的操作,可实现栈,队列和双向队列。
 
Set
 
 
    Set注重元素的唯一性,值不能重复。对象的相等性的本质是对象的hashCode的值(java根据内存地址计算出此序号)判断的。如果想让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法。
 
HashSet(hash表)
 
     HashSet依赖于HashMap实现,元素存储在Entry中(hashKey, key, value,next节点),key为想set中添加元素的值,value为Oeject对象。hash使用数组实现,存储数据,计算出元素的hash值,插入到hash表的的位置。HashSet存储元素的顺序并不是按照存入顺序的,而是按照hash值的顺序排列。元素通过hash值获取或删除。HashSet首先判断两个元素的hashCode是否相同(hashCode()),在判断两个key值是否相同(equals()),如果一样则视为同一个元素。
    如果hashCode相同,则说明元素放在同一个hash桶里面,继续比较key才能唯一确定一个元素。
 
 
 
TreeSet(红黑二叉树)
    
    TreeSet依赖于TreeMap实现。使用红黑二叉树的原理对新add()的对象按照指定的顺序排序,每增加一个元素,都会对该对象进行排序,将该对象放在合适的树节点上。基本类型按照默认的顺序进项排序,自定义类型需要实现Comparable接口中的compareTo()方法,才能正常使用。
 
LinkedHashSet(HashSet + LinkHashMap, 方法集成HashSet,底层实现完全依赖与LinkHashMap)
 
    对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。
 
Map
 
 
 
HashMap(数组+链表+红黑树)
    
    ​HashMap根据键的hashCode存储数据,大多数情况下可以直接定位到元素的值,因而有比较快的访问速度,但遍历顺序是不确定的。key和value都可以为null。HashMap非线程安全,及同一时刻有多个线程写HashMap,可能会导致数据不一致。如果要满足线程安全,可以使用Collections的synchronizedMap方法使HashMap具有线程安全的能力。下面介绍HashMap的结构:

    (1) java 7的实现方式
 
大方向上,HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。
  1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
  2. loadFactor:负载因子,默认为 0.75。
  3. threshold:扩容的阈值,等于 capacity * loadFactor。
(1) java 8的实现方式
 
 
        java 8 对HashMap进行一些修改,使用红黑数来解决hashCode冲突高时,链表访问效率查的问题。当链表中的元素超过8时,将链表结构转为红黑树,访问复杂度o(N) -->o(logN)。当元素少于6时,将红黑树结构变为链表结构。
 
 
 
HashTable(线程安全)
 
    HashTable是遗留类,很多映射的常用功能与HashMap相似,继承于Dictionary类,并且是线程安全的,并发性不如CurrentHashMap,因为ConcurrentHashMap引入和分段锁。因此,HashTable不建议在性代码中使用。不要要线程安全的场景可以使用HashMap替换,需要线程安全的场景可以用使用ConcurrentHashMap替换。
 
TreeMap(可排序的,红黑树)
    
    ​TreeMap实现了SortedMap接口,存储元素为红黑树结构。能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。如果使用排序的映射,建议使用 TreeMap。在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException 类型的异常。
 
LinkedHashMap(插入顺序排序,底层实现类似HashMap)
    
    LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 编LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值