ArrayList实现

ArrayList实现
数组实现
父类:AbstractList
接口:List,RandomAccess,Cloneable,Serializable
字段:
//默认容量
private static final int DEFAULT_CAPACITY = 10;
//空的数组,构造函数参数为0和trim中使用,构造参数给0的人绝对会被打死,每放一个元素,就要重新copy一次
private static final Object[] EMPTY_ELEMENTDATA = {};

//实际保存数组,transient,这个字段不用写入流
transient Object[] elementData
//实际元素数目
private int size;

 public ArrayList(int initialCapacity) 
{if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//注意初始容量为0时给的对象,EMPTY_ELEMENTDATAthis.elementData = EMPTY_ELEMENTDATA;}else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}}public ArrayList(){//默认构造函数this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}public ArrayList(Collection<? extends E> c) 
{//转入的集合转换为数组elementData = c.toArray();//改变自己的sizeif ((size = elementData.length) != 0) {//这里有个坑,可能不能正确的返回Object[] Class对象,不能的话复制// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);} else {// replace with empty array.this.elementData = EMPTY_ELEMENTDATA;}}//截断,在原数组上移动
public void trimToSize() 
{modCount++;if (size < elementData.length) {elementData = (size == 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);}}//比较关心的几个方法,存放,取出,查找
//查找,运行时间上界O(n),从这里也可用看出是允许放null
public int indexOf(Object o) 
{if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)if (o.equals(elementData[i]))return i;}return -1;}//反向查找public int lastIndexOf(Object o) 
{if (o == null) {for (int i = size-1; i >= 0; i--)if (elementData[i]==null)return i;} else {for (int i = size-1; i >= 0; i--)if (o.equals(elementData[i]))return i;}return -1;}
//返回index位置的元素
E elementData(int index) 
{return (E) elementData[index];}//获取对应位置元素,O(1)public E get(int index) 
{//检查size,并没有判断小于0rangeCheck(index);return elementData(index);
}//将元素放在对应位置,index<size,list当成数组使用,注意,这样的代码会报错
//List<String> list = new ArrayList<>(100);
//		list.set(10, "123");
//根据构造函数可以知道,已经开辟了100长度的数组,但是就是不让你用public E set(int index, E element) 
{rangeCheck(index);E oldValue = elementData(index);elementData[index] = element;return oldValue;
}private void grow(int minCapacity) 
{// overflow-conscious codeint oldCapacity = elementData.length;//原来的1.5备长度int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win://注意是新开辟一个数组给elementDataelementData = Arrays.copyOf(elementData, newCapacity);}private void ensureExplicitCapacity(int minCapacity) 
{modCount++;// overflow-conscious code//1-0,进入if,进行内存复制,开辟新的数组if (minCapacity - elementData.length > 0)grow(minCapacity);
}private void ensureCapacityInternal(int minCapacity) 
{//构造函数给0,这里是falseif (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}//ensureExplicitCapacity(1);ensureExplicitCapacity(minCapacity);}//增加一个元素public boolean add(E e) {//为什么构造函数给0会被打死,看下面这个函数,一来就要新数组,新的数组长度也只有1ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;}//元素放到index位置,0<=index<size
public void add(int index, E element) 
{rangeCheckForAdd(index);ensureCapacityInternal(size + 1);  // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;
}
//移除public E remove(int index) 
{rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;//内存复制if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;
}
//O(n)的移除,注意在fastRemove方法里面也会出现内存复制
public boolean remove(Object o) 
{if (o == null) {for (int index = 0; index < size; index++)if (elementData[index] == null) {fastRemove(index);return true;}} else {for (int index = 0; index < size; index++)if (o.equals(elementData[index])) {fastRemove(index);return true;}}return false;}//为什么elementData不用置null,方便重用
public void clear() 
{modCount++;// clear to let GC do its workfor (int i = 0; i < size; i++)elementData[i] = null;size = 0;}//浅克隆
public Object clone() 
{try {ArrayList<?> v = (ArrayList<?>) super.clone();v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}}//返回副本public Object[] toArray() 
{return Arrays.copyOf(elementData, size);
}结尾附上一个内存分布的代码,有指针真好
int main(int argc, char* argv[])
{//int ba[4];int a[] = { 1, 2, 3, 4 };int c = 5;int d = 6;int dd = 7;cout << a << endl;cout << a[-1] << endl;cout << a-1 << endl;cout<<&dd<<endl;cout << &d << endl;cout << &c << endl;//memcpy(ba, a, sizeof(int) * 4);//cout << ba[0] << endl;//cout << ba[1] << endl;return 0;
}

  

 

posted on 2017-09-10 23:27 好吧,就是菜菜 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/7502877.html

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

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

相关文章

oracle数据本机自动备份

1、创建三个文件 exp.list 内容&#xff1a;oracle数据库的用户名和密码 name pwd exp.log 主要用于存储在自动备份数据库时的日志信息 exp.sh #!/bin/sh#找到数据库的路径 export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/10.2.0/db_1 export …

Chrome浏览器切换到之前打开的标签页会重新加载

这是谷歌的一种策略。当系统内存不足时&#xff0c;系统会自动从内存中舍弃标签页 在地址栏输入chrome://flags/#automatic-tab-discarding&#xff0c;设置为停用即可。转载于:https://www.cnblogs.com/freefish12/p/5435585.html

数据结构之判断一棵树是不是满二叉树

1 满二叉树 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。 2 分析 我们知道满二叉树是三…

【Pix4d精品教程】Pix4DMapper 4.4.10/4.4.12/4.5.6经典手把手图文安装教程(附安装包下载)

Pix4Dmapper系列文章合集: 打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法安装Pix4Dmapper时提示“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”完全解决办法Pix4Dmapper完整航测内业操作流程手把手图文教程Pix4Dmapper是一款目前比…

php基础教程 第一步 环境配置及helloworld

PHP 是服务器端脚本语言。全称为 Hypertext Preprocessor 为超文本预处理器。 据说php8不久后也要发布了&#xff0c;趁着8还没有发布赶紧写一个php5到php7&#xff08;在基础教程写完后将写php7新特性&#xff09;的教程。PHP版本之间更新会增加新特性&#xff08;别的语言也…

Hadoop(五)C#操作Hive

HiveHive将HiveQL&#xff08;类sql语言&#xff09;转为MapReduce&#xff0c;完成数据的查询与分析&#xff0c;减少了编写MapReduce的复杂度。它有以下优点&#xff1a;学习成本低&#xff1a;熟悉sql就能使用良好的数据分析&#xff1a;底层基于MapReduce实现同样存在一些缺…

【Solidity】3.类型 - 深入理解Solidity

索引 【Solidity】1.一个Solidity源文件的布局【Solidity】2.合约的结构体 【Solidity】3.类型 【Solidity】4.单位和全局可变量 【Solidity】5.表达式和控制结构 【Solidity】6. 合约 【Solidity】7. 部件 【Solidity】8. 杂项 类型 Solidity是一种静态类型的语言&#xff0c;…

etree解析xml_在python中使用Etree解析XML配置文件

请帮助我使用lxml etree解析以下原型的配置文件。我尝试了for event&#xff0c;element和tostring。不幸的是&#xff0c;我不需要文本&#xff0c;而是需要对于给定的属性。在我从这段代码开始&#xff0c;但是在搜索属性时遇到一个键错误&#xff0c;因为它从一开始就扫描^{…

深度优先搜索——八皇后问题

代码&#xff1a;&#xff08;控制台打印不了92种情况&#xff0c;只打印前10种&#xff09; 1 #include<iostream>2 #include<string>3 #include<windows.h>4 #define ok 15 #define error 06 using namespace std;7 8 9 int a[9][9]{0}; 10 int num0; 1…

【CASS精品教程】CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总

目录 第一种方法:Win+R 第二种方法:选择打开方式 第三种方法:cmd 在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无响应,提示roadpara,如下所示:

数据结构之判断一棵树是不是完全二叉树

1 完全二叉树 完全二叉树是由 满二叉树 而引出来的。对于深度为K的&#xff0c;有n个结点的二叉树&#xff0c;当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 如下就是完全二叉树 12 3 4 5 …

ubuntu添加中文输入法

Ubuntu上的输入法主要有小小输入平台&#xff08;支持拼音/二笔/五笔等&#xff09;&#xff0c;Fcitx&#xff0c;Ibus&#xff0c;Scim等。其中Scim和Ibus是输入法框架。在Ubuntu的中文系统中自带了中文输入法&#xff0c;通过CtrlSpace可切换中英文输入法。这里我们主要说下…

打开vs2010,提示无效的许可证数据,需要重新安装

解决办法&#xff1a; 1. 找到安装路径下Microsoft Visual Studio 10.0\Common7\IDE\DDConfigCA.exe ,使用管理员权限运行该exe文件&#xff0c;等待自然退出&#xff1b; 2. 重启VS&#xff0c;重新输入产品密钥&#xff0c;VS2010专业版&#xff08;or旗舰版&#xff09;密…

python3 爬虫第三步 本文包你学会正则 不会就来锤我

简介 正则表达式是一种描述字符的一种方式&#xff0c;通过该方式&#xff0c;匹配字符串。 正则表达式是自由的&#xff0c;一个字符的含义往往代表着一类字符&#xff0c;通过多个正则正则符号的组合描述&#xff0c;可以使组成的正则表达式能够描述一类字符串。 在开发中&a…

.NET性能优化-使用结构体替代类

前言我们知道在C#和Java明显的一个区别就是C#可以自定义值类型&#xff0c;也就是今天的主角struct&#xff0c;我们有了更加方便的class为什么微软还加入了struct呢&#xff1f;这其实就是今天要谈到的一个优化性能的Tips使用结构体替代类。那么使用结构体替代类有什么好处呢&…

ISE14.7兼容性问题集锦

一、 关于win8和win10不兼容性解决办法 &#xff08;win7不会出现闪退的问题&#xff0c;按安装流程做完就可以直接使用了&#xff09; 在安装目录下&#xff0c;我这里是D:\ISE_14.7\14.7\ISE_DS\ISE\lib\nt64中找到libPortability.dll和libPortabilityNOSH.dll两个文件夹&…

幼儿园调查过程怎么写_深圳全托幼儿园哪个好 幼儿园寄宿怎么报名

陪孩子一起阅读的精髓不是认字和背诵&#xff0c;亲子阅读的那些事 亲子阅读是当代的养育新潮流&#xff0c;但它还有更可贵的一面。 脾气再大的妈妈&#xff0c;都有温柔可爱的时刻&#xff0c;就是陪伴孩子阅读的时刻&#xff0c;曾经有一位在我看来算不上温柔的妈妈&#xf…

调优 PHP

调优 PHP PHP 是运行应用程序代码的引擎。应该仅安装计划使用的那些模块&#xff0c;并配置您的 Web 服务器&#xff0c;使之仅为脚本文件&#xff08;通常是以 .php 结尾的那些文件&#xff09;使用 PHP&#xff0c;而非所有静态文件。操作码缓存 请求一个 PHP 脚本时&#x…

ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 目录 一、地理配准工具条简介 二、地理配准过程 1、加载数据&#xff08;点击下载&#xff09;提取码&#xff1a;v9y8 2、加载地理配准工具条 3、添加控制点 …

cocos2d-x知识总结

1. CCMoveTo动作运行多次&#xff0c;位置会发生诡异的变化&#xff0c;比如变成目标位置的几倍。解决办法&#xff0c;确保每次CCMoveTo之前停止之前的动作。 2. 在onEnter()函数中&#xff0c;忘记调用父类的onEnter()函数会导致动画等无效。还有在init()函数中&#xff0c;谨…