
java集合体系——有序集合list
要学习有序集合list之前,首先我们要先知道java集合体系整体架构。集合体系被分为两大类,一是单列集合体系,二是双列集合体系,而今天要讲的有序集合list就属于Collection体系中最重要的一员,Collection体系结构如下图所示:list集合继承了Colleection的所有方法。
目录
前言
要学习有序集合list之前,首先我们要先知道java集合体系整体架构。集合体系被分为两大类,一是单列集合Collection体系,二是双列集合Map体系,而今天要讲的有序集合list就属于Collection体系中最重要的一员,Collection体系结构如下图所示:
list集合继承了Colleection的所有方法。
一. Collection集合方法与遍历方式
1.常见方法:
add(E e): 把给定对象添加到集合中;
clear(): 清空集合中所有的元素;
remove(E e): 把给定对象在集合中删除;
contains(Object o): 判断当前集合是否包含给定对象;
isEmpty(): 判断当前集合是否为空;
size(): 返回集合中元素的个数/集合长度;
注意:
contanis底层是根据equals方法进行判断的,
如果集合中存储的是自定义对象,那么在该javaBean中一定要重写equals方法
2. Collection集合的遍历方式:
1.迭代器遍历
获取迭代器:Iterator<E> iterator() 返回迭代器对象,默认指向当前集合的0索引处。
iterator中的方法:
1. boolean hasNext() :判断当前位置是否有元素;
2. E next(): 获取当前位置元素,并将迭代器对象移向下一个指针。
代码示例:
public class iteratorTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator(); //获取迭代器对象
while (iterator.hasNext()){ //遍历list集合
Integer i = iterator.next();
System.out.println(i);
}
}
}
迭代器使用细节:
1. 迭代器在遍历集合的时候不依赖索引。
2. 如果当前没有元素还要强行获取,会抛出NoSuchElementException
3. 迭代器遍历完毕后,指针不会复位
4. 循环中只能用一次next()方法
5. 迭代器遍历时,不能用集合的方法对集合进行增加或者删除
2. 增强for遍历
增强for的底层也是由迭代器实现的,为了简化迭代器的代码
所有单列集合和数组才能使用增强for进行遍历
代码示例:
public class forTest {
public static void main(String[] args) {
Collection<Integer> coll = new ArrayList<>();
coll.add(1);
coll.add(2);
coll.add(3);
for (Integer i : coll){ // 增强for遍历
System.out.println(i);
i = 4; // i只是其中的一个第三方遍历, 不会影响数组中的数据
}
System.out.println(coll); // [1, 2, 3]
}
}
3. Lambda表达式遍历
代码示例:
public class lambdaTest {
public static void main(String[] args) {
Collection<Integer> coll = new ArrayList<>();
coll.add(1);
coll.add(2);
coll.add(3);
coll.forEach((System.out::println));
}
}
二. List集合
1. list本身
1.特点
有序:存和取元素的顺序一致
有索引:可以根据索引操作元素
可重复:存储的元素可以重复
2. 操作与方法
Collection的方法List都继承了
List集合因为有索引的缘故,所以有新增了跟索引有关的操作方法。
1. void add(int index, E e): 在此集合中的指定位置插入指定的元素;
2. E remove(int index): 删除指定索引处的元素;
3. E set(int index, E e): 修改指定索引处的元素;
3. 5种遍历方式
前三种跟Collection遍历方式相同
1. 迭代器
2. 增强for
3. Lambda表达式遍历
4. 列表迭代器
代码示例:
public class listIteratorTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
ListIterator<Integer> it = list.listIterator(); // 获得listIterator对象
while (it.hasNext()){ //遍历
Integer i = it.next();
if (i == 2){
it.add(4); // 添加元素
}
}
System.out.println(it); // [1,2,3,4] 在遍历过程中可以改变集合
}
}
5. 普通for
代码示例:
public class forTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (int i = 0; i < list.size(); i++) {
System.out.println(i); // i代表元素索引下标
System.out.println(list.get(i)); // 根据下标获取元素
}
}
}
2. ArrayList集合
底层数据结构是数组 ,由于数组在内存中是一片连续的储存区域,所以其具有查询快,增删慢的特点。
底层原理:
1. 第一次new ArrayList的时候如果不主动指定长度大小,则数组长度为0。
2. 第一次添加元素时,自动创建一个长度为10的数组。
3. 当该数组不能容纳添加元素的时候,其底层会重新创建一个新的数组,新数组的长度是原数组的1.5倍,随后把旧数组的数据拷贝。
3.LinkedList
底层数据结构是双链表, 其在内存中分散储存且每一个节点记录上一个节点和下一节点的位置,所以其 查询慢,增删快,首尾操作极快。
linkedList有很多操作首尾元素的特有API
1. public void addFirst(E e): 在该列表开头插入指定元素;
2. public void addLast(E e): 将指定元素添加到链表末尾;
3. public E getFirst(): 返回该链表第一个元素;
4. public E getLast(): 返回该链表最后一个元素;
5. public E removeFirst():从此链表删除并返回第一个元素;
6. public E removeLast(): 从此链表删除并返回最后一个元素;
4.Vector集合(不建议使用)
Vector集合的特点
底层的数据结构是:数组
有索引、查询快、增删慢
单线程,线程安全
完结撒花!
更多推荐
所有评论(0)