1、List接口

(1)特点

  • 有序(插入和取出的顺序相等,因为有一个整数索引记录了元素的插入的位置)
  • 允许有重复的元素(调用equals方法返回true,允许有多个null)
    @Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add(null);
list.add();
list.add(null);
System.out.println(list);
}
[, , null, , null]

(2)与collection相比的特有方法

  • add(index,元素):在指定的位置插入
  • get(index):获取指定位置的元素
  • remove(index):删除指定位置的元素
  • set(index,新元素):修改指定位置的元素
  • subList(index,index):根据索引范围截取一个子集合
  • indexOf(元素):查找

与collection接口的最大区别就是list接口的操作会涉及到索引。

2、List接口的特有方法

(1)增加元素

指定位置插入

    @Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add(null);
list.add();
list.add(null);
list.add(,"zhai");
System.out.println(list);
}
[, zhai, , null, , null]

(2)下标越界异常

    @Test
public void test1() {
List list=new ArrayList();
list.add(,"zhai");
System.out.println(list);
}
java.lang.IndexOutOfBoundsException: Index: , Size: 

程序源码:

判断索引的范围是否有效:

索引大于集合大小或索引小于0,抛出异常:

(2)删除元素

根据索引删除:

@Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add(null);
list.add();
list.add(null);
list.remove();
System.out.println(list);
}
[, , , null]

默认按照索引删除:

@Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
list.remove();
System.out.println(list);
}
[, , , ]

在可以按照索引删除和按照元素删除的情况下,List默认按照索引删除元素

编译器提示的也是按照索引删除,因为不存在100索引,会抛出异常:

java.lang.IndexOutOfBoundsException: Index: , Size: 

查看源码可以看出remove存在方法的重载,index是基本数据类型的数据,如果是按照内容移除还要讲int类型转换为Integer类型,显然是不合理的

 @Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
list.remove(new Integer());
System.out.println(list);
}
[, , , ]

直接传递引用类型的数据,不会再调用参数列表为int类型的remove方法,而是直接调用按照内容移除元素的方法

总结:

如果元素的类型为int的,默认按照索引删除;如果想要按照指定的元素删除,则需要装箱后再删除

(3)修改

(1)修改指定位置的元素:

@Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
list.set(,"2020年8月5日08:41:50");
System.out.println(list);
}
[, 2020年8月5日08::, , , ]

(4)查找

@Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
System.out.println(list.indexOf());
}
4

3、list接口的遍历方式

(1)迭代器

  @Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
Iterator iterator=list.iterator();
while (iterator.hasNext()){
Object l=iterator.next();
System.out.println(l);
}
}

(2)增强for

 @Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
for (Object l:list){
System.out.println(l);
}
}

(3)普通for

@Test
public void test1() {
List list=new ArrayList();
list.add("");
list.add("");
list.add();
list.add();
list.add();
for (int i=;i<list.size();i++){
System.out.println(list.get(i));
} }

因为list接口可以操作索引,因此,可以采用for循环遍历list接口的数据

4、ArrayList源码分析与底层结构

(1)可变长度的实现

代码:

@Test
public void test1() {
ArrayList list=new ArrayList();
for (int i=;i<=;i++){
list.add("join"+i);
}
for (int i=;i<=;i++){
list.add("join"+i);
}
System.out.println(list);
}

运行至集合中有10个元素:

底层实际上是可变数组,该数组是Object类型的,初始的时候数组的长度为0,第一次扩容为10,第二次为15,第三次增加为22... ... 也就是说数组的长度以1.5倍的速度增加

源码分析:

因为该变量是一个长度为0的数组:

add方法:

数组的扩容:

elementData是存储集合的可变数组:

5、Vector底层与ArrayList的对比

(1)相同点

底层都是可变数组

(2)不同点

版本:

  • ArrayList:新
  • Vector:旧

线程安全:

  • ArrayList:线程不安全,效率高
  • Vector:线程安全(同步),效率低

扩容倍数:

  • Vector变为原来的2倍

  • Arraylist:变为原来的1.5倍

6、LinkedList底层和源码分析

(1)LinkedList

底层是双向链表

  • 每个结点维护三个属性:item代表自己,next代表下一个元素,prev代表前一个元素
  • LinkedList维护两个重要属性:first和last,分别指向首结点和尾结点

(2)源码分析

构造器为空:

  public LinkedList() {
}

添加元素的源码分析:

   public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}

new Node<>(l, e, null):三个参数分别是:前一个、当前元素、下一个

