目录:
一、什么是集合?
说白了就是,集合就是与存储数据相关。(看下面的体系图)
二、为什么要有集合?
之前我们保存多个数据,用的是数组,然而数组有很多不足:
数组的缺点:
- 一开始就必须指定数组长度,而且一旦指定,不能修改。
- 保存的必须是同一类型的元素。
- 使用数组进行元素的添加/删除,很麻烦。
为了避免这些缺点,我们创造了集合。
集合
- 可以动态保存任意多个对象,数据类型也可以不一样,使用很方便。
- 提供了一系列的操作对象的方法:add、remove、set、get等。
- 使用集合添加、删除元素,很方便。
二、集合的体系图
1、单列集合——Collection:
2、双列集合——Map:
3、单列集合和双列集合
- 单列集合中放的是单个对象,双列集合放的是键值对形式的对象。
- Collection 接口有两个重要的子接口 List 和 Set,他们的实现子类都是单列集合(单个单个的元素)。
- Map 接口的实现子类是双列集合,存放的是键值对数据,Key-value。
三、Collection接口和常用方法
public interface Collection<E> extends Iterable<E>
1、Collection接口的特点
- 实现了Collection接口的类(其父类实现了的也算),可以存放多个元素。
- 实现了Collection接口的类,有些可以存放重复的元素,有些不行。
- 实现了Collection接口的类,有些是有序的(有序指的是存放和取出的顺序一致)(List),有些是无序的(Set)。
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的。
2、Collection接口的常用方法
(以实现该接口的ArrayList子类为例)
四、Collection接口遍历元素的方式
注意:只要是实现了该接口的类,都有下面这两种遍历元素的方法。
方式一、使用Iterator(迭代器)
迭代器的目的是遍历输出数组元素。
Iterator是util包中的接口,即java.util.Iterator。
(1)Iterator遍历数组原理:
(2)Iterator接口中的常用方法:
- hasNext():判断是否还有下一个元素。
- next():下移一位,将下移后指向的数组位置中的元素返回。
下面上代码:
package com.hspedu.System_;
import java.util.ArrayList;
import java.util.Iterator;
public class Iterator_ {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("小明");
arrayList.add("唔怕");
arrayList.add("大黄");
arrayList.add("区域");
arrayList.add("九龙");
//1.使用 iterator()方法 得到arrayList的迭代器
//注意:接口是不能被实例化的,这里的 Iterator iterator 并不是实例化Iterator接口,而是对Iterator接口的引用
Iterator iterator = arrayList.iterator(); //该iterator方法是ArrayList类中的,目的是创建arrayList对象的迭代器
//2.使用while循环遍历
while (iterator.hasNext()){ //判断是否还有数据
Object obj = iterator.next();
System.out.print(obj);
}
}
}
方式二、增强for循环
- 增强for循环就是简化版的iterator,它可以用来代替iterator迭代器。
- 增强for的底层仍然是迭代器。
- 只能用于遍历数组or集合。
(1)基本语法
for(元素类型 元素名:集合名或数组名){
访问元素
}
//例如下面的:
for(Object object : col){
sout(object);
}
五、List接口和常用方法
1、List接口介绍
- List接口是Collection接口的子接口。
- List集合类中的元素是有序的(添加顺序和取出顺序一致)、而且可以重复。
- List集合类中的元素支持索引,即和数组一样,每个元素都有自己的索引值。
2、List接口中的常用方法
3、List集合的三种遍历方式
六、ArrayList实现类
Java中的ArrayList_m1m-FG的博客-优快云博客_java引入arraylist 看链接的这篇文章:Java中的ArrayList_m1m-FG的博客-优快云博客_java引入arraylist
七、Vector实现类
1、Vector类介绍
- Vector类是List接口的实现类。
- Vector类是将数据放在对象数组中。
- Vector类是线程同步的,即线程安全,Vector的很多方法都带有synchronized。
- 开发过程中,需要线程同步安全时,考虑使用Vector类。(即有多个线程同时操作该集合时,使用Vector类)
2、Vector VS ArrayList
八、LinkedList实现类
1、LinkedList类介绍
- LinkedList底层实现了双向链表和双端队列的特点。
- LinkedList可以添加任意元素(包括null),元素可以重复。
- 线程不安全,没有实现线程同步。
2、LinkedList底层操作机制
LinkedList底层维护了一个双向链表。
LinkedList中维护了两个属性first和last分别指向首节点和尾结点。
每个结点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个结点,最终实现双向链表。
因此,LinkedList中元素的添加和删除,不是通过数组完成的,相对来说效率较高。
3、LinkedList的增删改查
4、LinkedList VS ArrayList
九、Set接口和常用方法
1、Set接口介绍
- 无序(添加和取出的顺序不一致),没有索引。
- 不允许重复元素,所以最多包含一个null。
2、Set接口常用方法
和List接口一样,Set接口也是Collection接口的子接口。因此,常用方法和Collection接口一样。
3、Set接口的遍历方式
同Collection的遍历方式一样,因为它是该接口的子接口。
- 可以使用迭代器。
- 用增强for循环。
- 但是!不能使用索引的方式来获取。(即没有普通的for)
十、HashSet实现类
1、HashSet类介绍
- 该类实现了Set接口。
- HashSet实际是HashMap。
- HashSet可以存放空值,但是只能有一个null。
- HashSet不能保证元素是有序的。(即存放元素和取出元素的顺序不一定一致)
- 不能有重复元素和对象。(Set接口中已经说过)
2、HashSet类的底层机制
HashSet的底层是HashMap,HashMap的底层是(数组+链表+红黑树)。
有需要再看老韩的视频:0519_韩顺平Java_数组链表模拟_哔哩哔哩_bilibili
扩容机制、原阿玛分析和下面的Map接口内容没看,有需要再补。
Tips:只要实现了某个接口,其实现类就拥有了该接口的特点。