Collection类之详解(二)

Collection类之详解(二)

六、List集合

1.概述

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

List 接口提供了 4 种对列表元素进行定位(索引)访问方法。

List 接口提供了特殊的迭代器。

2.特有函数

void add(int index, E element)
          在列表的指定位置插入指定元素(可选操作)。
 E remove(int index)
          移除列表中指定位置的元素(可选操作)。
 E get(int index)
          返回列表中指定位置的元素。
 E set(int index, E element)
          用指定元素替换列表中指定位置的元素(可选操作)。

3.案例

List list = new ArrayList();
list.add(111);
list.add(222);
list.add(333);
//list.add(10, "000");                  //java.lang.IndexOutOfBoundsException越界异常
//Object obj = list.remove(1);		//通过索引删除元素,将被删除的元素返回
//list.remove(111);			//删除的时候不会自动装箱,把111当作索引,产生越界异常

//通过索引遍历List集合
for(int i = 0;i < list.size(); i++) {
	System.out.println(list.get(i));
}

list.set(1, "444");			//将指定位置的元素修改

注:遍历时,如果需要使用子类方法,和Collection遍历一样需要向下转型 

4.迭代器ListIterator

(1)概述

系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。

(2)案例

问题:

List list = new ArrayList();
list.add("a");							
list.add("b");
list.add("world");
list.add("c");
list.add("d");
list.add("e");

Iterator it = list.iterator();					//获取迭代器
while(it.hasNext()) {						//判断集合中是否有元素
	String str = (String)it.next();				//向下转型
        //在遍历的同时修改集合内元素,产生并发异常ConcurrentModificationException
	if("world".equals(str)) {
		list.add("javaee");
	}
}

解决:

ListIterator lit = list.listIterator();			//获取迭代器(List集合特有的)
while(lit.hasNext()) {
    String str = (String)lit.next();			//向下转型
    if("world".equals(str)) {
        //此时同样产生并发修改ConcurrentModificationException
        //list.add("javaee");						
        lit.add("javaee");
    }
}

(3)常用方法

boolean hasNext()
          以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
boolean hasPrevious()
          如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
 E next()
          返回列表中的下一个元素。
 E previous()
          返回列表中的前一个元素。

案例:

扫描二维码关注公众号,回复: 4516145 查看本文章
public static void main(String[] args) {
	List list = new ArrayList();
	list.add("a");									
	list.add("b");
	list.add("c");
	list.add("d");
	list.add("e");
		
	ListIterator lit = list.listIterator();			//获取迭代器
	while(lit.hasNext()) {
		System.out.print(lit.next()); 			//获取元素并将指针向后移动
	}
		
	System.out.println("\n-----------------");
		
	while(lit.hasPrevious()) {
		System.out.print(lit.previous()); 		//获取元素并将指针向前移动
	}
}

/*
abcde
-----------------
edcba
*/

七、Vector类

1.概述

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

2.特有方法

 void addElement(E obj)
          将指定的组件添加到此向量的末尾,将其大小增加 1。
E elementAt(int index)
          返回指定索引处的组件。
Enumeration<E> elements()
          返回此向量的组件的枚举。

3.案例

public static void main(String[] args) {
	Vector v = new Vector();
	v.addElement("a");
	v.addElement("b");
	v.addElement("c");
	v.addElement("d");
		
	Enumeration en = v.elements();					//获取枚举
	while(en.hasMoreElements()) {					//判断集合中是否有元素
		System.out.println(en.nextElement());		    //获取集合中的元素
	}
}

注:Vector是JAVA早期版本中的类,目前大多数都使用ArrayList代替。

八、List的三个子类的特点

ArrayList:

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

线程不安全,效率高。

Vector:

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

线程安全,效率低。

Vector相对ArrayList查询慢(线程安全的)

Vector相对LinkedList增删慢(数组结构)

LinkedList:

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

线程不安全,效率高。

Vector和ArrayList的区别:

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高

共同点:都是数组实现的

ArrayList和LinkedList的区别

ArrayList底层是数组结果,查询和修改快

LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

共同点:都是线程不安全的

猜你喜欢

转载自blog.csdn.net/qq_40298054/article/details/84816731
今日推荐