a. Java存储结构划分
Java当中按照存储结构可以划分成为两个大类,分别是单列集合 java.util.Collection 和 双列集合 java.util.Map, 顾名思义Collection是实现单列集合的根接口, 而Map则是实现双列集合(键值对)的根接口。
b. 单列接口Collection
单列接口Collection当中下面可以看到存在许多的子接口例如,List接口,Set接口等等,今天我们着重介绍的就是List接口,即List容器当中的一些通用的操作和常用的实现类举例.
c. List接口 : 有序 + 重复
List接口当下拥有许多的实现类,其中常用的实现类有ArrayList,LinkedList,Vector等等,不同的实现类其底层实现的接口也会有不同,可能是用数组实现也可能是用链表进行实现的,不同的实现类也可能会拥有一些不同的操作方法。例如对于LinkList因为其底层实现了Deque接口所以其相对List接口以外还会有一些支持双端队头队尾的操作(addFirst, addLast)等.
A. 包路径:java.util.List
B. List核心:单列 + 重复 + 有序
C. 注意:下面使用ArrayList进行方法举例,所使用的方法全部是List接口的通用方法,不是ArrayList实现类的特有方法,是所有实现List接口实现类的所有通用方法,支持所有List接口下实现类的使用
D. 常用实现类举例:
ArrayList实现类:数组结构 + 查询快 + 增删慢
a. 使用ArrayList实现类
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>(); // 指定具体对象Integer的List容器
}
}
a. 索引访问:因为是有序存储的,所以肯定是支持索引访问的,即可以通过索引进行访问指定位置元素
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 5; i ++ ) list.add(i);
for(int i = 0; i < list.size(); i ++ ) // list.get()
System.out.println(list.get(i)); // 0 1 2 3 4
}
}
b. 迭代器访问:因为继承了迭代器Iterable接口,支持迭代器的访问操作
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 5; i ++ ) list.add(i);
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next()); // 0 1 2 3 4
}
it = list.listIterator(2); // 从指定位置开始的迭代器
while(it.hasNext()) {
System.out.println(it.next()); // 2 3 4
}
}
}
c. 增强for循环:支持直接使用增强的for循环直接遍历容器内所有元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < 5; i ++ ) list.add(i);
for(Integer it : list) // 增强for循环直接遍历所有元素
System.out.println(it); // 0 1 2 3 4
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 3; i > 0; i -- ) list.add(i);
for(int i : list) System.out.print(i + " "); // 3 2 1
System.out.println();
list.add(0, 100); // 向指定位置插入元素
for(int i : list) System.out.print(i + " "); // 100 3 2 1
}
}
b. 元素删除:remove方法默认是删除指定位置上的元素,如果想使用第二个方法,一定要记得进行强制类型转换(如果存储的元素正好也是int类型), 才会自动对应上第二个方法
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 3; i > 0; i -- ) list.add(i);
list.add(2); // 3 2 1 2
list.remove(3); // 根据索引删除
for(int it : list) System.out.print(it + " "); // 3 2 1
System.out.println();
list.remove((Integer)3); // 注意 : 删除首次出现的元素对象(若有多个也只会删除第一个对象)
for(int it : list) System.out.print(it + " "); // 2 1
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 3; i > 0; i -- ) list.add(i); // 3 2 1
list.set(0, 30); // 元素30替换0位置上的元素
for(int it : list) System.out.print(it + " "); // 30 2 1
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 3; i > 0; i -- ) list.add(i); // 3 2 1
System.out.println(list.contains(1)); // true
System.out.println(list.size()); // 3
System.out.println(list.isEmpty()); // false
list.clear();
System.out.println(list.isEmpty()); // true
}
}
a. toArray(): 将元素按适当顺序返回成为一个数组
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for(int i = 3; i > 0; i -- ) list.add(i); // 3 2 1
Object[] arr = list.toArray();
for(Object i : arr) System.out.print(i + " "); // 3 2 1
}
}
待后续补充