Collection 体系原理

Collection的基本概念

Collection是整个collec体系的根接口,Collection  表示一组对象,这些对象也称为 collection 的元素。一些 collection  允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。

JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。  包 (bag)* 或多集合 (multiset)(可能包含重复元素的无序 collection)应该直接实现此接口。

Collection的常用方法


add(E e):添加一个元素到此collection中

addAll(Collection<? extend E>c):将指定collection中的所有元素都添加到此collection中

clear() :移除此collection中的所有元素

contains(Object o ):如果此collection包含指定的元素,则返回true

containsAll(Collection<?>c):如果此colllection包含指定Collection的所有元素,则返回true

equals (Obejct o):比较此colletion与指定对象是否相等

hashCode():返回此collection的哈希码值

isEmpty():如果此collection的不包含任何元素,则返回true

iteraator():返回在此collection的元素上进行迭代的迭代器

remove(Object o):从此collection中移除指定元素,如果存在的话

remonveAll(Collection<?>c):移除此collection中那些也包含在指定的collection中的所有元素

retainAll(Collection<?>c):仅保留此collection中那些也包含在指定collectiond的元素

size():返回此coolection的元素数

toArray():返回包含此collection中所有的元素的数组

******************************************************************************************************************************************************************

List(有序可重复)

1.概念:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

2.Arraylist

本质上就是一个数组

3.构造方法

Arraylist():构造一个初始容量为10的空列表

Arraylist(Collection<? extendsE>c):构造一个包含指定collection的元素的列表

Arraylist():构造一个包含指定初始容量的列表在一个空集合中添加另外一个集合的所有元素等价于在另外一个集合使用addAll()方法

Collection<Integer> c = new LinkedHashSet();

List<Integer>list = new ArrayList<>(c);

等价于

List<Integer> list2 = new ArrayList<>C;

list2.addAll(c);

等价于

List<Integer> list3= new ArrayList<>()

for(Integer i :c){

list3.add(i)

}

4.动态扩容的实现(面试题)

为什么要指定初始容量?

list集合看上去可以无限添加元素,但最终受到某个容量的限制,这个容量就是初始容量(里面是一个数组)。

需要初始容量的原因就是避免某些情况无限扩容导致内存满负荷直到出现故障

如何实现动态扩容?

旧容量不够时,会通过add()方法创建一个更大的容量空间,然后把所有的元素拷贝进去,而之前的数字空间就会变成垃圾

5.list的常用方法

add(E e):将指定元素添加到此列表的尾部

add(int index, E element):将指定的元素插入此列表中的指定位置

add(Collelction<? extends E> c):将指定collection的所有元素按照顺序添加到此列表的尾部

clear():移除此列表中的所有的元素

clone():返回此Arraylist实例的浅表的副本

contains(Object o):如果此列表包含指定单位的元素,则返回true

ensureCapacity(int minCapacity):如有必要,增加此ArrayList实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数

get(int index):返回此列表中指定位置的元素

indexof(Object o:返回此列表中首次出现的指定元素的索引,或,如果此列表的不包含元素则返回-1

isEmpty():判断此列表是否为空

lastIndexof(Object o):返回此列表中最后出现的指定元素的索引,或,如果此列表的不包含元素则返回-1

removeRange(int formIndex, int toIndex):移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素

set(int index, Eelment):用指定的元素替代此列表中指定位置上的元素

size():返回此列表中的元素数

toArray():按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

trimToSize():将此Arraylist实例的容量调整为当前列表的大小

********************************************************************************************************************************************************************

Set(无序不重复)

1.一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

2.当有一个集合list需要去重,新建一个set集合,将list传入

Set<Integer>set=newHashSet<>(list)

3.判断重复的方法:equlas方法

4.HashSet

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素.

构造方法:

HashSet():构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

HashSet(Collection<? extends E> c):构造一个包含指定 collection 中的元素的新 set。

HashSet(int initialCapacity):构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。

HashSet(int initialCapacity,  float loadFactor):构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子

常用方法:

add(E e):如果此 set 中尚未包含指定元素,则添加指定元素。

clear():从此 set 中移除所有元素。

clone():返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。

contains(Object o):如果此 set 包含指定元素,则返回 true。

isEmpty():如果此 set 不包含任何元素,则返回 true。

iterator():返回对此 set 中元素进行迭代的迭代器。

remove(Object o):如果指定元素存在于此 set 中,则将其移除。

size():返回此 set 中的元素的数量(set 的容量)。

Java世界⾥第⼆重要的约定:hashCode

1.同⼀个对象必须始终返回相同的hashCode

2.两个对象的equals返回true,必须返回相同的hashCode

3.两个对象不等,也可能返回相同的hashCode

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

哈希算法

哈希就是一个单项的映射,从任意对象到一个整数的hashCode,所有的HashCode的数量是有限制的(42亿个),而对象是无限种可能的,因此只能对象映射搭到一个int值

LinkedHashSet 保证顺序

*****************************************************************************************************

Map

1.将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

2.常见方法:

clear():从此映射中移除所有映射关系(可选操作)。

containsKey(Object key):如果此映射包含指定键的映射关系,则返回 true。

containsValue(Object value):如果此映射将一个或多个键映射到指定值,则返回 true。

entrySet():返回此映射中包含的映射关系的(键值对集合)Set 视图。

equals(Object o):比较指定的对象与此映射是否相等

get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。

hashCode():返回此映射的哈希码值。

isEmpty():如果此映射未包含键-值映射关系,则返回 true。

put(K key, V value):将指定的值与此映射中的指定键关联(可选操作)。

putAll(Map<? extends K,? extends V> m):从指定映射中将所有映射关系复制到此映射中(可选操作)。

remove(Object key):如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

size():返回此映射中的键-值映射关系数。

values():返回此映射中包含的值的 Collection 视图。

********************************************************************************************************************************************************************

3.Map<k,v>,k即key返回的是一个set集合

map和keyset方法之間是一个改变另外一个跟着改变的事

HashMap:基于哈希表实现的一个接口

4.HashMap如何扩容(面试)

创建一个更大的HashMap,并把原先的东西拷贝进去

5.HashMap的不安全性

扩容时,在多线程情况下,使用HashMap同时访问可能会造成HashMap死循环

要使用ConcurrentHashMap(并发的HashMap)

6.HashMap在JDK7之后变化

由链表改为红黑树

7.HashMap和Hashset本质上是一种东西

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