集合:List接口的实现类(ArrayList、LinkedList、Vector)
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)的更多相关文章
- ArrayList LinkedList Vector
ArrayList是基于数组实现的,没有容量的限制. 在删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量. ArrayList, Lin ...
- ArrayList, LinkedList, Vector - dudu:史上最详解
ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...
- java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...
- java类集框架(ArrayList,LinkedList,Vector区别)
主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ...
- Java集合(2)——深入理解ArrayList、Vector和LinkedList
回顾 Java集合主要分为两个体系结构,Collection和Map.这篇博客主要介绍Collection子接口List下的三个经常使用的实现类:ArrayList.Vector和LinkedList ...
- java集合类型接口和实现类个人总结
转载:http://blog.csdn.net/qingchunbusanchang/article/details/39576749 java的集合是一个比较综合的概念,相关的知识有很多的博客里面做 ...
- ArrayList,LinkedList,Vector集合的认识
最近在温习Java集合部分,花了三天时间读完了ArrayList与LinkedList以及Vector部分的源码.之前都是停留在简单使用ArrayList的API,读完源码看完不少文章后总算是对原理方 ...
- 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)
集合详解: /* Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢. ...
- 集合类源码(二)Collection之List(ArrayList, LinkedList, Vector)
ArrayList 功能 完全命名 public class ArrayList<E> extends AbstractList<E> implements List<E ...
随机推荐
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- python 并发专题(十三):asyncio (二) 协程中的多任务
. 本文目录# 协程中的并发 协程中的嵌套 协程中的状态 gather与wait . 协程中的并发# 协程的并发,和线程一样.举个例子来说,就好像 一个人同时吃三个馒头,咬了第一个馒头一口,就得等这口 ...
- bzoj4397[Usaco2015 dec]Breed Counting*
bzoj4397[Usaco2015 dec]Breed Counting 题意: 给定一个长度为N的序列,每个位置上的数只可能是1,2,3中的一种.有Q次询问,每次给定两个数a,b,请分别输出区间[ ...
- bzoj2697特技飞行*
bzoj2697特技飞行 题意: N个单位时间,每个单位时间可以进行一项特技动作,可选的动作有K种,每种动作有一个刺激程度Ci.每次动作的价值为(距上次该动作的时间)*Ci,若为第一次进行该动作,价值 ...
- SQL中的多表联查(SELECT DISTINCT 语句)
前言:(在表中,可能会包含重复值.这并不成问题,不过,有时你也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值.) 如果不加DISTINCT 的话,主表本来 ...
- 从JDK源码理解java引用
目录 java中的引用 引用队列 虚引用.弱引用.软引用的实现 ReferenceHandler线程 引用队列的实现 总结 参考资料 java中的引用 JDK 1.2之后,把对象的引用分为了四种类型, ...
- web自动化测试实战之批量执行测试用例
01实战之分离测试固件 在UI 自动化测试中,不管编写哪个模块的测试用例,都需要首先在测试类中编写测试固件初始化WebDriver类及打开浏览器,执行登录,才能进行下一步业务逻辑的操作,测试用例执行完 ...
- 使用Python进行自动化测试
目前大家对Python都有一个共识,就是他对测试非常有用,自动化测试里Python用途也很广,但是Python到底怎么进行自动化测试呢?今天就简单的向大家介绍一下怎么使用Python进行自动化测试,本 ...
- StringBuffer类和StringBuilder类
StringBuffer类和StringBuilder类 三者比较 String 不可变字符序列 底层用char[]存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层结构使用ch ...
- Java NIO的理解和应用
Java NIO是一种基于通道和缓冲区的I/O方式,已经被广泛的应用,成为解决高并发与大量连接和I/O处理问题的有效方式. Java NIO相关组件 Java NIO主要有三个核心部分组成,分别是:C ...