java容器

集合框架的接口

集合框架中的类

集合类型 描述
ArrayList 一种可以动态增长和缩减的索引序列
LinkedList 一种可以在任何位置进行高效地插人和删除操作的有序序列
ArrayDeque 一种用循环数组实现的双端队列
HashSet 一种没有重复元素的无序集合
TreeSet —种有序集
EnumSet 一种包含枚举类型值的集
LinkedHashSet 一种可以记住元素插人次序的集
PriorityQueue 一种允许高效删除最小元素的集合
HashMap 一种存储键 / 值关联的数据结构
TreeMap —种键值有序排列的映射表
EnumMap 一种键值属于枚举类型的映射表
LinkedHashMap 一种可以记住键 / 值项添加次序的映射表
WeakHashMap 一种其值无用武之地后可以被垃圾回收器回收的映射表
IdentityHashMap 一种用 = =而不是用 equals 比较键值的映射表

具体的集合

LinkedList

实现了 List 接口和 Deque(继承Queue)接口,LinkedList 底层由双向链表实现,优势:插入和删除一个元素的代价小。可用LinkedList实现栈和队列。

ArrayList

实现了List接口,ArrayList封装了一个动态再分配的对象数组。优势:使用get和set快速随机访问每个元素。

HashSet

没有重复元素的元素集合,底层由散列表实现,由于散列将元素分散在表的各个位置上,所以访问它们的顺序几乎是随机的。只有不关心集合中元素的顺序时才应该使用 HashSet。

TreeSet

TreeSet是一个有序集合,可以以任意顺序将元素插入到集合中。在对集合进行遍历时, 每个值将自动地按照排序后的顺序呈现。排序使用红黑树结构完成的。

ArrayDeque

双端队列,实现了 Deque 接口。

PriorityQueue

优先级队列中的元素可以按照任意的顺序插人,却总是按照排序的顺序进行检索。无论何时调用 remove 方法,总会获得当前优先级队列中最小的元素。然而,优先级队列并没有对所有的元素进行排序。优先级队列底层使用了堆(heap)。
与 TreeSet —样, 一个优先级队列既可以保存实现了 Comparable 接口的类对象, 也可以保存在构造器中提供的 Comparator 对象。

HashMap 和 TreeMap

HashMap 和 TreeMap 。这两个类都实现了 Map 接口。散列映射对键进行散列, 树映射用键的整体顺序对元素进行排序, 并将其组织成搜索树。与集一样, 散列稍微快一些, 如果不需要按照排列顺序访问键, 就最好选择散列。
键必须是唯一的。不能对同一个键存放两个值。 如果对同一个键两次调用 put 方法, 第二个值就会取代第一个值。put 将返回用这个键参数存储的上一个值。

WeakHashMap

WeakHashMap 使用弱引用(weak references)保存键。WeakReference 对象将引用保存到另外一个对象中, 在这里, 就是散列键。对于这种类型的对象, 垃圾回收器用一种特有的方式进行处理。通常, 如果垃圾回收器发现某个特定的对象已经没有他人引用了, 就将其回收。然而, 如果某个对象只能由 WeakReference 引用, 垃圾回收器仍然回收它,但要将引用这个对象的弱引用放人队列中。WeakHashMap 将周期性地检查队列, 以便找出新添加的弱引用。一个弱引用进人队列意味着这个键不再被他人使用, 并且已经被收集起来。于是, WeakHashMap 将删除对应的条目。

linkedHashSet 和 LinkedHashMap

LinkedHashSet 和 LinkedHashMap类用来记住插人元素项的顺序。当条目插入到表中时,就会并人到双向链表中:

链接散列映射将用访问顺序, 而不是插入顺序, 对映射条目进行迭代。每次调用 get 或 put, 受到影响的条目将从当前的位置删除, 并放到条目链表的尾部(只有条目在链表中的位置会受影响, 而散列表中的桶不会受影响。一个条目总位于与键散列码对应的桶中)。

EnumSet 和 EnumMap

EmimSet 是一个枚举类型元素集的高效实现。 由于枚举类型只有有限个实例, 所以 EnumSet 内部用位序列实现。如果对应的值在集中, 则相应的位被置为 1。
EnumMap 是一个键类型为枚举类型的映射。它可以直接且高效地用一个值数组实现。

IdentityHashMap

类 IdentityHashMap 有特殊的作用。在这个类中, 键的散列值不是用 hashCode 函数计算的, 而是用 System.identityHashCode 方法计算的。 这是 Object.hashCode 方法根据对象的内存地址来计算散列码时所使用的方式。 而且, 在对两个对象进行比较时,IdentityHashMap 类使用 ==, 而不使用 equals。也就是说, 不同的键对象, 即使内容相同, 也被视为是不同的对象。

遗留的集合

  • Hashtable类与HashMap类的作用一样。
  • Enumerstion接口用来对元素遍历。
  • 属性映射(property map)。
  • 栈stack可由LinkedList代替。
  • 位集BitSet用于存放一个位序列。

迭代器

因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器模式!把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。
在Java中Iterator为一个接口,它只提供了迭代的基本规则。在JDK中它是这样定义的:对Collection进行迭代的迭代器。其接口定义如下:

package java.util;
public interface Iterator<E> {
    boolean hasNext();//判断是否存在下一个对象元素

    E next();//获取下一个元素

    void remove();//移除元素
}

Java中还提供了一个Iterable接口,Iterable接口实现后的功能是‘返回’一个迭代器,我们常用的实现了该接口的子接口有:Collection、List、Set等。该接口的iterator()方法返回一个标准的Iterator实现。实现Iterable接口允许对象成为foreach语句的目标。就可以通过foreach语句来遍历你的底层序列。
Iterable接口包含一个能产生Iterator对象的方法,并且Iterable被foreach用来在序列中移动。因此如果创建了实现Iterable接口的类,都可以将它用于foreach中。Iterable接口的具体定义:

public interface Iterable<T> {
    Iterator<T> iterator();
}

注意一个问题:

原因:https://my.oschina.net/itblog/blog/422649

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务