ArrayList封装
package com.cn.test.jihe; import java.util.Arrays; /**
*
* insert
* delete
* update
* get
*
*/
public class ArrayList { /**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {}; Object[] elementData; private int size; protected int modCount = 0; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; public ArrayList(int initialCapacity) throws Exception {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new Exception("illegal Capital" + initialCapacity);
}
} public ArrayList() {
this.elementData = EMPTY_ELEMENTDATA;
} public boolean add(Object obj) {
// 首先比较数组的长度
ensureCapitalInteral(size + 1);
elementData[size ++] = obj;
return false;
} public void add(int index, Object obj) throws Exception {
/**
* 首先判断要index的位置
*/
rangCheckForAdd(index);
ensureCapitalInteral(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = obj;
size++;
} private void rangCheckForAdd(int index) throws Exception {
if (size < index || index < 0) {
throw new Exception("数组下标越界" + index);
}
}
boolean contains(Object o ) {
return indexOf(o) >= 0;
} /**
* 返回位置上的下标
* @param index
* @return
* @throws Exception
*/
Object get(int index) throws Exception {
rangeCheck(index);
return elementData[index];
}
/**
* 列表没有元素返回true
* @return
*/
boolean isEmpty() {
return size == 0;
} /**
* 返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。
* @param o
* @return
*/
int lastIndexOf(Object o) {
if (null == o) {
// 逆序循环数组
for (int i = size - 1; i >= 0; i--) {
if (null == elementData[i]) {
return i;
}
}
} else {
for (int i = size - 1; i >= 0; i--) {
if (o.equals(elementData[i])) {
return i;
}
}
} return -1;
} /**
* 移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。
* @throws Exception
*/
Object remove(int index) throws Exception {
// 下标的检查
rangeCheck(index);
Object oldValue = elementData[index];
int numMove = size - index - 1;
if (numMove > 0) { // 表示删除的不是最后一个元素
System.arraycopy(elementData, index + 1, elementData, index, numMove);
}
elementData[size--] = null;
return oldValue;
} /**
* 移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。
*/
boolean remove(Object object) throws Exception {
// object 是否在该数组中
int index = indexOf(object);
if(index >= 0) {
// 删除下标
int moveNum = size - index - 1;
if (moveNum > 0) {
System.arraycopy(elementData, index + 1, elementData, index, moveNum);
}
elementData[size--] = null;
return true;
} return false; }
/**
* 用指定的元素替代此列表中指定位置上的元素,
* 并且将旧元素返回
* @throws Exception
*/
Object set(int index, Object element) throws Exception {
// 1. 判断index的下标越界问题
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = element;
return oldValue; } /**
* 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
由于此列表不维护对返回数组的任何引用,,因而它将是“安全的”。(换句话说,此方法必须分配一个新的数组)。因此,调用者可以自由地修改返回的数组。
* @return
*/
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
} private void rangeCheck(int index) throws Exception { if (size <= index) {
throw new Exception("下标越界" + index);
} } private int indexOf(Object o) {
if(null == o) {
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 size() {
return size;
}
private void ensureCapitalInteral(int minCapacity) {
ensureExplicitCapacity (calculateCapacity(elementData, minCapacity));
} private void ensureExplicitCapacity(int calculateCapacity) {
modCount++;
if (calculateCapacity - elementData.length > 0) {
grow(calculateCapacity);
} } private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0) // int的数组超限
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0) {
newCapacity = hugeCapacity(minCapacity);
}
elementData = Arrays.copyOf(elementData, newCapacity); } private int hugeCapacity(int minCapacity) {
if (minCapacity < 0) {
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
} private int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY,minCapacity);
}
return minCapacity;
}
}
ArrayList封装的更多相关文章
- Java源码分析之ArrayList
ArrayList是以数组为基准的容器类,和LinkedList(链表)正好相反.因而ArrayList拥有更好的查找性能,增删操作则差一些.ArrayList封装了对于常规数组的操作,同时可以自动扩 ...
- JDK1.8源码学习-ArrayList
JDK1.8源码学习-ArrayList 目录 一.ArrayList简介 为了弥补普通数组无法自动扩容的不足,Java提供了集合类,其中ArrayList对数组进行了封装,使其可以自动的扩容或缩小长 ...
- Java集合【8】-- ArrayList源码分析
目录 1. ArrayList 1.1 ArrayList特点介绍 1.2 实现的接口和继承的类 2. 成员变量 3. 构造方法 4. 常用增删改查方法 添加元素 查询元素 更新元素 删除元素 5.自 ...
- 安卓开发之ListAdapter(一)
Adapter常用来管理数据,是连接后端数据和前端显示的适配器接口,是数据和UI(view)之间一个重要的纽带.再常见的view(listview.gridview)等地方都需要用到adapter,下 ...
- struts2 Advanced Learning
catalog . 引言 . struts2的类型转换 . struts2的输入校验 . struts2的拦截器机制 . 使用struts2的Ajax支持 . struts2 OGNL表达式 . st ...
- 设计模式之Interator模式(1)
interator是java容器遍历的一种手段,当然遍历容易你可以使用普通的for(;;)或者for(Object o : new Arraylist<Object>()),都是可以的. ...
- Struts2的类型转换
Struts2的类型转换 类型转换的作用: HTTP请求都是字符串类型,需要把这些字符串类型转化成相应的数据类型,使得Web应用的控制组件可以使用. 1.內建的类型转换器 Struts2可以完成大多数 ...
- [置顶] Adapter详解
动态添加数据适配器adapter Adapter是适配器,许多UI组件需要搭配Adapter来显示界面,例如Spinner与ListView,另外当我们需要动态的添加数据给UI组件时就需要Adapte ...
- 浅谈Java的集合体系
集合体系框架图 集合接口 Java集合类库将接口(interface)与实现(implementation)分离,如上图,Set是一个集合接口,而HashSet与TreeSet都是实现了Set接口的子 ...
随机推荐
- kali linux之无线渗透(续)
Airolib 设计用于存储ESSID和密码列表,计算生成不变的PMK(计算资源消耗型) PMK在破解阶段被用于计算PTK(速度快,计算资源要求少) 通过完整性摘要值破解密码SQLite3数据库存储数 ...
- DC010的精华分享【首发速看】
世界黑客大会[DC010] 是全球安全圈最神秘.最前沿的黑客大派对 而作为中国首个受DEFCON授权支持成立的 地区性 信息 安全 技术交流平台 DEFCONGROUP 010(DC010) 在国内 ...
- elasticsearch-analysis-pinyin
来源:https://github.com/medcl/elasticsearch-analysis-pinyin Pinyin Analysis for Elasticsearch This Pin ...
- saltstack 动态pillar实现
简介 pillar支持的数据存储方式有很多,mysql, mogo,json等.本篇介绍关于http存储方式. 首先简要说明整个流程:salt-master会去一个指定http发送get请求获取一个j ...
- java中的jdk配置详解:
1.配值系统变量"JAVA_HOME" 变量名JAVA_HOME: 指向:JDK(java开发工具包)的安装路径 目的:使用JDK安装目录时,可以直接通过”%JAVA_HOME%“ ...
- hive连接mysql遇到的问题
启动hive之前应该先启动metastore,也是在bin目录下:./hive --service metastore &然后再启动hive: ./hive 今天连接hive时总是报错:Una ...
- NSObject 中执行Selector 的相关方法
1. 对当前Run Loop中Selector Sources的取消 NSObject中的performSelector:withObject:afterDelay:方法将会在当前线程的Run Loo ...
- window.open完美替代window.showModalDialog
var url = "http//:www.baidu.com/" var name = "百度"; var iWidth = 1100;//弹窗宽度 var ...
- 【old】Python学习笔记
上学期看视频记得,也没学到多少,目前打算一边通过<Python学习手册 第四版>提高核心语法(太厚了 噗),一边学习Python Web开发 然后这里的多任务编程和网络编程是暑假学的 5. ...
- 2018青岛网络赛G - Couleur 区间上的启发式合并
题意:给出\(a[1...n]\),共\(n\)次操作,每次删除一个位置\(p_i\)(强制在线),此时区间会变为两个分离的区间,求每次操作的最大区间逆序对 首先要知道必要的工具,按权值建立的主席树可 ...