Collection <类型>🍉
List(Conllection的实现类) 可以重复,有顺序 可存放多个null值🥝
ArrayList 主选 🍓
结构:数组
特点:查找快,增删慢
线程不安全,效率高
Vector🍓
结构:数组
特点:查找快,增删慢
synchronized实现线程安全,效率低
Stack
结构:栈
特点:Vector的子类,也定义了自己的一些方法。
synchronized实现线程安全,效率低
LinkedList🍓
结构:链表
特点:查找慢,增删快
线程不安全,效率低
boolean add(E o) 向列表的尾部追加指定的元素
void add(int index,E element) 在列表的指定位置插入指定元素。
boolean addAll(Collection<? extends E> c) 追加指定 collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。
boolean addAll(int index,Collection<? extends E> c) 将指定collection中的所有元素都插入到列表中的指定位置。
void clear() 从列表中移除所有元素。
boolean contains(Object o) 如果列表包含指定的元素,则返回true。
boolean containsAll(Collection<?> c) 如果列表包含指定collection的所有元素,则返回true。
boolean equals(Object c) 比较指定的对象与列表是否相等。
E get(int index) 返回列表中指定位置的元素。
int hashCode() 返回列表的哈希码值。
int indexOf(Object o) 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1。
boolean isEmpty() 判断集合是否为空 如果为空 则返回true,否则返回false
Iterator<E> iterator() 返回以正确顺序在列表的元素上进行迭代的迭代器。
int lastIndexOf(Object o) 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1。
ListIterator<E> listIterator() 返回列表中元素的列表迭代器(以正确的顺序)。
ListIterator<E> listIterator(int index)返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。
E remove(int index) 移除列表中指定位置的元素。
boolean remove(Object o) 移除列表中出现的首个指定元素。
boolean removeAll(Collection<?> c) 从列表中移除指定collection中包含的所有元素。
boolean retainAll(Collection<?> c)仅在列表中保留指定collection中所包含的元素。
E set(int index,E element) 用指定元素替换列表中指定位置的元素。
int size() 返回列表中的元素数。
List<E> subList(int forIndex,int toIndex) 返回列表中指定的formIndex(包括) 和toIndex(不包括)之间的部分视图。
Object toArray() 返回以正确顺序包含列表中的所有元素的数组。
Set(Conllection的实现类) 唯一性,没有顺序 只可存放一个null值🥝
HashSet 🍓
结构:哈希表
通过hashCode()、equals()保证元素的唯一性
元素的排列是无序的 线程不安全
基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素
LinkedHashSet
结构:链表+哈希表
与HashSet相比,由链表保证元素有序
线程不安全
TreeSet
结构:红黑树
排序方法有自然排序、比较器排序
唯一性通过存放值时比较返回值是否为0,0既有相同值
线程不安全
TreeSet实现了对TreeMap的封装
实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆
Hash值冲突🍉
hash值冲突是发生在put()时,hash值是通过hash(key.hashCode())来获取的,因为hashCode是int类型,所以最多只能说2^32个,当put的元素越来越多时,出现不同的key产生相同的hash值问题,也即是hash冲突。
分离链表法🥝
对于相同的哈希值,使用链表进行连接。使用数组存储每一个链表。
put的时候地址上存在value,则再对比key是否相同,若hash值和key都相同,则替换value,若hash值相同,key不相同,则形成一个单链表,将hash值相同,key不同的元素以Entry<V,V>的方式存放在链表中,这样就解决了hash冲突。
开放地址方法🥝
按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上往后加一个单位,直至不发生哈希冲突。
equals 和 hashCode区别:🥝
-
在Object类中,hashCode是一个本地方法简单理解为获取对象地址,equals方法比较自己和obj对象地址是否相 等。在这里一定先认识到这两个方法,一个是取地址,一个是比较地址。equals()和hashCode()都不是final方法。
-
hashCode()是一个native方法,而且返回值类型是整形;该native方法将对象在内存中的地址作为哈希码返回,可以保证不超出整形范围的情况下不同对象的返回值不同。
-
当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则将该对象加入到链表中。
注:当我们把自定义类作为Map的Key的时候,需要重写HashCode跟equals方法,原因是要遵循equals相等,hashCode也一定相等,hashCode相等,equals不一定相等的规则。String就重写的这两个方法。
Map<key,value>🍉
HashMap 主选🥝
结构:哈希表(数组+链表)
无序的 只允许一个key为null,可多个值为null
线程不安全
采用分离链表法解决冲突
通过hashCode()、equals()保证元素的唯一性,hashCode()确定数组位置,equlas()确定是否可存放在链表。
实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
JDK1.8增加了红黑树来进行优化。即当链表超过8时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能。
缺点:多线程put会陷入死循环,因为Entry链表形成环形数据结构,查找时会陷入死循环。用迭代器遍历时修改集合结构会发生错误。
遍历方法:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
LinkedHashMap 🍓
结构:数组+双链表
与HashMap相比,LinkedHashMap 的元素是有序的,在LruCache中有使用,因为是LRU,最近最少使用算法需要支持有序。
HashTable🥝
结构:哈希表
key还是value都不能为null
synchronized实现线程安全
实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆
TreeMap🥝
结构:红黑树
排序方法有自然排序、比较器排序
线程不安全 可以插入null键,null值;
无序集合(插入和遍历顺序不一致)
常用方法:
void clear() 从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o) 比较指定的对象与此映射是否相等。
V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode() 返回此映射的哈希码值。
boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true。
Set<K> keySet() 返回此映射中包含的键的 Set 视图。
V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size() 返回此映射中的键-值映射关系数。
Collection<V> values() 返回此映射中包含的值的 Collection 视图。
Queue FIFO队列🥝
操作失败就抛出异常
add(E e):添加一个元素到队尾
remove():获取队首的元素,并从队列中移除
element():获取队首的元素,但不从队列中移除
这一组,成功返回true,失败时返回一个特殊值(取决于操作,为NULL或false),offer(E e)操作是专为容量受限的队列实现而设计的;在大多数实现中,插入操作不会失败。
offer(E e):添加一个元素到队尾
poll():获取队首的元素,并从队列中移除
peek():获取队首的元素,但不从队列中移除
迭代器(Iterator)🥝
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
hasNext():判断当前元素是否存在,并没有指向的移动
next():返回当前元素, 并指向下一个元素
使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。