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本质上是一种东西