JAVA后端架构—《集合体系》

1. Collection

最基本的集合接口
一个Collection代表一组Object的集合

public interface Collection<E> extends Iterable<E>
java.util.Collection的子接口包括: 
java.util.Set 
    java.util.SortedSet 
    java.util.NavigableSet 
java.util.Queue 
    java.util.concurrent.BlockingQueue 
    java.util.concurrent.TransferQueue 
java.util.Deque 
    java.util.concurrent.BlockingDeque

任何实现Collection接口的类,都必须实现iterator方法来提供遍历集合中的元素

Iterator<T> iterator();

例如List中集合的遍历可以采用如下方式

List<String> stringList = Arrays.asList(array);
Iterator<String> iterator = stringList.iterator();
while(iterator.hasNext()){
    System.out.printf(iterator.next());
}

值得注意的是,Collection和Collectors的区别,Collection是集合的接口,所有的集合类都实现该接口;Collectors是一个类,提供了sort方法对集合进行排序。

1.1.List

List代表元素有序,可重复的集合,集合中每个元素都有对应的顺序索引,允许加入重复元素,通过索引指定元素的位置,实现有ArrayList,Vector,Queue。

1.1.1 ArrayList

ArrayList是基于数组的实现,封装了一个动态增长,允许再分配的Object[]数组。

1.1.2 Vector
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

使用方法和ArrayList基本相同,子类有Stack。和ArrayList区别是Vector是线程安全的,对集合元素操作的时候都加了Synchronized,保证线程的安全;在扩容时,Vector默认增长一倍的容量,而List只增长50%;

1.1.2.1 Stack

stack(栈)实现了Vector类,后进先出。

1.1.3 LinkedList
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

实现List接口,Deque接口;基于链式的存储方式

1.2 Queue

queue用于模拟队列这种数据结构,先进先出。

1.2.1PriorityQueue

最大堆,最小堆,基于数据的完全二叉树实现

1.2.2 Deque

1.2.2.1 LinkedList

实现了List和Deque(双端队列Deque继承了Queue接口)两个接口。它可以作为List和Queue使用,也可以作为栈进行使用。

1.3 Set

Set继承Collection接口,不能包含重复元素,Set判断两个对象不是使用==来判断,是使用equals方法,新加入的元素会与已有的元素判断equals比较返回false则加入,否则拒绝加入;所以使用Set的时候有两点需要注意:1.放入的对象要实现equals方法;2.对set的构造函数中,传入的Collection参数不能包含重复的元素。

1.3.1 HashSet

HashSet实现了Set接口,由哈希表提供支持,不保证Set的迭代顺序;允许使用null值,同时不允许元素有重复,因为HashSet底层是使用HashMap来实现的,HashSet中的元素都存放在HashMap的key上面,value是一个统一的静态变量;

HashSet中添加元素调用add方法,然后会调用HashMap的put方法插入元素,HashMap的put方法插入元素时,会首先判断是否存在key,如果不存在,则插入这个key-value,存在则修改value值;在set中,value值没用,因此往HashSet中添加元素,首先判断key是否存在,不存在插入元素,存在则不做处理;
HashSet使用Hash算法存储集合中的元素,具有很好的查找和存取性能。向HashSet中存入一个元素时,HashSet调用对象的HashCode方法获取对象的HashCode值,根据HashCode值决定对象的存储位置。HashSet判断元素对象是否相同的方法是同时使用HashCode和equals方法来判断,关于equals方法和HashCode的说明:

1.equals相等的对象,hashCode一定相等;

2.equals不相等的对象,hashCode可能相等,也可能相等。(哈希生成的时候产生碰撞)

3.反之,HashCode不相等,则equals方法一定不相等(如果equals相等则与规则1矛盾);

4.HashCode相等,equals可以相等,也可以不相等。

HashSet判断元素相等方法时,首先判断两个对象的HashCode是否相等,如果不相等,则认为两个对象也不相等,如果相等再判断equals方法是否相等;如果hashCode相等,equals方法不相等,则认为时不同的对象;为什么这样做,主要是为了提高效率,HashCode的效率比equals效率更高,不必每次重新计算Hash值.

1.3.1.1 linkedHashSet

linkedHashSet继承自HashSet,同时使用链表来维护元素的顺序,元素以插入的顺序进行访问;在性能上略低于HashSet,但在迭代访问时有很好的性能;

1.3.2 SortedSet

主要用于排序操作,实现此接口的子类都属于排序子类。

1.3.2.1 TreeSet

基于SortedSet,底层实现是通过二叉树,插入的元素要实现Comparable接口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,849评论 0 13
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 707评论 0 2
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 820评论 0 1
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 736评论 0 1
  • 在编程中,常常需要集中存放多个数据。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于...
    一一一二二三阅读 388评论 0 1