集合框架(一)
前言:
集合框架主要由一组用来操作对象的接口组成。不同接口描述一组不同数据类型。
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
接口:即表示集合的抽象数据类型。接口提供了让我们对集合中所表示的内容进行单独操作的可能。
实现:也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。
算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个接口被多个类实现时有不同的表现。事实上,算法是可复用的函数。
1. 了解Java集合框架体系结构
-
Collection 接口是一组允许重复的对象。
-
Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。
-
List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
详细结构图:
2. 会使用ArrayList存取数据
ArrayList数组线性表的特点为:类似数组的形式进行存储,因此它的随机访问速度极快。
ArrayList数组线性表的缺点为:不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。
常用API:
- boolean add(Object object); 向列表中追加元素。
- void add(int index,Object object); 向列表中的指定索引添加元素。
- int size(); 获取列表的长度/元素个数。
- Object get(int index); 根据索引获取对应的元素。
- boolean contains(Object obj); 判断是否包含某个元素。
- boolean remove(Object obj); 删除指定的元素。
- Object remove(int index); 根据索引删除元素 且返回被删除的元素值。
来自于ArrayList的父级接口们:
toArray() :转换为数组
clear() :清除所有的元素
isEmpty() :判断是否为空集合 / list.size() == 0
iterator() :迭代器
了解:
- Collections.shuffle(list); 工具类的方法 可以用来随机打乱集合内的数据。
- List Arrays.asList(T… t); 可以创建集合并且赋值。
集合泛型特点及用法:
它是用来约束/声明集合元素的数据类型的。
泛型必须是引用数据类型,如果是存储基本数据类型值,则必须将其转为对应引用数据类型(包装类型)。
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
3. 会使用LinkedList存取数据
LinkedList的链式线性表的特点为: 适合于在链表中间需要频繁进行插入和删除操作。
LinkedList的链式线性表的缺点为: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。速度你懂的。
可以理解为LinkedList就是一种双向循环链表的链式线性表,只不过存储的结构使用的是链式表而已。
常用API:
1.增加类:
add(E e):在链表后添加一个元素; 通用方法
addFirst(E e):在链表头部插入一个元素; 特有方法
addLast(E e):在链表尾部添加一个元素; 特有方法
push(E e):与addFirst方法一致
offer(E e):在链表尾部插入一个元素
add(int index, E element):在指定位置插入一个元素。
offerFirst(E e):JDK1.6版本之后,在头部添加; 特有方法
offerLast(E e):JDK1.6版本之后,在尾部添加; 特有方法
2.删除类:
remove() :移除链表中第一个元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):删除头,获取元素并删除; 特有方法
removeLast(E e):删除尾; 特有方法
pollFirst():删除头; 特有方法
pollLast():删除尾; 特有方法
pop():和removeFirst方法一致,删除头。
poll():查询并移除第一个元素 特有方法
3.查找类:
get(int index):按照下标获取元素; 通用方法
getFirst():获取第一个元素; 特有方法
getLast():获取最后一个元素; 特有方法
peek():获取第一个元素,但是不移除; 特有方法
peekFirst():获取第一个元素,但是不移除;
peekLast():获取最后一个元素,但是不移除;
pollFirst():查询并删除头; 特有方法
pollLast():删除尾; 特有方法
poll():查询并移除第一个元素 特有方法
常用API借鉴于:https://blog.youkuaiyun.com/huyang0304/article/details/82389595
4. 了解ArrayList和LinkedList的区别?
ArrayList:
底层是数组结构,所以因为是数组,则拥有索引,在遍历或随机查找时比较快
,但是又因为是数组,数组长度不可变,每一次增删
都是要创建新的数组,比较慢
。
LinkedList:
底层是链表结构,链表结构存储每一个元素由两部分组成,数据域和指针域,它没有索引。多个元素之间,通过指针域指向连接。 因为没有索引,所以查找比较慢
,但是因为是链表所以在增删
时只需要切换指针指向即可(尤其首尾更快
)。
在我们使用时,发现ArrayList和LinkedList好像都拥有索引,为什么呢?
它们的索引不同!
ArrayList的索引是固定的。类似于座位号 找到16号座位。
LinkedList的索引是根据元素位置计算出来的,并非固定的。 找到第16个座位。
5. 掌握使用Set集合存取数据
Set的特性:
Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素
用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。
set常用API:
- begin() 返回指向第一个元素的迭代器
- clear() 清除所有元素
- count() 返回某个值元素的个数
- empty() 如果集合为空,返回true
- end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
- erase() 删除集合中的元素
- find() 返回一个指向被查找到元素的迭代器
- insert() 在集合中插入元素
- max_size() 返回集合能容纳的元素的最大限值
- size() 集合中元素的数目
- swap() 交换两个集合变量
集合的遍历方式:
1.普通for循环 利用索引来遍历
public class Demo {
public static void main(String[] args) {
// List系列集合 ArrayList LinkedList
List<String> list = Arrays.asList("张三","李四","王五","小王");
// 创建Set集合
Set<String> set = new HashSet<>();
set.add("张三");
set.add("王五");
set.add("李四");
// 普通for循环 利用索引来遍历
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(str);
}
2.增强for循环【推荐】 遍历出每一个元素值
public class Demo {
public static void main(String[] args) {
// List系列集合 ArrayList LinkedList
List<String> list = Arrays.asList("张三","李四","王五","小王");
// 创建Set集合
Set<String> set = new HashSet<>();
set.add("张三");
set.add("王五");
set.add("李四");
// 增强for循环【推荐】 遍历出每一个元素值
for(String str : list) {
System.out.println(str);
}
System.out.println("-------------------");
for (String str : set) {
System.out.println(str);
}
3.利用迭代器遍历
public class Demo {
public static void main(String[] args) {
// List系列集合 ArrayList LinkedList
List<String> list = Arrays.asList("张三","李四","王五","小王");
// 创建Set集合
Set<String> set = new HashSet<>();
set.add("张三");
set.add("王五");
set.add("李四");
// 迭代器
Iterator<String> iterator = list.iterator();
// iterator.hasNext() 判断是否有下一个元素
// iterator.next() 获取下一个元素
while(iterator.hasNext()) {
String value = iterator.next();
System.out.println(value);
}
System.out.println("---------------------");
Iterator<String> setIterator = set.iterator();
while(setIterator.hasNext()) {
String str = setIterator.next();
System.out.println(str);
}