尾插法添加元素,第一次添加first就是第一个元素,不为空的时候在last后添加

(3)与ArrayList的对比

底层结构

ArrayList:可变数组

LinkedList:双向链表

增删的效率

ArrayList:需要移动大量的元素效率较低

LinkedList:插入时不需要移动内存中的元素,只需要改变引用的指向即可,所以插入或删除的效率高

改查的效率

ArrayList:具有索引,查询或修改快

LinkedList:查询时从头部开始,一个一个地找,查询效率较低

使用场景

ArrayList:使用在查询比较多,插入删除较少的情况

LinkedList:使用在查询比较少,插入和删除比较多的情况

总结:

1、List的接口的三个实现类的选择

如果考虑线程安全的问题,采用Vector

不考虑线程安全的问题的话,如果查询较多用ArrayList,增删较多用LinkedList

集合:List接口的实现类(ArrayList、LinkedList、Vector)的更多相关文章

  1. ArrayList LinkedList Vector

    ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...

  2. ArrayList, LinkedList, Vector - dudu:史上最详解

    ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...

  3. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  4. java的List接口的实现类 ArrayList,LinkedList,Vector 的区别

    Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...

  5. java类集框架(ArrayList,LinkedList,Vector区别)

    主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ...

  6. Java集合(2)——深入理解ArrayList、Vector和LinkedList

    回顾 Java集合主要分为两个体系结构,Collection和Map.这篇博客主要介绍Collection子接口List下的三个经常使用的实现类:ArrayList.Vector和LinkedList ...

  7. java集合类型接口和实现类个人总结

    转载:http://blog.csdn.net/qingchunbusanchang/article/details/39576749 java的集合是一个比较综合的概念,相关的知识有很多的博客里面做 ...

  8. ArrayList,LinkedList,Vector集合的认识

    最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ...

  9. 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)

    集合详解: /* Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢. ...

  10. 集合类源码(二)Collection之List(ArrayList, LinkedList, Vector)

    ArrayList 功能 完全命名 public class ArrayList<E> extends AbstractList<E> implements List<E ...

随机推荐

  1. java 数据结构(十二):Collections工具类的使用

    Collections工具类1.作用:操作Collection和Map的工具类 2.常用方法:reverse(List):反转 List 中元素的顺序shuffle(List):对 List 集合元素 ...

  2. bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版

    bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...

  3. day8 python 列表,元组,集合,字典的操作及方法 和 深浅拷贝

    2.2 list的方法 # 增 list.append() # 追加 list.insert() # 指定索引前增加 list.extend() # 迭代追加(可迭代对象,打散追加) # 删 list ...

  4. 【软件安装】在 CentOS 7(Linux)上部署流媒体服务(Tengine、ffmpeg、Centos 7、nginx-http-flv-module、OBS)

    Centos7+Tengine+Nginx-http-flv-module+ffmpeg+OBS搭建流媒体服务器 一.需求和背景 视频直播是基于领先的内容接入.分发网络和大规模分布式实时转码技术打造的 ...

  5. vue :没有全局变量的计数器

    created: created () { let num = null this.mFun(num) }, methods: methods:{ mFun(m){ if (m === null) { ...

  6. 深入了解PHP的生成器

    在驾驶方面,速度并不会决定一切.但是在网络上,速度至关重要.你的应用程序越快,用户体验就越好.好吧,这时候有人就奇怪了,本文是关于PHP 生成器的,那么为什么我们要谈论速度呢?很快你就会发现,生成器在 ...

  7. 微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)

    (一) 准备工作 (1) 登录注册 注册账号:这就不谈了,只需要注意使用一个全新的邮箱,别之前注册过公众号小程序等就可以了 https://mp.weixin.qq.com/wxopen/waregi ...

  8. Linux常用命令(学习笔记)

    命令编写以遇到的生产问题的前后为顺序进行记录 虚拟机的镜像是centos6.5版本,在这个版本下,我个人整理记录了一些在linux上常用的命令以及一些项目部署需要的jdk.tomcat.mysql等的 ...

  9. spring读取jdbc(file方式)

    使用PropertyPlaceholderConfigurer类载入外部配置 在Spring项目中,你可能需要从properties文件中读入配置注入到bean中,例如数据库连接信息,memcache ...

  10. 微信PC端多开的秘密

    微信电脑端也能多开 昨天,偶然从好朋友小林(微信公众号:小林Coding)处得知,他的电脑居然可以同时上两个微信号. 手机端多开微信我知道,像华为.小米等手机系统都对此做了支持,不过在运行Window ...