一、集合
顶级接口是Collection,子接口List、Set、Queue
1. List
- 有序、存储重复元素
- ArrayList—底层基于数组实现,默认初始容量为10,且每次扩容一半。增删效率低,查询效率高
- LinkedList—底层基于节点,通过地址值指向来维系节点。增删效率高,查询效率低
- Vector—最早的集合类,底层基于数组实现,初始容量为10,每次扩容默认翻倍。
- Stack—继承于Vector
2. Set
- HashSet—底层基于数组+链表(HashMap),初始容量16,加载因子默认0.75,容量每次扩容翻倍。不能存储重复元素,且不能保证迭代顺序恒久不变(rehash)
- LinkedHashSet—记录元素存储的位置。
- TreeSet—可以对存储的元素进行排序(Comparable接口中重写compareTo)
- 比较器—Comparator重写compare
- 迭代器—底层根据指针挪动遍历(增强for循环底层 基于迭代器实现,是jdk1.5的新特性)
- Queue—队列
二、泛型
参数化类型
jdk1.5的新特性
1. 泛型擦除(编译时期)
指定为具体类型之后支持操作指定类型的数据
2. 泛型上下限
- <? extends 类/接口>---泛型可以指定为类以及子类/接口以及子接口
- <? super 类/接口>---泛型可以指定为类以及父类/接口以及父接口
三、映射(Map<K,V>)
可以存储多个具有映射关系的容器
K代表键的类型,V代表值的类型
键不能重复但是值可以重复
由键一定乐意得到对应的值,映射(容器)由多个键和多个值来组成
把键和值当作成键值对来看待
为了搞笑的操作映射的数据,把键值对看做成对象,需要抽取成代表键值对的类(entry),这个类产生的对象就是真实的键值对,映射由多个键值对来组成
- 映射的遍历
- 通过获取所有的键获取所有的值
//创建映射对象
Map<String,Integer> map = new HashMap<>();
map.put("abc",123);
map.put("bc",13);
map.put("ac",23);
map.put("ab",12);
map.put("ab1c",1243);
map.put("1abc",273);
//获取映射中所有的键
//把所有的键放到Set集合中
Set<String> set = map.keySet();
//遍历集合
for (String s:set) {
//通过键获取值
System.out.println(s+"="+map.get(s));
}
- 通过获取所有的键值对来获取键和值
//获取映射中所有键值对放到Set集合中
Set<Map.Entry<String, Integer>> set = map.entrySet();
for (Map.Entry<String, Integer> m:set) {
//System.out.println(m);
System.out.println(m.getKey()+"="+m.getValue());
}
- 常用
for (Map.Entry<String,Integer> m:map.entrySet()) {
//System.out.println(m);
System.out.println(m.getKey()+"="+m.getValue());
}
Map接口是映射的顶级接口
实现类
- HashMap
- 允许存储null值和null键
- 底层基于数组+链表,不能重复元素且无序
- 默认初始容量为16,默认加载因子0.75,每次扩容是在原容量的基础上增加一倍
- 可以指定初始容量,如果指定容量范围值是2n~ 2n+1之内,底层真实的容量值是 2n+1值
- 异步式线程不安全的映射
2.Hashtable - 最早打的映射类(jdk1.0)
- 不能存储null值和null键
- 默认初始容量为11,默认加载因子为0.75,每次扩容是在原容量的基础上增加一倍再加1
- 指定初始容量值为多少,底层真实容量之就为多少
- 同步式线程安全的映射
注意
映射不是集合,二者没关系