Jave容器:Collection接口和Map接口
Collection接口下主要有List接口、Set接口、Queue(队列)接口
List表示有序(存入和取出)可重复集合,可以保存null元素
接口下:ArrayList、LinkedList、Vector
=============================================================
ArrayList:底层是Object数组,通过下标对数组中的数据进行操作。数组初始长度为10,当数组装满了,会扩容为1.5倍
/**1. 可以装多个不同类型的数据,初始长度是10个*/
private Object[] value;
/**2. 可以记录当前数据的个数 int size()*/
private int size;
优点:查询、修改、顺序添加比较快,因为有下标
缺点:删除、插入比较慢
=================================================================
LinkedList:基于变量,底层是双向链表
类中会存储数据、上一个变量的地址和下一个变量的地址
/**
* 自定义单向链表
*/
private class Node {
/**Object类型变量,用来保存数据*/
Object value;
/**Node类型变量,用来保存下一个Node对象的地址*/
Node next;
public Node(Object value) {
this.value = value;
}
}
优点:删除、插入比较快,直接改变删除位置的上下Node指向
缺点:查询、修改、顺序添加比较慢,因为没有真正的下标,需要遍历
===============================================================
Vector:就是一个线程安全的ArrayList,Vector中的方法通过synchronized关键字来进行同步,动态扩容是2倍。(只要提到线程安全,那么一般性能就会低)
==============================================================
4种遍历方式:for、foreach、Iterator(单向迭代器)、ListIterator(双向迭代器)
1、for:因为list基于数组,所以可以用下标
//通过普通for循环,利用集合size()方法和get(int index) (不常用)
for (int i = 0; i < list.size(); i++) {
//根据下标获取元素
System.out.println(list.get(i));
}
2、foreach
//()因为ArrayList间接实现了Iterable接口
for (Object object : list) {
System.out.println(object);
}
//lamda表达式
list.foreach(System.out::println);
3、Iterator(单向迭代器)
/*
* 迭代器:一个集合对象可以获取多个迭代器对象(多次调用方法),指针都是在初始位置(第一个元素前面)
* 迭代器是靠指针,所以对于这种单向迭代器,只能使用一次
*/
Iterator iterator = list.iterator();//获取单向迭代器对象
//先判断,再获取元素,用while循环,只要有下一个就一直获取
while (iterator.hasNext()) {
//判断是否有下一个元素
//获取当前元素
System.out.println(iterator.next());
//在使用迭代器遍历集合的时候,不能使用集合自己的方法(增删改)操作集合对象
// list.remove(iterator.next());
iterator.remove();//只能使用迭代器自己的方法操作
}
4、listIterator(双向迭代器)
ListIterator listIterator = list.listIterator();
//正向迭代
while (listIterator.hasNext()) {
//判断是否有下一个元素
//获取当前元素
System.out.println(listIterator.next());
}
//反向迭代
while (listIterator.hasPrevious()) {
//判断是否有上一个元素
//获取当前元素
System.out.println(listIterator.previous());
}
//所以可以一直用