1.先上代码:

public class ArrayList<E> {

    private E[] data;
private int size; /**
* 构造方法,初始化容量capacity
* @param capacity
*/
public ArrayList(int capacity){
data = (E[]) new Object[capacity];
size = 0;
} /**
* 默认的构造方法,默认capacity=10
*/
public ArrayList(){
this(10);
} /**
* 获取数组中元素的个数
* @return
*/
public int getSize(){
return size;
} /**
* 获取数组的容量
* @return
*/
public int getCapacity(){
return data.length;
} /**
* 判断数组是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
} /**
* 在第index位置插入一个新元素
* @param index
* @param e
*/
public void add(int index,E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
//扩容
if (size == data.length){
resize(2*data.length);
}
//index后的元素都向后移动一位,注意:先移动后面的
for (int i = size; i > index;i--){
data[i+1] = data[i];
}
data[index] = e;
size++;
} /**
* 扩容
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++){
newData[i] = data[i];
}
data = newData;
} /**
* 向所有元素后添加一个新元素
* @param e
*/
public void addLast(E e){
add(size,e);
} /**
* 向所有元素前添加一个新元素
* @param e
*/
public void addFirst(E e){
add(0,e);
} /**
* 获取index索引位置的元素
* @param index
* @return
*/
public E get(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get Failed");
}
return data[index];
} /**
* 修改index位置的元素
* @param index
* @param e
*/
public void set(int index,E e){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get Failed");
}
data[index] = e;
} /**
* 判断数组中是否有元素e
* @param e
* @return
*/
public boolean contains(E e){
for (int i = 0; i < size; i++){
if(data[i].equals(e)){
return true;
}
}
return false;
} /**
* 查找元素e在数组中的位置,不存在返回-1
* @param e
* @return
*/
public int find(E e){
for (int i = 0; i < size; i++){
if(data[i].equals(e)){
return i;
}
}
return -1;
} /**
* 从数组中删除index位置的元素,返回删除的元素
* @param index
* @return
*/
public E remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("remove Failed");
}
E ret = data[index];
//删除后,index后面的元素向前都移动一位,从index+1开始移动
for (int i = index+1; i < size; i++){
data[i-1] = data[i];
}
size --;
if(size == data.length/4 && data.length != 0){
resize(data.length/2);
}
return ret;
} /**
* 从数组中删除第一个元素,
* @return
*/
public E removeFirst(){
return remove(0);
} /**
* 从数组中删除最后一个元素
* @return
*/
public E removeLast(){
return remove(size-1);
} /**
* 删除数组中元素e
* @param e
*/
public void removeElement(E e){
int index = find(e);
if(index != -1){
remove(index);
}
} @Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array:size = %d, capacity = %d \n",size,data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if(i != size-1){
res.append(",");
}
}
res.append(']');
return res.toString();
}
}

自己实现数据结构系列一---ArrayList的更多相关文章

  1. Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  2. <数据结构系列3>队列的实现与变形(循环队列)

    数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...

  3. <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)

    首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...

  4. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  5. java基础解析系列(十)---ArrayList和LinkedList源码及使用分析

    java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...

  6. 【C#数据结构系列】查找

    一:查找 1.1 基本概念和术语 查找(Search)是在数据结构中确定是否存在关键码等于给定关键码的记录的过程.关键码有主关键码和次关键码.主关键码能够唯一区分各个不同的记录,次关键码通常不能唯一区 ...

  7. java集合系列之ArrayList源码分析

    java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...

  8. java数据结构--array与ArrayList的区别

    ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...

  9. Java源码系列1——ArrayList

    本文简单介绍了 ArrayList,并对扩容,添加,删除操作的源代码做分析.能力有限,欢迎指正. ArrayList是什么? ArrayList 就是数组列表,主要用来装载数据.底层实现是数组 Obj ...

随机推荐

  1. css设置标签居中

    position: absolute;  //相对于已经定位的父元素的位置. left: 50%; top: 50%; transform: translate(-50%,50%);

  2. JFreeChart柱状图单组柱子的不同颜色显示

    JFreeChart柱状图中单组柱子用不同颜色来显示的实现方法是自定义一个Renderer来继承BarRenderer类,然后重载getItemPaint(int i,int j)方法. 实现效果如下 ...

  3. Android ActionBar全然解析,使用官方推荐的最佳导航栏(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/18234477 本篇文章主要内容来自于Android Doc.我翻译之后又做了些加工 ...

  4. Spark算子讲解(二)

    1:glom def glom(): RDD[Array[T]] 将原RDD的元素收集到一个数组,创建一个数组类型的RDD 2:getNumPartitions final def getNumPar ...

  5. Java内存区域划分、内存分配原理(转)

    文章引用自 http://blog.csdn.net/OyangYujun/article/details/41173747 运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若 ...

  6. python 打印 emoji

    python 打印 emoji 如需转发,请注明出处:小婷儿的python  https://www.cnblogs.com/xxtalhr/p/10486506.html 一.Unicode字符集: ...

  7. AS导入一个工程出现Error:please select Android SDK的错误

    导入一个新的工程出现:Error:please select Android SDK 的错误 现象描述:点击运行程序按钮,弹出一个“Edit Configure”的对话框,最下面报:Error:ple ...

  8. <转>jmeter(十七)目录结构

    之前了解过jmeter的目录结构,但只知道一些常用的配置文件,看到一篇介绍的比较详细的博客,就转载过来,当然,其实是自己懒得再去搜集更多资料慢慢看了,时间不够用... 原文链接:http://www. ...

  9. jmeter(十一)JDBC Request之Query Type

    工作中遇到这样一个问题: 需要准备10W条测试数据,利用jmeter中的JDBC Request向数据库中批量插入这些数据(只要主键不重复就可以,利用函数助手中的Random将主键的ID末尾五位数随机 ...

  10. 由javascript的闭包引申到程序语言编译上的自由变量作用域的考量

    function foo() { var x = 10; return function bar() { console.log(x); }; } // "foo"返回的也是一个f ...