ArrayList整理

ArrayList整理

  • 1,ArrayList特性
  • 2,ArrayList底层实现的特征
    • 1),ArrayList初始化
    • 2),初始容量
    • 3),ArrayList的添加元素的add()方法
    • 4),ArrayList的删除方法remove(int index)
    • 其他的一些方法的操作其实都差不多,所以就不过多累述了。

1,ArrayList特性

ArrayList底层是动态数组,所以根据数组的特性可知:

//可知ArrayList底层实际就是一个数据,通过transient修饰,标识不可以被序列化
transient Object[] elementData;
1,ArrayList中存储元素位置的地址是一串连续的地址值。2,由于数组有索引,所以ArrayList对于元素的查找与修改效率快;增加与删除效率低,因为需要移动目标元素之后的所有元素。3,但是在增加元素到最后一个位置与删除最后一个元素效率是高的。

2,ArrayList底层实现的特征

1),ArrayList初始化

//先定义了两个个空数组
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//再来看看ArrayList的三个构造函数
//1,自己传入数组的初始容量(initialCapacity)
public ArrayList(int initialCapacity) {//判断我们传入的初始容量是否大于0if (initialCapacity > 0) {//如果大于0,则直接使用new关键字创建长度为initialCapacity的数组,并将elementData指向该数组this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//如果等于0,则将elementData指向之前定义的空数组this.elementData = EMPTY_ELEMENTDATA;} else {//小于0的话就抛出一个非法参数异常throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}
}
//2,无参构造器
public ArrayList() {//如果是无参构造器的话,就直接将elementData指向之前定义的空数组(注意,没看错,就是空)this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//3,传入一个列表,根据传入的列表创建一个ArrayList列表
public ArrayList(Collection<? extends E> c) {//首相我们看到传入的集合调用了toArray()方法(将列表转化成数组)//c.toArray();返回的是一个Object[]elementData = c.toArray();if ((size = elementData.length) != 0) {if (elementData.getClass() != Object[].class)//如果elementData不是一个Object[],那么就将elementData中的所有//元素都复制到一个Object[]中,再将该数组给elementDataelementData = Arrays.copyOf(elementData, size, Object[].class);} else {//如果传入集合的长度是0,那么就将elementData指向空数组this.elementData = EMPTY_ELEMENTDATA;}
}

2),初始容量

//从这一段代码可知ArrayList的初始容量是10
//但是默认初始化的时候却是一空数组,所以初始化还没结束,接下来的add方法我们回提到
private static final int DEFAULT_CAPACITY = 10;

3),ArrayList的添加元素的add()方法

//向ArrayList中添加元素
public boolean add(E e) {//调用了一个ensureCapacityInternal方法,参数是size+1(size就是数组中元素的多少,不是数组长度,默认是0)ensureCapacityInternal(size + 1);//这时如果需要扩容的话就已经做好了扩容,直接赋值,不需要扩容就直接赋值elementData[size++] = e;return true;
}
//进入到ensureCapacityInternal方法
private void ensureCapacityInternal(int minCapacity) {//首先判断了一下elementData是否是一个空数组,也就是第一次添加元素的时候对数组进行初始化(长度是10)if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//如果是的话,那么将DEFAULT_CAPACITY(先前提到,这就是默认长度10)与传入的参数(size+1)中的最大值//给minCapacityminCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}//这里又调用了ensureExplicitCapacity方法,参数是刚刚取得的最大值ensureExplicitCapacity(minCapacity);
}
//进入ensureExplicitCapacity方法
private void ensureExplicitCapacity(int minCapacity) {//将modCount自增modCount++;//如果minCapacity大于数组的长度,说明我们这次添加元素会导致超出数组的长度//那么可知,原来这一串的方法都是为了一件事,那就是判断是否需要扩容if (minCapacity - elementData.length > 0)//如果需要扩容的话,那么就调用grow方法,参数是minCapacitygrow(minCapacity);
}
//进入grow方法
private void grow(int minCapacity) {// 首先获得数组的长度int oldCapacity = elementData.length;//新数组的长度是旧数组长度的2倍(右移2位标识原来的0.5)int newCapacity = oldCapacity + (oldCapacity >> 1);//如果计算出来的新数组长度小于minCapacity(即添加元素后数组的长度,size+1或者默认为10)if (newCapacity - minCapacity < 0)//则将minCapacity作为新数组长度//这一步主要就是调用无参构造时,默认长度是10,但是在初始化的时候数组还是0//所以在添加第一个元素的时候将数组进行初始化,即数组的长度是10newCapacity = minCapacity;//如果新数组的长度大于设置的最大数组长度if (newCapacity - MAX_ARRAY_SIZE > 0)//进入hugeCapacity方法newCapacity = hugeCapacity(minCapacity);// 使用Arrays.copyOf()方法将数组进行扩容,并将就数组中的元素全部复制到新数组中elementData = Arrays.copyOf(elementData, newCapacity);
}
//hugeCapacity方法
private static int hugeCapacity(int minCapacity) {//如果小于0则直接抛出异常if (minCapacity < 0) // overflowthrow new OutOfMemoryError();//如果大于最大设置的长度,则将int的最大值给它return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;
}

