Java_集合04_集合(List)
Posted zhaolanqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_集合04_集合(List)相关的知识,希望对你有一定的参考价值。
集合(List)
1. List集合的特点
List:保存元素加入的顺序(存储顺序和取出顺序一致),可以保存重复值
|-- ArrayList:线性数据结构(底层数据结构是数组)。查询快,增删慢。线程不安全,效率高。创建集合时可以指定集合的长度。
|-- Vector:线性数据结构(底层数据结构是数组)。查询快,增删慢。线程安全,效率低。功能与ArrayList完全一致。
|-- LinkedList:链表数据结构(底层数据结构是链表)。查询慢,增删快。线程不安全,效率高。创建集合时不能指定集合的长度。
2. List是Collection的子接口
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。
/***************************************************************************************************************************************************/
//存储字符串并遍历
public class ListDemo {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();//
// 存储元素
list.add("hello");// ArrayList类中的add()永远返回true,所以可重复
list.add("world");
list.add("java");
list.add("javaee");
list.add("android");
list.add("javaee");
list.add("android");
// 遍历集合
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
}
}
/***************************************************************************************************************************************************/
//存储自定义对象并遍历
public class ListDemo {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 创建学生对象
Student s1 = new Student("白骨精", 30);
Student s2 = new Student("蜘蛛精", 40);
Student s3 = new Student("观音姐姐", 22);
// 把学生对象添加到集合对象中
list.add(s1);
list.add(s2);
list.add(s3);
// 遍历
Iterator it = list.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
public class Student {
private String name;
private int age;
public Student() { }
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
// getXxx()/setXxx()
}
/***************************************************************************************************************************************************/
3. List的特有功能:(将 E 看成Object)
A:添加功能
void add(int index, E element):在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。
B:删除功能
E remove(int index):移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。
boolean remove(Object o):从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。如果列表不包含元素,则不更改列表。
C:获取功能
E get(int index):返回:列表中指定位置的元素。
D:列表迭代器(List集合特有的迭代器)
ListIterator<E> listIterator():返回此列表元素的列表迭代器(按适当顺序)。
boolean hasPrevious():返回: 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true
E previous():返回: 列表中的上一个元素。 抛出: NoSuchElementException - 如果没有可迭代的上一个元素
E:修改功能
E set(int index, E element):用指定元素替换列表中指定位置的元素(可选操作)。返回:以前在指定位置的元素。
/***************************************************************************************************************************************************/
public class ListDemo {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// void add(int index, E element):在指定位置添加元素
// list.add(1, "android");//没有问题
// list.add(3, "javaee"); //没有问题
// list.add(4, "javaee"); // IndexOutOfBoundsException
// Object get(int index):获取指定位置的元素
// System.out.println("get:" + list.get(1));// get:world
// System.out.println("get:" + list.get(3));// IndexOutOfBoundsException
// Object remove(int index):根据索引删除元素,返回被删除的元素
// System.out.println("remove:" + list.remove(1));
// System.out.println("remove:" + list.remove(11));// IndexOutOfBoundsException
// Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
System.out.println("set:" + list.set(1, "javaee"));// set:world
System.out.println("list:" + list);
}
}
/***************************************************************************************************************************************************/
4. List集合的特有遍历功能
A:由size()和get()结合。
B:代码演示
/***************************************************************************************************************************************************/
//存储字符串并遍历
// 创建集合对象
List list = new ArrayList();
// 创建并添加元素
list.add("hello");
list.add("world");
list.add("java");
// 迭代器遍历(任何集合都具有的遍历方式)
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
// List集合的特有遍历功能
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
System.out.println(s);
}
/***************************************************************************************************************************************************/
//存储自定义对象并遍历
public class ListDemo {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 创建学生对象
Student s1 = new Student("林黛玉", 18);
Student s2 = new Student("刘姥姥", 88);
Student s3 = new Student("王熙凤", 38);
// 把学生添加到集合中
list.add(s1);
list.add(s2);
list.add(s3);
// 迭代器遍历(任何集合都具有的遍历方式)
Iterator it = list.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
// 普通for循环
for (int x = 0; x < list.size(); x++) {
Student s = (Student) list.get(x);
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
// getXxx()/setXxx()
}
/***************************************************************************************************************************************************/
5. 列表迭代器的特有功能;(了解)
可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。
/***************************************************************************************************************************************************/
/*
* 列表迭代器:
* ListIterator<E> listIterator():List集合特有的迭代器
* 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
* 特有功能:
* E previous():获取上一个元素
* boolean hasPrevious():判断是否有元素
*
* 注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
*/
public class ListIteratorDemo {
public static void main(String[] args) {
// 创建List集合对象
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
// ListIterator listIterator()
ListIterator lit = list.listIterator(); // 子类对象
while (lit.hasNext()) {
String s = (String) lit.next();
System.out.println(s);
}// 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
// System.out.println(lit.previous());
// System.out.println(lit.previous());
// System.out.println(lit.previous());
// System.out.println(lit.previous());// NoSuchElementException
while (lit.hasPrevious()) {
String s = (String) lit.previous();
System.out.println(s);
}
// 迭代器
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
}
}
/***************************************************************************************************************************************************/
6. 并发修改异常:ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
A:出现的现象
迭代器遍历集合过程中,通过集合对象修改集合元素。
B:原因
迭代器是依赖于集合的,而集合的改变迭代器并不知道。所以,迭代器遍历元素的过程中,通过集合是不能修改元素的。
C:解决方案
a:迭代器遍历,迭代器修改(ListIterator)
元素添加在刚才迭代的位置
b:集合遍历,集合修改(用for循环加上List集合的size()和get()方法,Collection集合没有get()方法)
元素添加在集合的末尾
/***************************************************************************************************************************************************/
//判断集合里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
public class ListIteratorDemo {
public static void main(String[] args) {
// 创建List集合对象
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// 迭代器遍历
// Iterator it = list.iterator();
// while (it.hasNext()) {
// String s = (String) it.next();
// System.out.println(s);
// if ("world".equals(s)) {
// list.add("javaee");
// }
// }
// 方式1:迭代器迭代元素,迭代器修改元素
// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
// ListIterator lit = list.listIterator();
// while (lit.hasNext()) {
// String s = (String) lit.next();
// if ("world".equals(s)) {
// lit.add("javaee");
// }
// }
// 方式2:集合遍历元素,集合修改元素(普通for)
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
// list.set(x, "javaee");// 用指定的元素替代此列表中指定位置上的元素。
}
}
System.out.println("list:" + list);
}
}
/***************************************************************************************************************************************************/
7. List的子类特点(面试题)
ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
到底使用谁呢?看需求?
分析:
要安全吗?
要:Vector(即使要,也不使用这个,后面再说)
不要:ArrayList或者LinkedList
查询多;ArrayList
增删多:LinkedList
什么都不知道,就用ArrayList。
8. List集合的案例(遍历方式 迭代器和普通for)
A:存储字符串并遍历
B:存储自定义对象并遍历
以上是关于Java_集合04_集合(List)的主要内容,如果未能解决你的问题,请参考以下文章