介绍集合之前,先扯一下数组Array和集合的区别:
数组是大小固定的,并且同一个数组只能存放类型一样的数据。(基本类型/引用类型)。
集合可以存储、操作数目不固定的一组数据。
若程序有时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。
二者使用相应的toArray()和Arrays.asList()方法可以相互转换。
一、什么是集合?集合有哪些
- 集合类存放于java.util包中。
- 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
- 集合类型主要有3种:set、list、map。
二、粗谈Set List Map的区别(面试有时会问到)
List
和Set
是存储单列数据的集合,Map
是存储键值对这样的双列数据的集合List
中存储的数据是有顺序的,并且值允许重复。Map
中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的。Set
中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set
集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。
三、集合的构成
- List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
- List 接口有三个实现类
1.1.LinkedList (基于链表实现,链表内存是散列的,增删快,查找慢)
1.2.ArrayList (基于数组实现,非线程安全,效率高,增删慢,查找快)
1.3.Vector (基于数组实现,线程安全,效率低,增删慢,查找慢)
2. Map 接口有四个实现类
2.1.HashMap (基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键)
2.2.HashTable (线程安全,低效,不支持 null 值和 null 键)
2.3.LinkedHashMap (是 HashMap 的一个子类,保存了记录的插入顺序)
2.4.SortMap
接口 (TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序)
3. Set
接口有两个实现类
3.1.HashSet (底层是由 Hash Map 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hash Code()方法)
3.2.LinkedHashSet (继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap)
- Collection接口下还有个Queue接口,有PriorityQueue类
补充:HashMap
和 HashTable
HashMap
是线程不安全的
,HashMap 是一个接口,是 Map的一个子接口,是将键映射到值得对象,
不允许键值重复,允许空键和空值;由于非线程安全, HashMap的效率要较 HashTable 的效率高一些
.
HashTable 是线程安全的一个集合
,不允许 null 值作为一个 key 值或者 Value 值;
HashTable 是 sychronize(同步化),多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;
四、集合的用法
- List
// 申明一个list,Object:指List里的值是什么类型的,Object代表可以是任何形式的
List<Object> list = new ArrayList<Object>();
// add() 集合里添加数据
list.add("张三");
list.add("李四");
list.add("王五");
// 拿数据 get()
list.get(0) 结果:张三
// 集合大小(集合里数据个数),size()
list.size()
//list 遍历
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
// 注意:list取值是通过下标,是从0开始的
- map
// 声明一个map
//说明:Map是通过key-value(值键对) ,String代表key的类型(一般都是String),Object代表value的类型
Map<String,Object> map = new HashMap<String,Object>();
// 赋值 put(key,value)
map.put("name", "小明");
map.put("sex", "男");
map.put("age", 18);
// 取值 get(key)
map.get("name") 结果:小明
- List<map>
// 声明一个list<Map>
List<Map<String,Object>> listMap = new ArrayList<Map<String,Object>>();
// 赋值 先给map赋值,然后把map添加到list中
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("name", "小明");
map1.put("sex", "男");
map1.put("age", 18);
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("name", "小红");
map2.put("sex", "女");
map2.put("age", 16);
listMap.add(map1);
listMap.add(map2);
结果:[{sex=男, name=小明, age=18}, {sex=女, name=小红, age=16}]
// 遍历
for(int i = 0;i<listMap.size();i++){
System.out.print(listMap.get(i).get("name"));
System.out.print(listMap.get(i).get("sex"));
System.out.print(listMap.get(i).get("age"));
System.out.println();
}