4),ArrayList的删除方法remove(int index)

//删除指定位置元素
public E remove(int index) {//首先调用rangeCheck,作用是判断传入的index是否合法rangeCheck(index);//modCount自增modCount++;//将该位置的元素找出E oldValue = elementData(index);//判断index所在的位置是否是最后一位int numMoved = size - index - 1;if (numMoved > 0)//如果index不在最后一位//则使用System.arraycopy()方法将index之后的所有元素赋值到index位置(从index位置开始)//例如:2,3,4,5    其中index = 1;//那么:使用System.arraycopy()后为 2,4,5,5System.arraycopy(elementData, index+1, elementData, index,numMoved);//将最后一位设置为nullelementData[--size] = null; // clear to let GC do its workreturn oldValue;
}

其他的一些方法的操作其实都差不多,所以就不过多累述了。

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

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

相关文章

ASP.NET Core CORS 简单使用

CORS 全称"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。 跨域就是不同域之间进行数据访问&#xff0c;比如 a.sample.com 访问 b.sample.com 中的数据&#xff0c;我们如果不做任何处理的话&#xff0c;就会出现下面的错误&#xff1a; XM…

3-1 Apache Shiro权限管理框架介绍

Apache Shiro 这是一个功能强大的 shiro相对于security 更简单 易懂的授权方式

mybatis配置步骤

一&#xff0c;mybatis配置步骤 ​ 1&#xff0c;创建一个maven项目 ​ 2&#xff0c;在pom.xml文件中导入相关的jar包依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven…

vue的Prop属性

转载自 PropProp 的大小写 (camelCase vs kebab-case) HTML 中的特性名是大小写不敏感的&#xff0c;所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时&#xff0c;camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名…

.NET Core 1.1 Preview 1上线:支持macOS 10.12/Linux Mint 18

自2014年以来微软陆续对.NET Framework的核心组件进行开源&#xff0c;去年2月公司完成进度并向开源社区发布.NET CoreCLR。经过一年多的发展&#xff0c;开发者于今年6月获得.NET Core 1.0&#xff1b;而现在公司再次推出了1.1 Preview 1版本。 本次版本更新包括添加了多款Lin…

3-7 基于SpringBoot的Apache Shiro环境快速搭建与配置实操

去网站上 spring.io https://start.spring.io/ 去网站拉一个模板下拉 下载一个模板 打开后看一下 使用的pom.xml 我们要用到数据库 使用一个数据库的管理 阿里巴巴的druid 这个是sping非常常用的工具包经常使用的 字符串日期操作都使用这个 springframwork是…

反射、HashMap、ArrayList与LinkedList区别

1&#xff0c;反射机制答&#xff1a;JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为…

vue非编译的模块化写法

项目目录 ●/ ●index.html ●js/ ●main.js ●myComponent.js ●routes.js ●textComponent.js ●lib/ ●vue.js ●vue-router.js ●require.min.js 一、构建require.js环境 &#xff08;1&#x…

3-8 基于SpringBoot连接数据库与配置MyBatis实操 创建表sql

