List接口常用实现类的特点和底层实现

List接口常用的实现类有3个:ArrayList、LinkedList、Vector。

那么它们的特点和底层实现有哪些呢?

ArrayList特点和底层实现


ArrayList底层是用数组实现的存储。

特点:查询效率高,增删效率低,线程不安全。我们一般使用它。


图1

查看源码,我们可以看出ArrayList底层使用Object数组来存储元素数据。所有的方法,都围绕这个核心的Object数组来开展。


ArrayList是可以存放任意数量的对象,数组长度是有限的,那么是怎么实现的呢?

本质上就是通过定义新的更大的数组,将旧数组内容拷贝到新数组,来实现扩容。

ArrayList的Object数组初始化长度为10,如果我们存储满了这个数组,需要存储第11个对象,就会定义新的数组长度长度更大的数组,并将将原数组内容和新的元素一起加入到新数组中,源码中代码如下:

 public void   ensureCapacity(int   minCapacity) {

    modCount++;

    int   oldCapacity = elementData.length;

    if   (minCapacity > oldCapacity) {

        Object oldData[] =   elementData;

        int   newCapacity = (oldCapacity * 3)/2 + 1;

         if   (newCapacity < minCapacity)

       newCapacity = minCapacity;

            //   minCapacity is usually close to size, so this is a win:

            elementData =   Arrays.copyOf(elementData, newCapacity);

    }

}

LinkedList特点和底层实现

LinkedList底层用双向链表实现的存储。

特点:查询效率低,增删效率高,线程不安全。

双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。


每个节点都应该有3部分内容:

    class  Node {

       Node  previous;   //前一个节点

       Object  element;    //本节点保存的数据

       Node  next;       //后一个节点

}

我们查看LinkedList的源码,可以看到里面包含了双向链表的相关代码:


图2

注:entry在英文中表示“进入、词条、条目”的意思。在计算机英语中一般表示“项、条目”的含义。

Vector向量

Vector底层用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。


【图3】Vector的源码(indexOf方法)

建议

如何选用ArrayList、LinkedList、Vector?

·线程安全时,用Vector。

· 局部变量不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)

·局部变量不存在线程安全问题时,增加或删除元素较多用LinkedList。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面向对象的特征 —(13)

面向对象的特征一&#xff1a;封装与隐藏 1.为什么要引入封装性&#xff1f; 我们程序设计追求“高内聚&#xff0c;低耦合”。 高内聚 &#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合 &#xff1a;仅对外暴露少量的方法用于使用。…

jquery Ajax请求本地json

