List集合

List集合:

list接口的概述、list接口的成员方法、成员方法的代码演示、列表迭代器、ListIterator、Iterator、并发修改异常。


1、List接口的概述

(1)List接口概述

    A:List接口是有序的 collection(也称为序列),此处的有序,是指存储元素的顺序和取出元素的顺序一致。

    B:此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

    C:与 set 不同,List 列表通常允许重复的元素

2、List接口的测试

(1)需求1

        需求:List 集合中存储字符串,并且遍历输出。

(2)代码实现

package cn.itcast_01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListDemo {
	public static void main(String[] args) {
		// 创建集合对象
		List list = new ArrayList();

		// 创建字符串,并且添加进集合中
		list.add("林青霞");
		list.add("风清扬");
		list.add("大孟");
		list.add("风清扬");
		list.add("大孟");

		// 遍历集合
		Iterator it = list.iterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			System.out.println(s);
		}
	}
}

(3)需求2

        需求:List 集合中存储自定义对象,并且遍历输出。

(4)代码实现

//存储自定义对象

package cn.itcast_01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListDemo2 {
	public static void main(String[] args) {
		// 创建集合对象
		List list = new ArrayList();

		// 创建学生对象,并添加进集合
		Student s1 = new Student("dawei", 11);
		Student s2 = new Student("xiaowei", 10);
		Student s3 = new Student("dameng", 13);
		Student s4 = new Student("xiaomeng", 1);

		list.add(s1);
		list.add(s2);
		list.add(s3);
		list.add(s4);

		// 遍历集合
		Iterator it = list.iterator();
		while (it.hasNext()) {
			Student s = (Student)it.next();
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
}
package cn.itcast_01;

public class Student {
	//成员变量
	private String name;
	private int age;
	
	//构造方法
	public Student() {
		super();
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	//成员方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	//重写toString方法
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}

3、List接口的特有功能

(1)List集合的特有功能:

            1)添加功能

                    void add(int index, Object element):    在指定位置上添加一个元素。

            2)获取功能

                    Object get(int index):    获取指定位置上的元素。

            3)列表功能

                    ListIterator listIterator( ):    List集合特有的迭代器:列表迭代器。

            4)删除功能

                    Object remove(int index):    根据索引删除元素,返回被删除的元素。

            5)修改功能

                Object set(int index, Object element):    根据索引修改元素,返回被修改的元素。

            6)List集合的特殊的遍历功能:size()和get()方法结合起来。

(2)代码演示

package cn.itcast_02;

import java.util.ArrayList;
import java.util.List;

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, Object element):在指定位置上添加一个元素。
		list.add(1, "android"); // 没问题
		// list.add(3, "android"); //没问题
		// list.add(4, "android"); //出错:IndexOutOfBoundsException
		// list.add(11, "android"); //出错:IndexOutOfBoundsException

		// Object get(int index):获取指定位置上的元素。
		System.out.println("get:" + list.get(1)); // get:android
		// System.out.println("get:" + list.get(11)); // 出错:IndexOutOfBoundsException

		// Object remove(int index):根据索引删除元素,返回被删除的元素。
		System.out.println("remove:" + list.remove(2)); // remove:world
		// System.out.println("remove:" + list.remove(11)); //
		// 出错:IndexOutOfBoundsException

		// Object set(int index, Object element):根据索引修改元素,返回被修改的元素。
		System.out.println("set:" + list.set(2, "cmm")); // set:java

		System.out.println("list:" + list); // list:[hello, android, cmm]

		System.out.println("-------------");
		
		// List集合的特殊的遍历功能:size()和get()方法结合起来。
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
}

(3)List集合的2中遍历方式(掌握!)


4、列表迭代器 ListIterator

    ListIterator listIterator( ):   List集合特有的迭代器。

    该迭代器继承了Iterator迭代器,所以,它可以直接使用父接口Iterator的hasNext()和next()方法。

    特有功能:

            (1)object previous( ):   获取上一个元素。

            (2)boolean hasPrevious( ):   判断是否有上一个元素。

        注意:ListIterator可以实现集合的逆序遍历,但是必须先正向遍历让迭代器走到结合的末尾,再返回逆序遍历,所以,一般无意义,使用不多。ListIterator提供了比Iterator更多的方法,可以查看API文档。


5、面试题

(1)需求:

有一个集合,请问,想判断该集合中有没有元素"world",如果有,我就添加一个元素"JavaEE"进入该集合,请写出代码。

(2)出现的问题:

ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这样时,抛出此异常。

(3)产生原因:

(迭代器遍历集合,集合修改集合元素)

迭代器是依据集合而存在的,在判断成功后,集合中新添加了元素,所以集合就不是原来的那个集合了,而迭代器还是原来的那个集合的迭代器,旧的迭代器和新的集合不匹配,所以报错了,这个错误叫做“并发修改异常”。

(4)如何解决呢?

            A:迭代器迭代元素,迭代器修改元素。(新加的元素是添加在刚才迭代元素的后面的。)

            B:集合遍历元素,集合修改元素(使用普通for循环)。(新加的元素是添加在集合末尾的。)

(5)代码演示:

package cn.itcast_03;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorDemo2 {
	public static void main(String[] args) {
		List list = new ArrayList();

		list.add("cmm2");
		list.add("world");
		list.add("java");
		list.add("hello");

		// 方式1:迭代器迭代元素,迭代器修改元素。
		ListIterator it = list.listIterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			if ("world".equals(s)) {
				it.add("javaEE");
			}
		} 		// cmm2 world javaEE java hello
		System.out.println("-------------");

		// 方式2:迭代器迭代元素,迭代器修改元素。
		for (int i = 0; i < list.size(); i++) {
			String s = (String) list.get(i);
			if ("world".equals(s)) {
				list.add("javaEE2");
			}
		}		// cmm2 world javaEE java hello javaEE2
		System.out.println("-------------");

		// 遍历集合
		Iterator it0 = list.iterator();
		while (it0.hasNext()) {
			String s = (String) it0.next();
			System.out.println(s);
		}
	}

}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值