Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

  • Java核心基础

    • 多线程

    • Java常用类

    • 枚举类与注解

    • Java集合

      • Java集合框架概述
      • Collection
      • List
        • 前言
        • 概述
        • List接口方法
        • 面试题
        • 总结
      • ArrayList
      • LinkedList
      • Vector
      • Set
      • HashSet
      • LinkedHashSet
      • TreeSet
      • Map
      • HashMap
      • LinkedHashMap
      • TreeMap
      • Hashtable
      • Properties
      • Collections工具类
    • 数据结构与算法

    • 泛型

    • IO流

    • 网络编程

    • 反射

    • 函数式编程

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

  • Elasticsearch

  • 运维

  • 后端
  • Java核心基础
  • Java集合
SaulJWu
2020-12-24

List

# 前言

Java 集合可分为Collection 和Map 两种体系:

  • Collection接口:单列数据,定义了存取一组对象的方法的集合
    • List:元素有序、可重复的集合
      • ArrayList、LinkedList、Vector
    • Set:元素无序、不可重复的集合
      • HashSet、LinkedHashSet、TreeSet
  • Map接口:双列数据,保存具有映射关系“key-value对”的集合,也称为键值对。
    • HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

现在我们开始学习List接口。

# 概述

  • 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组
  • List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
  • JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

# List接口方法

List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法。

  • void add(int index, Object ele):在index位置插入ele元素
  • boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
  • Object get(int index):获取指定index位置的元素
  • int indexOf(Object obj):返回obj在集合中首次出现的位置,如果找不到返回-1。
  • int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
  • Object remove(int index):移除指定index位置的元素,并返回此元素。
    • 注意父类Collection也有一个方法是 boolean remove(Object obj)
      • 通过元素的equals方法判断是否是要删除的那个元素。只会删除找到的第一个元素。
    • 所以List类可以按索引或者对象来删除。
  • Object set(int index, Object ele):设置指定index位置的元素为ele
  • List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合(左闭右开区间)
    • 本身list不会改变。

# 面试题

请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?

ArrayList和LinkedList的异同

  • 二者都线程不安全,相对线程安全的Vector,执行效率高。

  • 此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

  • 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

  • 对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。

ArrayList和Vector的区别

  • Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。

  • 正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。

  • Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。

  • Vector还有一个子类Stack。

# 总结

ArrayList、LinkedList和Vector三者的异同

同:

  • 三各类都是实现了List接口, 存储数据的特点相同:存储有序的、可重复的数据。

不同:

  • ArrayList:作为List接口的主要实现类,线程不安全的,效率高;底层使用动态数组存储
  • LinkedList:对于频繁的插入、删除操作,使用此类比Arraylist效率高;底层使用双向链表存储
  • Vector:作为List接口的古老实现类,线程安全的,效率低;底层使用动态数组存储

常用方法

  • 增:add(Object obj)
  • 删:remove(int index) / remove(Object obj)
  • 改:set(int index, Object ele)
  • 查:get(int index)
  • 插:add(int index,Object obj)
  • 长度:size()
  • 遍历:
    • 1、Iterator迭代器
    • 2、增强for循环
    • 3、普通for循环
帮我改善此页面 (opens new window)
#List#ArrayList#LinkedList#Vector
上次更新: 2020/12/27, 05:00:47
Collection
ArrayList

← Collection ArrayList→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式