一、Java集合简介
java集合类主要存放在java.util包中。
对应的接口为Collection和Map。
而我们常用的list、set、queue实现Collection接口类方法。
其中List集合的特点是有序、可重复(常见:ArrayList、ListedList、Vector(线程安全)、Stack(继承Vector));
Set集合的特点是无序、不可重复、内部排序(常见:HashSet、TreeSet、LinkedHashSet(继承HashSet));
Queue集合:(常见:LinkedList)
(既然有了Vector,为啥还要有Queue队列呢?
查阅资料发现:
Vector是线程安全的,根据Java设计的思路,肯定也会有非线程安全的队列,因而在java 5增加了Queue体系集合,代表一种队列集合。(后文补上两者区别。))
Map接口中存储数据,则是通过Key-value(键值映射)进行存储数据。通过put()方法进行添加数据,通过get()方法获取数据。
在Map中key值不能重复,而value运行重复。
1、Java集合和数组、链表的区别
- 集合存储的数据是对象,若常用的8种基本数据类型需存储在其中,则需自动装箱进行存储。随着数据的增加,集合会自动进行扩容。适用于无法预知数据大小的场景。原理上其内存的存储结构是数组或链表。
- 数组,在通过初始化后,其所存储的数据则固定下来,因而适用于存储可预测数据大小的数据。可存储基本数据类型也可存储引用数据类型。
- 链表,可存储基本数据类型,也可存储引用数据类型。
2、Java集合类之间的继承关系
Java的集合类由两个接口派生而出:Collection和Map。具体结构如下:
(图片来之:github.com/LRH1993/and…)
Collection接口常见的实现类和接口详细结构如下:
图中,常使用的是:ArrayList、LinkedList、HashSet、TreeSet,具体实现原理记得多看看源码!!
Map接口中的实现类和继承的接口:
常使用的实现类:HashMap、Hashtable、LinkedHashMap、TreeMap
(记得还要了解下HashMap的同步集合,ConcurrentHashMap)
对于集合,还需要了解哪些集合是线程安全、哪些集合是非线程安全。
还需要了解集合的存储效率、以及查询效率
二、Collection接口
1、简介
1.1 Collection中常见的方法有很多,具体如下:
1.2 使用Iterator遍历集合元素汇
常见的方法:hasNext()、next()
2、Set集合
Set集合与Collection集合基本相同,没有提供任何额外的方法。
记住:Set集合不允许包含相同的元素,原因是因为其底层源码使用的是Map的key值进行存储。
3、List集合
list集合存储的是一个元素有序、可重复的集合,每个元素都有相对应的顺序索引,类似数组下标。
在list中新增的方法有很多,常见的如下:
void add(int index, Object element);//添加元素
boolean addAll(int index, Collenction<? extneds E> c);//将集合C中的所有元素都插入到到列表从指定位置index进行插入
Object get(int index);//返回列表中指定位置的元素
Obejct remove(int index);//移除列表中指定位置的元素
Object set(int index, Object element);//用指定元素替换列表中指定位置的元素
Object[] toArray();//返回按适当顺序包含列表中的所有元素的数组。在list中常会有与数组进行转换。
(1)list转数组
String[] array = new String[list.size()];
- 使用for循环
int k = 0;
for(String i : list)
array[k ++] = i;- 使用toArray()方法
String[] array = list.toArray(new String[list.size());注意此处转换必须都是引用数据类型,不可为基本数据类型数组。
(2)数组转list
- 使用for循环
for(String str : array)
list.add(str);- 使用asList()
ArrayList<String> al = new ArrayList<String>(Arrays.asList(array));- 使用asList()
List<String> list = Arrays.asList(array);这种情况下,返回的列表的大小是固定的。
该列表返回的不是java.util.ArrayLsit,而是定义在java.util.Arrays中的一个私有静态类。因而该数组只能查询和修改,不能进行插入和删除操作,否则会报错:java.lang.UnsupportedOperationException。
- 使用Collections.addAll()
List<String> list = new ArrayList<String>(array.length);
Collecitons.addAll(list, array);4、Queue集合
Queue的实现类这种数据结构,队列通常是指“先进先出”的容器。该接口常用的方法:
add()(插入元素,成功返回true)、element()(得到队头元素,不移除)、offer()(插入元素,效率高于add())、peek()(获得队头元素,不移除)、poll()(获得对头元素,并移除该元素)、remove()(移除队头元素)
Queue类和Vector的区别
- Queue是一个接口,LinkedList是实现该接口的类;Vector是List中的实现类
- Vector是线程安全的,Linkedlist是线程不安全的。但是LinkedList是双向链表存储,速度相对Vector快。Vector同步机制是Synchronized。
三、Map集合
Map保存具有映射关系的数据,因而其中保存两种数据,其中key的数据不允许重复,而Value数据可以重复。
Map集合与Set集合、Lisk集合的关系。
- 与Set集合的关系
Set集合的底层存储结构是利用Map的key进行存储。
因为Set集合中不允许存在重复的元素,而Map集合中的key同样不允许存储相同的元素。
- 与List集合的关系
Map的所有value放在一起,它们非常类似一个list,但list的底层存储结构不是Map!!!