目录
1、前言
Java是面向对象的语言,我们在编程的时候需要存储对象的容器,数组可以满足这个需求,但是数组初始化时长度是固定的,但是我们往往需要一个长度可变化的容器,因此,集合出现了。
1.1集合与数组的区别
(1)长度区别:集合长度可变,数组长度不可变
(2)内容区别:集合可存储不同类型元素,数组存储只可单一类型元素
(3)元素区别:集合只能存储引用类型元素,数组可存储引用、基本类型
1.2集合概述
Java集合框架图如下图所示:
可见所有集合实现类的最顶层接口为Iterable和Collection接口,再向下Collection和Map,Collection分为了三种不同的形式,分别是Lise,Queue和Set接口,然后是对应不同的实现类。
2、Collection接口(单列集合)
- Collection集合概述
o 是单列集合的最顶层接口,这些对象也称为Collection的元素
- Collection集合基本使用
- Collection集合的常用方法
接口 | 作用 |
---|---|
int size(); | 长度 |
boolean add(E e); | 添加元素 |
boolean isEmpty(); | 是否为空 |
boolean contains(Objoect o); | 是否包含某元素 |
boolean remove(Objoect o); | 删除 |
void clear(); | 清楚所有元素 |
Iterator <E>iterator(); | iterator接口 |
Object[ ]toArray(); | 转换为数组 |
<T>T[ ]toArray(T[ ]arr); |
2.1List接口
- List集合的概述
o 有序(也称为序列),List的行为和数组几乎完全相同:内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,索引和数组一样,都是从0
开始
- List集合的特点
o ①有索引值 ②可以存储重复元素(元素可重复,通过.equals()比较是否重复) ③元素存取有序
- List集合的特有方法
o 利用索引(index)定义
方法名 | 描述 |
---|---|
void add(int inde,E e); | 给指定索引位置添加元素 |
E get(int inde); | 获取索引值位置的元素 |
E set(int inde,E e); | 修改指定索引处的元素,返回被修改的元素 |
E romove(int inde); | 删除指定索引处的元素,返回被删除的元素 |
2.1.1 ArrayList实现类
- ArrayList数据结构
o 底层是数组
- ArrayList特点
o 查询快,增删慢,主要用于查询遍历数据,为最常用集合之一
- ArrayList底层分析
o数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快;数组初始化时长度时固定的,想要增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。
2.1.2 LinkedList实现类
- LinkedList数据结构
o 底层是双向链表
- LinkedList特点
o 查询慢,增删快
- LinkedList底层分析
o链表分为单向链表和双向链表,也就是一条链子和两条链子的区别:①多出的那条链子记录了元素顺序,因此单向链表时无序的,双向链表是有序的;②链表没有索引,因此查询慢;③链表的增删只需在原有的基础上连上链子或切断链子,因此增删快。
- LinkedList<E>特有方法
成员方法 | 描述 |
---|---|
void addFirst(E e); | 将指定元素插入此列表的开头 |
void addLast(E e); | 将指定元素添加此列表的结尾 |
String removeFirst(); |
删除并返回第一个元素
|
String removeLast
() ;
|
删除并返回最后一个元素
|
String getFirst(); | 获取第一个元素 |
String getLast(); | 获取最后一个元素 |
2.1.3 Vector实现类(较少使用)
- Vector数据结构
o 底层是数组
- Vector特点
o 查询快,增删慢
- Vector底层分析
o 和ArrayList一样,都是数组实现,因此具有相似的特性。
它们之间的区别在于:Vector是线程安全,效率低;ArrayList是线程不安全,效率高
2.2Set接口
- Set集合的特点
o ①没有索引值 ②不能存储重复元素 ③元素存取无序
- 如果说List对集合加了有序性的化,那么Set就是对集合加上了唯一性。
2.2.1哈希值
- 哈希值简介
o 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
- 如何获取哈希值
o Object类中的public int hashCode():返回对象的哈希码值
- 哈希值的特点
①同一个对象多次调用hashCode()方法返回的哈希值是相同的
② 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
2.2.2HashSet实现类
- HashSet数据结构
o (JDK8)底层是哈希表
- HashSet特点
o 查询快,元素无序,元素不可重复,没有索引(所以不能使用普通for循环遍历)
2.2.3LinkedHashSet实现类
- LinkedHashSet数据结构
o 底层是链表+哈希表
- LinkedHashSet特点
o 查询快,元素有序,元素不可重复,没有索引
- LinkedHashSet底层分析
o 作为HashSet的子类,比它多了一条链表,这条链表用来记录元素顺序,所以LinkedHashSet中的元素有序
2.2.4TreeSet实现类
- TreeSet数据结构
o 底层是红黑树
- TreeSet特点
o 查询快,元素有序,元素不可重复,没有索引
- TreeSet底层分析
o 作为HashSet的子类,比它多了一条链表,这条链表用来记录元素顺序,所以LinkedHashSet中的元素有序
- TreeSet注意事项
o TreeSet新增元素的时候,元素的类型必须是Comparable类型,如果新增的元素不是Comparable类型,则需要:创建一个Comparable类型的对象传入到TreeSet的构造方法中
3、Map接口(双列集合)
-
Map概述
o Map接口本身就是一个顶层接口,由一堆Map自身接口方法和一个Entry接口组成,Entry接口定义了主要是关于Key-Value自身的一些操作,Map接口定义的是一些属性和关于属性查找修改的一些接口方法
o interface Map<k,v> k:键的类型;V:值的类型
- Map特点
①键值对映射关系
②一个键对应一个值
③键不能重复,值可以重复
④元素存取无序
- Map基本使用
- Map通用方法
方法名 | 说明 |
---|---|
V put(K key,V value);
| 如果K存在,则新的V替换旧的V,返回被替代的V。如果K不存在则返回null |
V remove(Object key);
|
根据键删除键值对元素
|
void clear();
|
移除所有的键值对元素
|
boolean containsKey(Object key);
|
判断集合是否包含指定的键
|
boolean containsValue(Object value);
|
判断集合是否包含指定的值
|
boolean isEmpty();
|
判断集合是否为空
|
int size();
| 获取集合中元素的个数 |
- Map集合的获取功能
方法名 | 说明 |
---|---|
V get(Object key); | 根据key获取V,如果key不存在返回null |
Set keySet(); | 获取所有键值 |
Collection values(); | 获取所有值 |
Set<Map.Entry<K,V>>entrySet | 获取所有键值对象 |
- Map集合的遍历
o 遍历思路
我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
①把所有的丈夫给集中起来
②遍历丈夫的集合,获取到每一个丈夫
③根据丈夫去找对应的妻子
o 步骤分析
①获取所有键的集合,用keySet()方法实现
②遍历键的集合,获取到每一个键,用增强for实现
③根据键去找值。用get(Object key)方法实现
- 代码实现
3.1HashMap实现类
- HashMap数据结构JDK.8
o 底层是哈希表(数组+单向链表+红黑树)
- HashMap特点
o 查询快,元素无序,key不允许重复但可以为null,value可以重复
- HashMap底层分析
o 和HashSet底层相类似
3.2LinkedHashMap实现类
- LinkedHashMap数据结构JDK.8
o 底层是链表+哈希表
- LinkedHashMap特点
o 查询快,元素有序,key不允许重复并且不能为null,value可以重复
3.3HashTable实现类(基本不用)
- HashTable数据结构JDK.8
o 底层是哈希表
- HashTable特点
o 查询快,元素无序,key不允许重复并且不能为null,value可以重复
3.4TreeMap实现类
- TreeMap数据结构JDK.8
o 底层是红黑树
- TreeMap特点
o 查询快,元素有序,key不允许重复并且不能为null,value可以重复
4、Collections集合工具类
4.1 Collections概述和使用
- Collections类的作用
o 是针对集合操作的工具类
- Collections类常用方法
方法名 | 说明 |
---|---|
static <T extends Comparable<T>> void sort (List<T>list);
|
将指定的列表按升序排序
|
static void reverse(List<?> list);
|
反转指定列表中元素的顺序
|
static void shuffle(List<?> list);
| 使用
默认的随机源随机排列指定的列表
|