1.List集合的概述和特点
LIst集合概述
- 有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常允许重复的元素
List集合特点
- 有序:存储和取出的元素顺序一致0
- 可重复:存储的元素可以重复
package com.study_01;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ListDemo01 {public static void main(String[] args) {// 创建集合对象 多态List<String> list = new ArrayList<>();// 添加元素:boolean add(E e)list.add("hello");list.add("world");list.add("java");list.add("hello");// boolean hasNext():如果迭代具有更多元素,则返回trueIterator<String> it = list.iterator();while (it.hasNext()) {// E next():返回迭代中的下一个元素String s = it.next();System.out.println(s);}}}
2.List集合的特有方法
| 方法名 | 说明 |
|---|---|
| void add(String item, int index) | 在此集合指定位置插入指定的元素 |
| E remove(int index) | 删除指定索引出的元素,返回别删除的元素 |
| E set(Int index,E element) | 修改指定索引出的元素,返回被修改的元素 |
| E get(int index) | 返回指定索引处的元素 |
package com.study_01;import java.util.ArrayList;import java.util.List;public class ListDemo02 {public static void main(String[] args) {List<String> list = new ArrayList<>();// 添加元素:boolean add(E e)list.add("hello");list.add("world");list.add("java");// 在此集合指定位置插入指定的元素:void add(String item, int index)// list.add(1,"javaEE");// list.add(11,"javaEE"); // IndexOutOfBoundsException 索引越界异常// 删除指定索引处的元素,返回别删除的元素:E remove(int index)// System.out.println(list.remove(1)); // world// System.out.println(list.remove(11)); // IndexOutOfBoundsException 索引越界异常// 修改指定索引处的元素,返回被修改的元素:Eset(Int index,E element)// System.out.println(list.set(1,"javaEE")); // world// System.out.println(list.set(11,"javaEE")); // IndexOutOfBoundsException 索引越界异常// 返回指定索引处的元素:E get(int index)// System.out.println(list.get(1)); // world// System.out.println(list.get(11)); // IndexOutOfBoundsException 索引越界异常// System.out.println(list);for (int i = 0; i < list.size(); i++) {// E next():返回迭代中的下一个元素String s = list.get(i);System.out.println(s);}}}
3.并发修改异常
并发修改异常
ConcurrentModificationException
产生原因
迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致‘’
package com.study_03;import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();// 添加元素:boolean add(E e)list.add("hello");list.add("world");list.add("java");// Iterator<E> iterator() 返回此集合中元素的迭代器 通过集合的iterator()方法得到Iterator<String> it = list.iterator();// while (it.hasNext()) {// String s = it.next();// if (s.equals("world")){// list.add("javaee"); // ConcurrentModificationException 并发修改异常// }// System.out.println(s);// }// 通过for循环不会报异常for (int i = 0; i < list.size(); i++) {String s = list.get(i);if (s.equals("world")){list.add("javaee");}}System.out.println(list);}}
4.ListIterator
Listlterator:列表迭代器
- 通过List集合的listlterator()方法得到,所以说它是List集合特有的迭代器
- 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
ListIterator中常用的方法
| 方法名 | 说明 |
|---|---|
| E next() | 返回迭代中的下一个元素 |
| boolean hasNext() | 如果迭代具有更多元素,则返回true |
| E previous() | 返回列表中的上一个元素 |
| boolean hasPrevious() | 如果此列表迭代器在相反方向遍历列表时具有更多的元素,则返回true |
| void add(E e) | 将指定的元素插入列表 |
package com.study_04;import java.util.ArrayList;import java.util.List;import java.util.ListIterator;public class ListIteratorDemo {public static void main(String[] args) {// 创建一个集合对象List<String> list = new ArrayList<>();// 添加元素:boolean add(E e)list.add("hello");list.add("world");list.add("java");// 正向迭代// ListIterator<String> lit = list.listIterator();// while (lit.hasNext()){// String s = lit.next();// System.out.println(s);// }// System.out.println("--------------");// 反向迭代 lit// while (lit.hasPrevious()){// String s = lit.previous();// System.out.println(s);// }// 获取列表迭代器ListIterator<String> lit = list.listIterator();while (lit.hasNext()){String s = lit.next();// 在迭代期间修改列表,并获取列表中迭代器的当前位置if (s.equals("world")) {lit.add("javase");}}System.out.println(list);}}
5.增强for循环
增强for:简化数组和Collection集合的遍历
- 实现lterable接口的类允许其对象成为增强型for语句的目标
- 它是JDK5之后出现的,其内部原理是一个lterator迭代器
增强for的格式
格式:
for(元素数据类型 变量名:数组或者Collection集合){//在此处使用变量即可,该变量就是元素}int[] arr = {1,2,3,4,5};for (int i :arr) {System.out.println(i);}
package com.study_05;import java.util.ArrayList;import java.util.List;public class ForDemo {public static void main(String[] args) {int[] arr = {1,2,3,4,5};for (int i :arr) {System.out.println(i);}List<String> list = new ArrayList<String>();list.add("hello");list.add("world");list.add("java");for (String i : list) {System.out.println(i);}// 内部是个Iterator迭代器for (String i : list) {if(i.equals("world")) {list.add("javaee"); //ConcurrentModificationException 并发修改异常}}}}
6.学生案例
三种for循环
7.常见数据结构之栈
栈是一种先进后出的模型
数据进入栈模型的过程称之为:压/进栈
数据离开栈模型的过程称之为:弹/出栈
8.常见数据结构之队列
队列是一种先进先出的模型
9.常见数据结构之数组
数组是一种查询快,增删慢的模型
查询速度快查询数据通过索引定位,查询任意数据耗时相同,查询效率高
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率极低
10.常见数据结构之链表
链表是一种增删快的模型(对比数组)
ps:因为链表每次查询都要从头开始查
链表是一种查询慢的模型(对比数组)
11.List集合子类特点
List集合的常用子类:ArrayList、LinkedList
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层结构是双链表,查询慢,增删快
12.LinkedList集合的特有功能
| 方法名 | 说明 | | —- | —- | | public void addFirst(Ee) | 在该列表开头插入指定的元素 | | public void addLast(Ee) | 将指定的元素追加到此列表的末尾 | | public E getFirst() | 返回此列表中的第一个元素 | | public E getLast() | 返回此列表中的最后一个元素 | | public E removeFirst() | 从此列表中删除并返回第一个元素 | | public E removeLast() | 从此列表中删除并返回最后一个元素 |
package com.study_09;import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {// 创建一个集合对象LinkedList<String> linkedList = new LinkedList<>();linkedList.add("hello");linkedList.add("world");linkedList.add("java");// [hello, world, java]// public void addFirst(Ee):在该列表开头插入指定的元素// public void addLast(Ee):将指定的元素追加到此列表的末尾// linkedList.addFirst("javaSe");// linkedList.addLast("javase");// publicE getFirst():返回此列表中的第一个元素// public E getLast():返回此列表中的最后一个元素// System.out.println(linkedList.getFirst());// System.out.println(linkedList.getLast());// public E removeFirst():从此列表中删除并返回第一个元素// public E removeLast():| 从此列表中删除并返回最后一个元素 |System.out.println(linkedList.removeFirst());System.out.println(linkedList.removeLast());System.out.println(linkedList);}}