11 13-8 基于SpringBoot连接数据库与配置MyBatis实操 springSecurity提供了 现成的基于内存管理的类 shiro则必须自己设计这样的类 需要自己设计用户权限这样的体系 这里基于RBAC简单的设计一套 -- 权限表 -- CREATE TABLE permission (pi…

struts基本概念(1)

model1:1,纯jsp2.jspjavabeanmodel2&#xff1a;MVC: jspservletjavabean m:model (模型)封装数据&#xff0c;业务处理类 &#xff0c;返回处理结果v:view(视图)展示数据c&#xff1a;cotroller&#xff08;控制器&#xff09;处理请求&#xff0c;模型和视图之间进行转换DTD…

使用 RxJS 实现 JavaScript 的 Reactive 编程

简介 作为有经验的JavaScript开发者&#xff0c;我们会在代码中采用一定程度的异步代码。我们不断地处理用户的输入请求&#xff0c;也从远程获取数据&#xff0c;或者同时运行耗时的计算任务&#xff0c;所有这些都不能让浏览器崩溃。可以说&#xff0c;这些都不是琐碎的任务&…

vue组件自定义v-model

转载自 vue组件&#xff0c;自定义v-model方法1<my-component v-model"obj"></my-component>在使用my-component组件时&#xff0c;为了实现双向绑定。1234567891011121314Vue.component(my-component, {props: {obj: Object,},model: {prop: obj,event…

权限管理系统

11 已经有现成的spring Security 和 Apache shiro 为什么还要开发自己的一套权限管理系统 1.必须按照框架的要求进行配置&#xff0c;会被框架限制&#xff0c;差一点点就转不起来&#xff0c;犯一点点错误都不行&#xff0c; 2.没有界面操作&#xff0c;和查看&#xf…

vue watch监听对象

一、watch的API vm.$watch( expOrFn, callback, [options] ) 参数&#xff1a; {string | Function} expOrFn{Function | Object} callback{Object} [options] {boolean} deep{boolean} immediate 返回值&#xff1a;{Function} unwatch 用法&#xff1a; 观察 Vue 实例变化的…

从.NET和Java之争谈IT这个行业

一、有些事情难以回头 开篇我得表名自己的立场:.NET JAVA同时使用者,但更加偏爱.NET.原因很简单 1.NET语言更具开放性,从开源协议和规范可以看出; 2.语言更具优势严谨; 3.开发工具VS更具生产力; 然而 1.Java,C#的职位比率在4:1,虽然这不是什么问题,因为求职竞争的比例更大(JAVA…

权限管理系统2_权限表,权限模块表

CREATE TABLE sys_acl_module ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 权限模块id, name varchar(20) NOT NULL DEFAULT COMMENT 权限模块名称, parent_id int(11) NOT NULL DEFAULT 0 COMMENT 上级权限模块id, level varchar(200) NOT NULL DEFAULT COMMENT …

struts基本概念(2)

一、struts使用步骤&#xff1a;1.导包&#xff08;基本&#xff09;2.web.xml配置struts控制器 C3.页面开发 V4.处理类开发 M()5.配置struts.xml 6.部署运行二、struts访问session(servlet )1.解耦方式:ActionContext Map 2.耦合方式:ServletActionContextHttpSession 三…

vue2.0 $router和$route的区别

转载自 vue2.0 $router和$route的区别在vue2.0里页面参数是 this.$route.query或者 this.$route.params 接收router-link传的参数。 在路由跳转的时候除了用router-link标签以外需要在script标签在事件里面跳转&#xff0c;所以有个方法就是在script标签里面写this.$router.pu…

基于Bootstrap 3.x的免费高级管理控制面板主题:AdminLTE

AdminLTE 是一个基于Bootstrap 3.x的免费高级管理控制面板主题。AdminLTE - 是一个完全响应式管理模板。基于Bootstrap3框架。高度可定制的&#xff0c;易于使用。适合从小型移动设备到大型台式机很多的屏幕分辨率。 在线预览: http://almsaeedstudio.com/preview/ AdminLTE 在…

Spring MVC开发环境搭建

现在springMVC是非常常用的框架&#xff0c;很多公司的内部都是使用这个框架 打开maven查询jar包的网址 mvnrepository.com 测试是否成功 war:只是运行 war expord: 运行且调试