Java集合基础知识

944 阅读5分钟

一、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!!!