关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java容器类型使用整理

    Java容器类型使用整理

    2015-02-15 00:00:00 出处:zhanjindong的博客
    分享

    最近抽空把java.lang下面常用的那些容器类型(数据结构)复习了一下,这些东西是基础,平时使用的时候也可以很容易查得到,有些方法大概知道,但是总是弄混,如果可以记住那些重要方法,并且能够熟练使用的话,还是可以让编码过程变得容易很多。另外一个是实现机制,对于常用数据结构的实现机制,应该说是必须要熟知的。

    另外,并发容器我之前整理过,放在这篇文章里。

    Queue

    add和offer的区别在于达到上限时add抛出异常,offer返回false; remove和poll的区别在于,队列为空时前者抛出异常,后者返回空; element和peek都返回队列头部元素,但是前者失败不抛出异常,后者返回空。
    boolean add(E e);
    boolean offer(E e);
    
    E remove();
    E poll();
    
    E element();
    E peek();

    PriorityQueue,内部实现是一个Object[] queue承载的堆。

    Deque,双端队列(double-ended queue),在Queue基础上,增加了这样几个方法:

    void addFirst(E e);
    void addLast(E e);
    
    boolean offerFirst(E e);
    boolean offerLast(E e);
    
    E removeFirst();
    E removeLast();
    
    E pollFirst();
    E pollLast();
    
    E getFirst();
    E getLast();
    
    E peekFirst();
    E peekLast();
    
    boolean removeFirstOccurrence(Object o);
    boolean removeLastOccurrence(Object o);

    ArrayDequeue:数组实现,扩容策略是容量翻倍。

    List

    boolean add(E e);
    boolean remove(Object o);
    E get(int index);
    E set(int index, E element);
    void add(int index, E element);
    E remove(int index);

    ArrayList,扩容策略是(oldCapacity * 3)/2 + 1。

    LinkedList,它除了实现自List接口外,还实现了Deque接口。

    Vector,实现自List接口,内部实现是个数组,线程安全,扩容策略是(capacityIncrement > 0) (oldCapacity + capacityIncrement) : (oldCapacity * 2)。

    Stack是Vector的子类,增加了一些栈的方法:

    E push(E item)
    E pop()
    E peek()
    boolean empty()

    Map

    boolean containsKey(Object key);
    boolean containsValue(Object value);
    
    V get(Object key);
    V put(K key, V value);
    V remove(Object key);
    
    Set<K> keySet();
    Collection<V> values();
    Set<Map.Entry<K, V>> entrySet();

    SotedMap接口,key是有序的map:

    SortedMap<K, V> subMap(K paramK1, K paramK2);
    SortedMap<K, V> headMap(K paramK);
    SortedMap<K, V> tailMap(K paramK);
    
    K firstKey();
    K lastKey();

    子接口NavigableMap,提供了一些根据某个key寻找它前面或者后面的key的方法。其中floorKey/celingKey表示的关系是小于等于/大于等于,lower/higher表示的关系是严格的小于/大于:

    Map.Entry<K,V> floorEntry(K key)
    K floorKey(K key)
    Map.Entry<K,V> ceilingEntry(K key)
    K ceilingKey(K key)
    
    Map.Entry<K,V> lowerEntry(K key)
    K lowerKey(K key)
    Map.Entry<K,V> higherEntry(K key)
    K higherKey(K key)

    TreeMap是NavigableMap的直接实现子类,内部实现是一个红黑树。

    EnumMap,结构是<K extends Enum<K>, V>,内部是通过一个K[] keyUniverse和一个Object[] vals来实现的。

    HashMap,内部是数组+链表实现的,达到threshold = capacity * loadFactor时,扩容策略为:numKeysToBeAdded / loadFactor + 1。

    HashTable,实现自Dictionary和Map,方法都是线程安全的。HashTable的put方法,value不可以为空,这是它和HashMap的一个不同;再有二者找桶的hash方法不同;最后则是threshold计算逻辑相同,但它的扩容策略不同:oldCapacity * 2 + 1。HashTable、HashMap和HashSet经常被放到一起比较。

    Properties,是HashTable的子类,方法线程安全。

    IdentityHashMap,比较key不是使用equals来比较,而是使用“==”来比较,只要地址不等(即不是同一个对象)即可共存,也就是说,key是可以重复的。

    LinkedHashMap,在HashMap的基础上,又单独维护了一个双向循环链表。有一个重要参数是accessOrder,accessOrder为true时,每次调用get方法访问行为发生后,会把最近访问的对象移动到头部,而超出容量移除对象时,是从尾部开始的,利用它并且覆写boolean removeEldestEntry方法可以实现一个LRU的队列。

    WeakHashMap,但是key是weak引用,在不被使用时自动清除,扩容策略:tab.length * 2。原理上看:Entry<K,V> extends WeakReference<K> implements Map.Entry<K,V>,因此entry是弱引用的实现类,关键方法是expungeStaleEntries,它在对这个map各种操作的时候都会被调用到,而这个方法里面也是靠监听key的ReferenceQueue这个队列的状态来确定是否真的没有对象引用了。

    Set

    boolean contains(Object o);
    boolean add(E e);
    boolean remove(Object o);

    SortedSet,接口方法和SortedMap类似:

    SortedSet<E> subSet(E fromElement, E toElement);
    SortedSet<E> headSet(E toElement);
    SortedSet<E> tailSet(E fromElement);
    
    E first();
    E last();

    相应地,NavigableSet和NavigableMap类似,方法就不列出了。

    TreeSet则和TreeMap类似,其实内部实现就是一个TreeMap。

    HashSet,尤其注意的是,有两种实现,当构造方法参数小于3个时,内部使用HashMap,否则,使用LinkedHashMap。

    RegularEnumSet和JumboEnumSet,前者是普通的枚举set(用位移来表示各种组合的可能,达到空间占用最小,最大不能超过64个枚举值),后者适合数量较大的枚举set(老老实实地使用对象数组)。

    LinkedHashSet,其实和LinkedHashMap是一个东西。

    BitSet,叫set但是没有实现set的接口。用比特位来存放某个数是否存在,比如仅仅一个long,64位,就可以存放0~63的数,内部实际的数据类型是long[]。

    void flip(int bitIndex);
    void flip(int fromIndex, int toIndex);
    
    void set(int bitIndex);
    void set(int fromIndex, int toIndex, boolean value);
    
    void clear(int bitIndex);
    
    int length();
    int size();

    其中size方法返回实际使用了的比特位数目;length方法返回逻辑意义上的长度(比如表示的数里面最大是80,那么加上0,它的逻辑意义上的长度就是81)。

    扩容策略:Math.max(2 * words.length, wordsRequired)。

    Dictionary

    Enumeration<K> keys();
    Enumeration<V> elements();
    
    V get(Object key);
    V put(K key, V value);
    V remove(Object key);

    已经被废弃了,用Map来实现相同功能。

    最后这张图来自这个网站,对于从宏观上把握这些容器类型实在是太有帮助了:

    Java容器类型复习笔记

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。