一.Iterator 迭代器
控制变量的消亡有两种方式
1.普通代码块
public static void main(String[] args){
{
int x;
}
System.out.println(x);//无法获取 已经消亡
}
2.通过for循环来控制
import java.util.*;
public class Exec1{
public static void main(String[] args){
ArrayList<String>list=new ArrayList<>();
Collections.addAll(list,"Andy","Lee","Anron");
//迭代器遍历 A开头的名字
for(Iterator<String> car=list.iterator();car.hasNext();){
String name=car.next();
/*if(name.charAt(0)=='A'){
System.out.print(name+" ");
}*/
if(name.startsWith("A")){
System.out.print(name+" ");
}
}
}
}
二.ArrayList的遍历
for+下标
foreach/ 增强型for循环【jdk5.0】
迭代器
for(Iterator<集合的泛型> car = ArrayList对
象.iterator();car.hasNext();){
// 光标下移 + 返回元素
集合的泛型 x = car.next();
}
三.ArrayList中的删除
remove(int 下标) 根据下标进行删除 // 下标范围
[0,list.size()-1]
remove(元素) 根据元素进行删除 // 元素如果重复 只删
除第一个
* 遍历删除集合中的所有
1 for+下标 和 倒序
2 只要集合中有元素 就一直删除第一个
【list.remove(0)】
四.ArrayList删除remove(元素)的底层
remove(元素)底层是
拿着要被删除的元素跟集合中的元素做 equals()比较
contains(元素) 底层是
拿着要被找的元素跟集合中的元素做equals() 比较
indexOf(元素) 底层是
拿着要被找的元素跟集合中的元素做equals() 比较
lastIndexOf(元素) 底层是
拿着要被找的元素跟集合中的元素做equals() 比较
五.遍历删除
遍历+删除可能会产生CME
CME => ConcurrentModificationException
// 并发修改异常
场景:使用迭代器遍历集合的同时使用集合的删除可能会出
现CME[并发修改异常]
解决:1 for+下标 集合的删除[倒序]
2 迭代器的遍历 + 迭代器的删除
// car.remove() 光标指向谁删除谁
六.ArrayList的构造方法/
扩容 ensureCapacity(int)
缩容 trimToSize() 将集合的容量缩减为集合个数
/ 1 底层默认开辟十块空间
ArrayList list = new ArrayList();
// 2 指定初始化容量创建
// 底层开辟1000块空间
ArrayList list = new ArrayList(1000);
- trimToSize() 将集合的容量缩减为集合个数
- ensureCapacity(int) 一次性将集合的容量扩到指定
的大小
//==================================
// ArrayList可以添加无数个元素 由于底层会自动扩容
ArrayList 扩容机制 [区分jdk版本]
103/2+1 => 16
jdk6.0之前 oldCap3/2+1 => newCap - jdk7.0之后 oldCap+ (oldCap>>1) => newCap
- 虽然我们不会再主动扩容,但是在项目开发的时候尽量避免
扩容(why?)【每次涉及5个步骤 浪费时间和空间】
1 创建一个新的数组对象
2 将老数组里面的元素复制到新数组中
3 改变引用指向
4 回收老数组对象
5 添加元素
七.面试题Vector 和 ArrayList的区别
Vector和ArrayList语法一模一样
1 线程机制不同
Vector同一时间只能允许一个线程进行访问 效率
较低 但是不会出现并发问题
ArrayList同一时间允许多个线程进行访问 效率
较高 但是可能出现并发问题。 jdk5.0开始
Collections提供了一个方法可以将线程不安全的
ArrayList转变为线程安全的List集合,所以 Vector
慢慢被淘汰了。。。
List ll =
Collections.synchronizedList(list);
2 扩容机制不同
Vector区分构造方法
Vector(8) 二倍扩容 8-》16-》32
Vector(8,2) 定长扩容 8-》10-》12
ArrayList区分jdk版本
jdk6.0之前 x*3/2+1
jdk7.0之后 x+(x>>1)
3 出现的版本不同
Vector since jdk1.0
ArrayList since jdk1.2
八.面试题LinkedList和ArrayList的区别
LinkedList的语法和ArrayList 一模一样
LinkedList和ArrayList主要是底层的数据结构不同
LinkedList 底层基于链表【双向循环链表】
优点:添加/删除快
缺点:查找慢
ArrayList 底层基于数组
优点:查找迅速
缺点:添加/删除慢
eg:借助时间毫秒数System.currentTimeMillis()测效 率
九.Stack-栈【先进后出】【后进先出】 【LIFO】
用数组模拟栈结构
eg:微信消息【最先来的消息往下】
push(元素) 往栈中添加元素
pop() 返回栈顶的元素