java第14天 Iterator 以及List各类容器对比

一.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() 返回栈顶的元素

猜你喜欢

转载自blog.csdn.net/Miserables_/article/details/143192124