java笔记3——List集合接口

目录

一、List接口的概述

二、List相对于Collection的特有功能

1.添加功能

2.获取功能

3.删除功能

4.修改功能

三、List的特有集合遍历

1)利用size()和get()方法结合使用

2)利用List特有的迭代器遍历

3)关于迭代器并发修改异常的原因和解决方案

四、List的三个子类的特点


一、List接口的概述

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。

用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

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

注:有序是指存储的顺序和取出的顺序一致。

二、List相对于Collection的特有功能

A:添加功能

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

B:获取功能

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

C:删除功能

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

      D:修改功能

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

E:列表迭代器

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

案例:

//创建集合对象

                   List list=new ArrayList();

                  

                   //添加元素

                   list.add("hello");

                   list.add("world");

                   list.add("java");

1.添加功能

//void add(int index,Object element):在指定位置添加元素
		list.add(1, "android");//没有问题
		list.add(3, "android");//紧跟在最后一个元素的后面不会报索引越界
	        list.add(11,"android");//java.lang.IndexOutOfBoundsException: Index: 11索引越界

2.获取功能

//Object get(int index):获取指定位置的元素
		list.get(1);//没有问题
		    list.get(11);//java.lang.IndexOutOfBoundsException: Index: 11

3.删除功能

//Object remove(int index):根据索引删除元素,返回被删除的元素
		list.remove(1);
		    list.remove(11);//java.lang.IndexOutOfBoundsException: Index: 11

4.修改功能

//Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
System.out.println("返回值:"+list.set(1, "javaee"));

 

三、List的特有集合遍历

1)利用size()和get()方法结合使用

for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}

2)利用List特有的迭代器遍历

/*
 * 列表迭代器:
 * 		ListIterator listIterator():List集合特有的迭代器
 * 		该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
 * 
 * 特有功能:
 * 		Object previous():获取上一个元素
 * 		boolean hasPrevious():判断是否有元素
 * 
 * 		注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
 */
// ListIterator listIterator()
		ListIterator lit = list.listIterator(); // 子类对象

		while (lit.hasPrevious()) {
			String s = (String) lit.previous();
			System.out.println(s);
		}
		System.out.println("-----------------");

		// 迭代器
		Iterator it = list.iterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			System.out.println(s);
		}

3)关于迭代器并发修改异常的原因和解决方案

案例:
// 迭代器遍历
		 Iterator it = list.iterator();
		 while (it.hasNext()) {
		 String s = (String) it.next();
		if ("world".equals(s)) {
		 list.add("javaee");
		}
    }

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

产生原因:

迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。

其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。

 

解决方案:

A:迭代器遍历元素,迭代器修改元素(集合不能修改,但是迭代器可以)

// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator

                    ListIterator lit = list.listIterator();

                   while (lit.hasNext()) {

                    String s = (String) lit.next();

                   if ("world".equals(s)) {

                   lit.add("javaee");

                    }

          }

B:集合遍历元素,集合修改元素(普通for)

for (int x = 0; x < list.size(); x++) {

                            String s = (String) list.get(x);

                            if ("world".equals(s)) {

                                     list.add("javaee");

                            }

                   }

总结:

A:迭代器迭代元素,迭代器修改元素

元素是跟在刚才迭代的元素后面的。

B:集合遍历元素,集合修改元素(普通for)

元素在最后添加的。

四、List的三个子类的特点(面试题)

ArrayList:

底层数据结构无是数组。查询快,增删快。

线程不安全,效率高。

Vector:

底层数据结构是数组。查询快,增删慢。

线程安全,效率低。又由于线程安全,导致查询也变慢。所以基本很少用。

LinkedList:

底层数据结构是链表。查询慢,增删快。

线程不安全,效率高。

小结:List的三个子类到底用谁呢?

要安全吗?

要:Vector(但是现在基本不用,有替代的)

不要:ArrayList或LinkedList

         查询多:ArrayList

        增删多:LinkedList

什么都不懂就用ArrayList。

那么重点掌握ArrayList。

猜你喜欢

转载自blog.csdn.net/elice_/article/details/81876724