JavaList集合超详解(特点种类及常用方法)

JavaList集合超详解(特点种类及常用方法)-mikechen

JavaList定义

List是位于java.util下的一个接口,是Java集合中的有序集合,也称为序列。

 

JavaList实现种类

因为List是一个接口,为了使用它,你必须实例化一个具体的实现。

JavaList的常用实现类有:

ArrayListLinkedList 最常用,Vector和Stack不太常用。

Vector可以理解成线程安全的ArrayList ,不过不建议使用,需要线程安全建议使用CopyOnWriteArrayList

Stack继承自Vector,实现了一个后进先出的堆栈,不过它里面的方法与Vector内部的类似,都使用了Synchronized进行同步修饰,也不太常用。

所以,学习JavaList重点掌握好ArrayListLinkedList 即可。

 

ArrayList

1.ArrayList简介

ArrayList属于Java集合框架最常用的集合,实现了 List 接口。

JavaList集合超详解(特点种类及常用方法)-mikechen

2.ArrayList数据结构

ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组,随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。

 

3.ArrayList特点

  • 插入的元素是有序的;
  • 基于动态数组的数据结构;
  • 非线程安全;
  • 擅长随机访问;
  • 插入和删除可能引起扩容,效率较低;

 

4.ArrayList常用方法

JavaList集合超详解(特点种类及常用方法)-mikechen

1)add增加

  1. List<String> list = new ArrayList<String>();
  2. System.out.println("ArrayList集合初始化容量:"+list.size());
  3.  
  4. //添加功能:
  5. list.add("mikechen");
  6. list.add("的互联网架构");

添加元素时,会指定默认为10的容量,当添加元素导致集合容量大于10,触发扩容机制,扩容为原来的1.5倍。

 

2)remove移除

  1. List<String> list = new ArrayList<String>();
  2. System.out.println("ArrayList集合初始化容量:"+list.size());
  3.  
  4. //添加功能:
  5. list.add("mikechen");
  6. list.add("的互联网架构");
  7.  
  8. //删除功能:
  9. list.remove(0);

 

3)get获取

  1. List<String> list = new ArrayList<String>();
  2. System.out.println("ArrayList集合初始化容量:"+list.size());
  3.  
  4. //添加功能:
  5. list.add("mikechen");
  6. list.add("的互联网架构");
  7.  
  8. //get获取
  9. list.get(0);

源码如下:

  1.     public E get(int index) { //获取指定索引的值
  2.         rangeCheck(index);//是否越界
  3.  
  4.         return elementData(index);//返回指定下标的值
  5.     }
  6.     private void rangeCheck(int index) {
  7.         if (index >= size) //索引大于 集合长度,抛异常
  8.             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  9.     }

由于ArrayList底层是基于数组实现的,所以获取元素就相当简单了,直接调用数组随机访问即可。

 

4)set修改

  1. List<String> list = new ArrayList<String>();
  2. System.out.println("ArrayList集合初始化容量:"+list.size());
  3.  
  4. //添加元素
  5. list.add("mikechen");
  6. list.add("的互联网架构");
  7.  
  8. //修改元素
  9. list.set(0,"ada");

源码如下:

  1. public class ArrayList<E> extends AbstractList<E>
  2.         implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
  3.     public E set(int index, E element) {
  4.         rangeCheck(index);
  5.  
  6.         E oldValue = elementData(index);
  7.         elementData[index] = element;
  8.         return oldValue;
  9.     }}

修改指定位置的元素为新元素,首先需要校验给定index的值,index必须大于等于0,小于size,然后将新元素保存到index位置,并将旧元素返回。

 

5)扩容操作

  1. public void ensureCapacity(int minCapacity) {
  2.         //修改计时器
  3.         modCount++;
  4.         //ArrayList容量大小
  5.         int oldCapacity = elementData.length;
  6.         /*
  7.          * 若当前需要的长度大于当前数组的长度时,进行扩容操作
  8.          */
  9.         if (minCapacity > oldCapacity) {
  10.             Object oldData[] = elementData;
  11.             //计算新的容量大小,为当前容量的1.5倍
  12.             int newCapacity = (oldCapacity * 3) / 2 + 1;
  13.             if (newCapacity < minCapacity)
  14.                 newCapacity = minCapacity;
  15.             //数组拷贝,生成新的数组
  16.             elementData = Arrays.copyOf(elementData, newCapacity);
  17.         }
  18.     }

ensureCapacity(),该方法就是ArrayList的扩容方法,每次扩容处理会是1.5倍。

 

LinkedList

1.LinkedList简介

LinkedListJava集合中比较常用的数据结构,与 ArrayList 一样,实现了 List 接口,只不过 ArrayList 是基于数组实现的,而 LinkedList是基于链表实现的。

JavaList集合超详解(特点种类及常用方法)-mikechen

2.LinkedList数据结构

LinkedList的数据结构是一个双向链表,它有两个成员变量:first 和 last,分别指向双向队列的头和尾。

  1. Node<E> first;
  2. Node<E> last;

JavaList集合超详解(特点种类及常用方法)-mikechen

这里“双向”的含义是相对单链表而言的,双向链表的节点不仅有后继,还有前驱。

3.LinkedList特点

  • 增删效率高;
  • 查询效率低;
  • 线程不安全;

 

4.LinkedList常用方法

1)添加元素

boolean add(E   e)

将指定的元素追加到此列表的末尾。

  1. List<String> linkedList = new LinkedList<String>();
  2. System.out.println("LinkedList初始容量:"+linkedList.size());
  3.  
  4. //添加元素
  5. linkedList.add("mikechen");
  6. linkedList.add("的互联网架构");

 

2)修改元素

E set(int index,E element)

用指定的元素替换此列表中指定位置的元素

  1. List<String> linkedList = new LinkedList<String>();
  2. System.out.println("LinkedList初始容量:"+linkedList.size());
  3.  
  4. //添加元素
  5. linkedList.add("mikechen");
  6. linkedList.add("的互联网架构");
  7.  
  8. //修改元素
  9. linkedList.set(0,"ada");

 

3)删除元素

boolean remove(Object o )

从列表中删除指定元素的第一个出现(如果存在)

  1. List<String> linkedList = new LinkedList<String>();
  2. System.out.println("LinkedList初始容量:"+linkedList.size());
  3.  
  4. //添加元素
  5. linkedList.add("mikechen");
  6. linkedList.add("的互联网架构");
  7.  
  8. //删除元素
  9. linkedList.remove("mikechen");

 

ArrayList和LinkedList的区别

1. ArrayList 的实现是基于数组,LinkedList的实现是基于双向链表;

2. 对于随机访问 ArrayList 要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N);

3. 对于插入和删除操作,LinkedList要优于 ArrayList ,因为当元素被添加到LinkedList任意位置的时候,不需要像 ArrayList 那样重新计算大小或者是更新索引;

4. LinkedListArrayList 更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

 

评论交流
    说说你的看法
欢迎您,新朋友,感谢参与互动!