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

全部评论

相关推荐

繁华的街道两旁,湿漉漉的下午,两个青涩的脸庞互相张望。宽大卫衣下娇小的她,向我奔来。不约而同的卫衣,斯文的半框眼镜掩饰着一个穷臭屌丝气息。这是我和我牛爱网第一死忠粉兼专属女嘉宾最初的见面。火速恋爱,但是没有所谓的快节奏,相识半年,还是一样的热恋。吃着肉夹馍坐过西安的小三轮洱海边自行车的气球胖吃着她最喜欢的酸酸水果和小乳扇在南山某店爷爷穿孙子衣服,摸肥猫就算我在忙也要抽出时间陪她去吃他喜欢的漂亮饭生活总是平凡,但平凡不平淡还记得见面第一件事儿:“我去上个厕所。”现在早上第一件事儿:“拉*”第一次上我车的她:“我可以坐副驾吗?”现在的她:“老子把jio翘到上面得得挡到你后视镜。”这小孩,虽然花了我...
Stan_蹒跚者:确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务