为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类。
集合类和数组不一样,数组元素既可以是基本数据类型的值,也可以是对象;而集合中只能保存对象。
集合分类
集合大致可分为Set、List、Queue、Map四种体系。(暂时没学Queue,这里就先不说了)
- Set:代表无序、不可重复的集合
- List:代表有序、重复的集合
- Map:代表具有映射关系的集合
- Queue:代表一种队列集合的实现
这些集合类主要由两个接口派生而出,Collection和Map。它们是Java集合框架的根接口
继承树
泛型
Java集合有个缺点,把一个对象丢进集合后,集合会忘记这个对象的数据类型,再次取出时,系统自动把它变成了Object类型。
为了解决这种问题,泛型出现了。
Java引入了参数化类型的概念,允许程序在创建集合时指定集合元素的类型,Java的这种参数化类型被称为泛型。如:List<String>表明这个List中只能保存字符串类型的对象。
需要注意的是,泛型只能是对象,所以如果想保存基本数据类型时,可以使用基本类型的包装类。如List<Integer>等
List
ArrayList和LinkedList
1.ArrayList以数组的形式组装列表
2.LinkedList以链表的形式组装列表
ArrayList插入删除的算法复杂度O(n)
LinkedList插入的算法复杂度O(1)
所以,如果列表需要频繁的进行插入和删除操作时,使用LinkedList更有优势
ArrayList通过下标访问元素的算法复杂度O(1)
LinkedList通过下标访问元素的算法复杂度O(n)
如果列表需要频繁的进行查找操作时,使用ArrayList更有优势
set
HashSet和TreeSet
HashSet 哈希,暂时先理解为无序
TreeSet 二叉排序树(当遍历TreeSet的时候,自动按照 左子树—根—右子数 顺序进行遍历)
如果对顺序要求不高的,可以使用HashSet,效率比较高
如果对顺序有要求,则建议使用TreeSet。遍历时自动按照固定的顺序输出
Map
Map的泛型需要两个参数 一个是Key键 一个是Value值。
Map中的泛型一般第一个参数的类型为String第二个参数的类型为Object
比如
Map<String,Object> map = new HashMap<String,Object>(); map.put("age", 40); // key: String value: Integer map.put("weight", 123.4); // key: String value: Double map.put("married", true); // key: String value: Boolean System.out.println(map);
Hashtable和HashMap
1.线程安全。Hashtable是线程安全的,而HashMap则是线程不安全的
2.运行的速度。HashMap速度较快,而Hashtable速度较慢
3.如果在单线程的环境下,考虑使用HashMap,如果在多线程的环境下,考虑使用Hashtable
4.Hashtable的key不能为null,HashMap的key可以为空