集合的框架体系
- 集合主要是两组(1.单列集合:存放的是单列对象,2.双列集合:存放的是键值对形式)
ArrayList 单列集合,HashMap 双列集合
3. Collection 接口有两个重要的子接口 List,Set,他们的实现子类都是单列集合
4. Map接口的实现子类 是双列集合,存放的K-V
单列集合
Collection常用方法
Iterator 迭代器
迭代器的使用
增强for循环遍历
- 使用增强for,在Collection集合
- 增强for,底层仍然是迭代器
- 增强for可以理解成就是简化版本的迭代器遍历
- 快捷方式 大写i I
List接口方法
Collection有List和Set两个子接口,List接口是Collection的子接口。
List的三种遍历方式{ArrayList,LinkedList,Vector}
ArrayList,LinkedList,Vector都是List接口的实现子类所以以下三种遍历方式通用
集合结合冒泡排序,根据价格从小到大排序
ArraryList的注意事项
- ArrayList可以放入空元素
- ArrayList底层是由数组来实现数据存储的
- Arraylist基本等同于Vector,除了ArrayList是线程不安全的但是执行效率高,多线程情况下不建议用ArrayList考虑用Vector
为什么说ArrayList是线程不安全的?
咱们可以看他的源码 没有synchronized线程安全控制关键字
//ArrayList是线程不安全的,可以看源码 没有 synchronized
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
ArrayList底层结构和源码分析
1.分析使用无参构造器,创建和使用ArrayLIst的源码
创建一个ArrayList对象
创建了一格空的elementData数组={}
执行list.add
Vector的注意事项
Vector底层结构和ArrayList的比较
ArrayList是线程不同步的所以线程不安全,效率高,Vector做了线程同步所以是线程安全的,但是效率就低了
无参构造器
LinkedList的底层结构
LinkedList的全面说明
- LinkedList底层实现了双向链表和双端队列特点
- 可以添加任意元素(元素可以重复),包括null
- 线程不安全,没有实现同步
LinkedList的底层操作机制
LinkedList添加、删除,不是通过数组来完成,不涉及到数组的扩容所以说效率较高
比如删除:比如删除A对象,让A的下一个对象prev(指向前一个节点)属性指向A对象的前一个对象,A前一个对象的next(指向后一个节点)属性指向A后一个对象,完成连接就执行完删除A对象的操作。
代码模拟双向链表
/**
* @Autohr Yren
* Date: 2021-11-7
*/
public class LinkedList_ {
public static void main(String[] args) {
//模拟一个简单的双向链表
Node jack = new Node("jack");
Node jack1 = new Node("jack1");
Node jack2 = new Node("jack2");
//连接三个节点,形成双向链表
//jack -> jack1 -> jack2
jack.next = jack1;
jack1.next = jack2;
//jack2 -> jack1 -> jack
jack2.pre = jack1;
jack1.pre = jack;
Node first = jack;//让first引用指向jack,jack就是双向链表的尾节点
Node last = jack2;//让last引用指向jack2,jack2就是双向链表的尾节点
//演示,从头到尾进行遍历
System.out.println("从头到尾:从jack到jack2遍历");
while (true) {
if (first == null) {
break;
} else {
//输出first信息
System.out.println(first);
first = first.next;
}
}
//演示,从尾到头进行遍历
System.out.println("从尾到头:从jack到jack2遍历");
while (true) {
if (last == null) {
break;
} else {
//输出last信息
System.out.println(last);
last = last.pre;
}
}
//演示链表的添加对象/数据,是多么方便迅速
//要求:是在jack1------jack2之间插入一个jack3
//1.县创建一个Node(节点),name就是jack3
Node jack3 = new Node("jack3");
//关联他们的关系,下面这样就把jack3加入到双向链表了
jack3.next = jack2;
jack3.pre = jack1;
jack1.next = jack3;
jack2.pre = jack3;
first = jack;
while (true) {
if (first == null) {
break;
} else {
System.out.println(first);
first = first.next;
}
}
}
}
class Node {
public Object item;
public Node next;
public Node pre;
public Node(Object item) {
this.item = item;
}
public String toString() {
return "Node name=" + item;
}
}
LinkedList的增删改查案例
ArrayList和LinkedList的比较
ArrayList:底层结构是数组,增删因为有扩容涉及到数据的拷贝所以效率较低,改查因为根据索引定位所以效率较快。
LinkedList:底层结构是双向链表,增删根据链表追加,查找时会根据链表的头一个一个找所以效率较低
Set接口方法
Set接口的基本介绍
Set接口的常用方法
双列集合
Map接口和常用方法
Map和Collection并列存在,用于保存具有映射关系的数据:Key-Value(双列元素)
Map接口的特点
存进去是no1,no2,取出为什么是no2,no1呢?
取出无序是因为底层是hash,是单链表
在已有no1的情况下再存入
map.put(“no1”,“张三”) 张三会覆盖韩顺平