集合学习(一)
集合简单介绍
Map接口和Collection接口是所有集合框架的父接口。
Collection接口
java中没有提供Collection接口的实现,而是让List接口和set接口去继承它。
public interface List<E> extends Collection<E>
List接口的实现类有:ArrayList、LinkedList、Vector。
public interface Set<E> extends Collection<E>
set接口的实现类有:HashSet、TreeSet、LinkedHashSet。
Map接口
Map接口的实现类有:HashMap、LinkedHashMap、HashTable、TreeMap.
List:有序,可以重复的集合。
List 接口的三个典型实现:
①、List list1 = new ArrayList();
底层数据结构是数组,查询快,增删慢;线程不安全,效率高。初始大小为10,每次扩容为原来的0.5倍。
②、List list2 = new Vector();
底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合。每次扩容为原来的1倍。
③、List list3 = new LinkedList();
底层数据结构是链表,查询慢,增删快;线程不安全,效率高
Set:无序,不可重复的集合。
1、Set hashSet = new HashSet();
①、HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL;
②、其底层其实是一个数组,存在的意义是加快查询速度。我们知道在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较,此时的查询效率依赖于查找过程中比较的次数。而 HashSet 集合底层数组的索引和值有一个确定的关系:index=hash(value),那么只需要调用这个公式,就能快速的找到元素或者索引。
(此图来源于https://blog.csdn.net/feiyanaffection/article/details/81394745)
Map:key-value 的键值对,key 不允许重复,value 可以
严格来说 Map 并不是一个集合,而是两个集合之间 的映射关系。
这两个集合没每一条数据通过映射关系,我们可以看成是一条数据。即 Entry(key,value)。Map 可以看成是由多个 Entry 组成。

因为 Map 集合即没有实现于 Collection 接口,也没有实现 Iterable 接口,所以不能对 Map 集合进行 for-each 遍历。
遍历实例:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("first", "linlin");
map.put("second", "好好学java");
map.put("third", "sihai");
map.put("first", "sihai2");
// 第一种:通过Map.keySet遍历key和value
System.out.println("===================通过Map.keySet遍历key和value:===================");
for (String key : map.keySet()) {
System.out.println("key= " + key + " and value= " + map.get(key));
}
// 第二种:通过Map.entrySet使用iterator遍历key和value
System.out.println("===================通过Map.entrySet使用iterator遍历key和value:===================");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}
// 第三种:通过Map.entrySet遍历key和value
System.out.println("===================通过Map.entrySet遍历key和value:===================");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}
// 第四种:通过Map.values()遍历所有的value,但是不能遍历键key
System.out.println("===================通过Map.values()遍历所有的value:===================");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}
1、HashMap hashMap = new HashMap();
key的值可以为null,但只有一个key为null;它是线程不安全的。
底层实现
HashMap以键值对(key-value)的形式来存储元素,在调用Put方法时,HashMap会通过hash函数来计算key的hash值,然后通过hash值来判断存储位置是否已存在元素,如果存在的话,就判断要存储的元素与当前位置元素的key是否相同,如果相同则覆盖,如果不同的话就会发送哈希冲突,将冲突的值加到链表中即可。Jdk1.8后,当链表的长度大于8时,链表转为红黑树。
红黑树
- 节点是红色或者黑色
- 根节点都是黑色
- 每个叶子的节点都是黑色的空节点
- 每个红色节点的两个子节点都是黑色的
- 从任意节点到其每个叶子的所有路径都包含相同的黑色节点

(图片来源https://www.cnblogs.com/linliquan/p/11323172.html)
2、LinkedHashMap linkedHashMap= new LinkedHashMap();
有序的,使用链表来扩展HashMap。
3、HashTable hashTable= new HashTable();
相比HashMap,它是线程安全的。除此之外,key和value的值都不能为null。
4、TreeMap treeMap= new TreeMap();
基于红黑树数据结构实现,键值使用compareTo或comparable接口来排序。
此文章借鉴的博客有:
https://www.cnblogs.com/ysocean/p/6555373.html
https://blog.csdn.net/feiyanaffection/article/details/81394745
https://www.cnblogs.com/linliquan/p/11323172.html

浙公网安备 33010602011771号