1-1-1 json文件内容(item.json) [{"name":"张国立","sex":"男","email":"zhangguoli123.com","url":"./img/1.jpg"},{"name":"张铁林","sex":"男"…

论文《learning to link with wikipedia》

learning to link with wikipedia 一、本文目标&#xff1a; 如何自动识别非结构化文本中提到的主题&#xff0c;并将其链接到适当的Wikipedia文章中进行解释。 二、主要借鉴论文&#xff1a; Mihalcea and Csomai----Wikify!: linking documents to encyclopedic knowledge 第…

java面向对象的特征二:继承性 —(14)

1.为什么要有类的继承性&#xff1f;(继承性的好处&#xff09; ① 减少了代码的冗余&#xff0c;提高了代码的复用性② 便于功能的扩展③ 为之后多态性的使用&#xff0c;提供了前提 图示&#xff1a; 2.继承性的格式&#xff1a; class A extends B{} A:子类、派生类、s…

java面向对象的特征三:多态性 —(15)

1.多态性的理解&#xff1a;可以理解为一个事物的多种形态。 2.何为多态性&#xff1a; 对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;或子类的对象赋给父类的引用&#xff09; 举例&#xff1a; Person p new Man(); Object obj new Date(); 3.多态性的…

vue 中$index $key 已移除

之前可以这样: 123456<ulid"example"><liv-for"item in items">{{$index}}{{$key}}</li></ul>现在已经移除,如果还用的话就会报错:Uncaught ReferenceError: $index is not defined; 现在这样写: 123456<ul id"example&qu…

vue-resource全攻略

Vue.js——vue-resource全攻略 概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用&#xff0c;并实现了一个简单的跨域CURD示例。Vue.js是数据驱动的&#xff0c;这使得我们并不需要直接操作DOM&#xff0c;如果我们不需要使用jQuery的DOM选择器&#xff0c;就没有必要…

java面向对象:关键字 —(16)

static:静态的 1.可以用来修饰的结构&#xff1a;主要用来修饰类的内部结构 属性、方法、代码块、内部类 2.static修饰属性&#xff1a;静态变量&#xff08;或类变量&#xff09; 2.1 属性&#xff0c;是否使用static修饰&#xff0c;又分为&#xff1a;静态属性 vs 非静态…

《少年先疯队》第九次团队作业:Beta冲刺与团队项目验收

博文简要信息表&#xff1a; 项目内容软件工程https://www.cnblogs.com/nwnu-daizh/本次实验链接地址https://www.cnblogs.com/nwnu-daizh/p/11056511.html团队名称少年先疯队作业学习目标&#xff08;1&#xff09;掌握软件黑盒测试技术&#xff1b;&#xff08;2&#xff09;…

vue-resource jsonp跨域问题解决方法

最近在学习vue.js 碰到个ajax跨域请求的问题&#xff0c;之前知道可以用jsonp解决&#xff0c;但是一直没实践过&#xff0c;这次用发现里面好多问题&#xff0c;所以现在记录下来&#xff0c;希望可以给刚接触使用jsonp的同学一点帮助&#xff01; 关于什么是jsonp&#xff0c…

java面向对象:关键字 —(17)

interface:接口 1.使用说明&#xff1a; 1.接口使用interface来定义 2.Java中&#xff0c;接口和类是并列的两个结构3.如何定义接口&#xff1a;定义接口中的成员 3.1 JDK7及以前&#xff1a;只能定义全局常量和抽象方法>全局常量&#xff1a;public static final的.但是…

java面向对象:异常处理 —(18)

1. 异常的体系结构 java.lang.Throwable |-----java.lang.Error:一般不编写针对性的代码进行处理。|-----java.lang.Exception:可以进行异常的处理|------编译时异常(checked)|-----IOException|-----FileNotFoundException|-----ClassNotFoundException|------运行时异常(un…

【vue报错】——listen EADDRINUSE :::8080 解决方案

问题原因&#xff1a; 此项错误表示 8080 端口被占用 解决方案一&#xff1a; 打开cmd 输入&#xff1a;netstat -ano 查看所有端口信息&#xff0c;如图&#xff0c;找到端口 8081&#xff0c;以及对应的 PID 输入&#xff1a;tskill PID 即可杀死进程 解决方案二&#xff1a…

HTML与CSS布局技巧总结

很多人对CSS的布局有困惑&#xff0c;实际的应用场景中由于布局种类多难以选择。今天我花些时间总结下自己对CSS布局的理解&#xff0c;分析下了解各种布局的优劣&#xff0c;同时希望能分享给初入前端的朋友们一些在布局上的经验&#xff0c;如果有那些地方总结的不好&#xf…

当谈论迭代器时,我谈些什么?

花下猫语&#xff1a;之前说过&#xff0c;我对于编程语言跟其它学科的融合非常感兴趣&#xff0c;但我还说漏了一点&#xff0c;就是我对于 Python 跟其它编程语言的对比学习&#xff0c;也很感兴趣。所以&#xff0c;我一直希望能聚集一些有其它语言基础的同学&#xff0c;一…

在Vue-cli项目中使用echarts

该示例使用 vue-cli 脚手架搭建 安装echarts依赖 npm install echarts -S11 或者使用国内的淘宝镜像&#xff1a; 安装 npm install -g cnpm --registryhttps://registry.npm.taobao.org11 使用 cnpm install echarts -S11 创建图表 全局引入 main.js // 引入echarts im…

通过GitHub Pages创建个人主页

登陆github,创建新仓库&#xff0c;写入名字, 这里要以github.io做后缀, 不然创建出来的不是GitHub Pages 打开终端, cd到自己想要的文件夹后clone到本地 git clone https://github.com/username/username.github.io 进入这个项目文件夹 cd username.github.io 把写好HTML项目拷…

validate+jquery+ajax表单验证

1.案例 1.1 Html form表单内容 <form class"cForm" id"cForm" method"post" action""> <p> <label for"user">用户名</label> <input id"user" name"user" required minlen…

设置Maven下载镜像源(直接替换其中的 settings.xml 内容即可)

<?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.…

P1576 最小花费

----------------------------------- 这道题就是图论最短路&#xff0c;但是我们要改一下一些细节 比如说&#xff0c;因为这是算汇率&#xff0c;我们的初始化就要是0 我们还要改一改松弛操作 ----------------------------------- 还有&#xff0c;题目上给的是汇率&#xf…