java集合框架
集合框架结构图
Collection接口
1.List
- ArrayList: 查询效率高,增删慢,且线程不安全。
- LinkedList: 查询慢,增删快,但线程安全。
- Vector: 查询快,线程安全。
1.1 ArrayList是一个的实质就是一个可变数组,它的随机访问速度是最快的。但是对随机项的插入和删除操作代价是比较昂贵的,除非变动是在ArrayList末端,原因是从数组中间删除一个元素,所有的元素都要向数组的前端移动,同理,在数组中间插入一个元素也是如此。
1.2 LinkedList,有序,用链表实现的集合,数组是在连续的存储位置上存放对象引用,但链表却将每个对象存放在独立的节点中,每个节点还存放着序列中下一个节点的引用,java语言中的链表实际上都是双向链接,每个节点还存放着指向前驱节点的引用。这样在链表中间删除一个元素是很轻松的操作,只需要对被删除元素附近的节点更新一下就可以了。
2.Set
-
HashSet: 效率高,键可以为null,值不能为null,无序的,线程不安全。
-
LinkedHashtable: 效率低。键值不可以为null,有序的,线程不安全。
HashSet是基于HashMap实现的,HashSet底层采用HashMap来保存所有元素。
HashCode和equal()是HashMap用的,因为无需排序所以只需要关注定位和唯一性即可
HashCode是用来计算hash值的,hash值是用来确定hash表索引的
Map接口
- HashMap:键值都可以为null,键不能重复,无序的,线程不安全。且只能使用foreach(增强for循环)或Iterator(迭代器)。
- Hashtable: 键值都不能为null,无序的,线程安全。且只能使用foreach(增强for循环)或Iterator(迭代器)。
Map就是映射表,映射表用来存放键值对,键必须是唯一的,不能对同一个键存放两个不同的值,如果对同一个键调用两次put方法,第二个值会取代第一个值并返回旧的值。集合框架并没有将映射表本身视为一个集合,然而我们可以获得映射表的视图,视图是实现了Cllection接口的对象的,从而用迭代器实现对Map的迭代。
三种遍历Map方法
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("abc", 1);
treeMap.put("ABC", 2);
treeMap.put("xyz", 3);
treeMap.put("XYZ", 4);
System.out.println("treeMap:" +treeMap);
System.out.println("第一种遍历方式:通过Map.keySet遍历key,通过key取出对应的value值");
for (String key : treeMap.keySet()) {
System.out.println(key + "--" + treeMap.get(key));
}
// 一键一值 => entry
System.out.println("第二种遍历方式:通过Map.entrySet使用迭代器遍历key和value");
Set<Map.Entry<String,Integer>> entrySet = treeMap.entrySet();
Iterator<Entry<String, Integer>> entrySetIt = entrySet.iterator();
while(entrySetIt.hasNext()){
Map.Entry<String, Integer> entry = entrySetIt.next();
System.out.println(entry.getKey() + "--" + entry.getValue());
}
System.out.println("第三种遍历方式:直接遍历Map.entrySet集合---容量大时使用");
for(Entry<String,Integer> entry : treeMap.entrySet()){
System.out.println(entry.getKey() + "--" + entry.getValue());
}
如何选用集合类?
- 要求线程安全,使用Vector、Hashtable
- 不要求线程安全,使用ArrayList,LinkedList,HashMap
- 要求key和value键值,则使用HashMap,Hashtable
- 数据量很大,又要线程安全,则使用Vector