Java容器类型使用总结
作者:网络转载 发布时间:[ 2015/2/27 16:59:01 ] 推荐标签:Java 容器 软件开发
子接口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容器类型复习笔记

本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等

sales@spasvo.com