热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

30.Java之List集合类(List接口常用方法、ArrayList类、Vector类、LinkedList类)

30.1.List接口基本介绍List接口是Collection接口的子接口List集合类中元素有序(即添加顺序和取出顺序一致,不是指元素值大小排列顺

30.1.List 接口基本介绍

图片来源b站韩顺平老师

List 接口是 Collection 接口的子接口

  1. List 集合类中元素有序(即 添加顺序 和 取出顺序 一致,不是指元素值大小排列顺序)、且可重复
  2. List 集合中的每个元素都有其对应的顺序索引,即支持索引
  3. List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

30.2.List 接口常用方法

List 集合里添加了一些根据索引来操作集合的方法

  1. void add(int index, Object ele):在 index 位置插入 ele 元素
  2. boolean addAll(int index,Collection eles):从 index 位置开始将 eles 中的所有元素添加进来
  3. Object get(int index):获取指定 index 位置的元素
  4. int indexOf(Object obj):返回 obj 在当前集合中首次出现的位置
  5. int lastIndexOf(Object obj):返回 obj 在当前集合中末次出现的位置
  6. Object remove(int index / Object):移除指定 index 位置的元素,并返回此元素,也可以移除指定元素
  7. Object set(int index,Object ele):设置指定 index 位置的元素为 ele,相当于是替换
  8. List subList(int fromIndex,int toIndex):返回从 fromIndex 到 toIndex 位置的子集合

30.3.ArrayList 类


  1. 可以加入 null ,并且多个
  2. 是由数组来实现数据存储的
  3. 基本等同于 Vector,执行效率高,但 线程不安全,适合单线程,不适合多线程

ArrayList 底层操作机制(看源码)

  1. 维护了一个 Object 类型的数组 elementData

transient Object[] elementData;
// tansient 表示瞬间,短暂的,表示该属性不会被序列化

  1. 当创建ArrayList对象时,如果使用的是无参构造器,则初始化 elementDate 容量为 0 ,第一次添加,则扩容 elementData 为 10,如需要再次扩容,则扩容 elementData 为 1.5
  2. 如果使用的是指定大小的构造器,则初始 elementData 容量为指定大小,如果需要扩容,则直接扩容 elementData 为 1.5

30.4.Vector 类


  1. Vector 底层也是一个对象数组
    protected Object[] elementData;
  2. 线程同步的,即 线程安全
  3. 在开发中,需要线程同步安全,考虑使用 Vector

Vector 和 ArrayList 的比较

底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组JDK 1.2不安全,效率高如果有参构造1.5倍;无参第一次10,第二次开始按1.5倍扩
Vector可变数组JDK 1.0安全,效率不高如果是无参,默认10,满后就按2倍扩容;如果指定大小,则每次直接按2倍扩

30.5.LinkedList 类


  1. LinkedList 底层实现了双向链表双端队列特点
  2. 可以添加任意元素(元素可重复),包括 Null
  3. 线程不安全,没有实现同步

LinkedList 的底层操作机制

  1. LinkedList 底层维护了一个双向链表
  2. LinkedList 中维护两个属性 first 和 last 分别指向 首节点和尾节点
  3. 每个节点(Node对象),里面又维护了 prev、next、item 三个属性,其中通过prev指向前一个,通过next指向后一个节点,最终实现双向链表
  4. 添加和删除不是通过数组完成,相对来说效率更高

class Node {public Object item;public Node next;public Node pre;public Node(Object name) {this.item = name;}public String toString() {return "Node name=" + item;}
}

在这里插入图片描述

ArrayList 和 LinkedList 的比较

底层结构增删的效率改查的效率
ArrayList可变数组较低(数组扩容)较高(根据索引)
LinkedList双向链表较高(通过链表追加)较低

30.6.如何选择 ArrayList 、LinkedList 、Vector:


  1. 如果改查的操作多,选择 ArrayList
  2. 如果增删的操作多,选择 LinkedList
  3. ArrayList 和 LinkedList 是针对于单线程情况,若在多线程情况下,则选择 Vector

推荐阅读
author-avatar
阿梓喵1995
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有