Java三大集合(一):List

Jave容器:Collection接口和Map接口

Collection接口下主要有List接口、Set接口、Queue(队列)接口

List表示有序(存入和取出)可重复集合,可以保存null元素
接口下:ArrayListLinkedListVector

=============================================================

ArrayList:底层是Object数组,通过下标对数组中的数据进行操作。数组初始长度为10,当数组装满了,会扩容为1.5倍

/**1. 可以装多个不同类型的数据,初始长度是10个*/
private Object[] value;

/**2. 可以记录当前数据的个数 int size()*/
private int size;

优点:查询、修改、顺序添加比较快,因为有下标
缺点:删除、插入比较慢

=================================================================

LinkedList:基于变量,底层是双向链表
类中会存储数据、上一个变量的地址和下一个变量的地址

/**
* 自定义单向链表
*/
private class Node {
    
    
	/**Object类型变量,用来保存数据*/
	Object value;
	/**Node类型变量,用来保存下一个Node对象的地址*/
	Node next;
	
	public Node(Object value) {
    
    
		this.value = value;
	}
}

优点:删除、插入比较快,直接改变删除位置的上下Node指向
缺点:查询、修改、顺序添加比较慢,因为没有真正的下标,需要遍历

===============================================================

Vector:就是一个线程安全的ArrayList,Vector中的方法通过synchronized关键字来进行同步,动态扩容是2倍。(只要提到线程安全,那么一般性能就会低)

==============================================================

4种遍历方式:for、foreach、Iterator(单向迭代器)、ListIterator(双向迭代器)

1、for:因为list基于数组,所以可以用下标

		//通过普通for循环,利用集合size()方法和get(int index)	(不常用)
		for (int i = 0; i < list.size(); i++) {
    
    
			//根据下标获取元素
			System.out.println(list.get(i));
		}

2、foreach

		//()因为ArrayList间接实现了Iterable接口 
		for (Object object : list) {
    
    
			System.out.println(object);
		}

		//lamda表达式
		list.foreach(System.out::println);

3、Iterator(单向迭代器)

		/*
		 * 迭代器:一个集合对象可以获取多个迭代器对象(多次调用方法),指针都是在初始位置(第一个元素前面)
		 * 迭代器是靠指针,所以对于这种单向迭代器,只能使用一次
		 */
		Iterator iterator = list.iterator();//获取单向迭代器对象
		//先判断,再获取元素,用while循环,只要有下一个就一直获取
		while (iterator.hasNext()) {
    
    //判断是否有下一个元素
			//获取当前元素
			System.out.println(iterator.next());
			//在使用迭代器遍历集合的时候,不能使用集合自己的方法(增删改)操作集合对象
//			list.remove(iterator.next());
			iterator.remove();//只能使用迭代器自己的方法操作
		}

4、listIterator(双向迭代器)

		ListIterator listIterator = list.listIterator();
		//正向迭代
		while (listIterator.hasNext()) {
    
    //判断是否有下一个元素
			//获取当前元素
			System.out.println(listIterator.next());
		}
		
		//反向迭代
		while (listIterator.hasPrevious()) {
    
    //判断是否有上一个元素
			//获取当前元素
			System.out.println(listIterator.previous());
		}
		//所以可以一直用

猜你喜欢

转载自blog.csdn.net/ExceptionCoder/article/details/107578330