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. django知识点回顾(上)

    Django---知识点: 1. 配置文件: media: avatar = models.FileField(upload_to='avatar')#数据库里的model MEDIA_ROOT=os ...

  2. Arduino IDE for ESP8266 项目(4)HTTP客户端+服务端

    Arduio for esp8266  官网API:http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html 很有 ...

  3. 《深入理解Java虚拟机》笔记(转)

    文章来自http://www.cnblogs.com/tianchi/archive/2012/11/11/2761631.html 在C里面我们想执行一段自己编写的机器指令的方法大概如下: type ...

  4. 堆-STL

    往堆中加一个元素的算法(put): #include<algorithm> void put (int d) { heap[++heap_size]=d; push_heap(heap+, ...

  5. IDEA中使用vim删除复制代码的行号

    从别的地方复制来的源代码有时候会把前面的行号也一起拷过来,如果只是十几行代码的话手工去除还是方便的,但是如果代码有很多行的话,一行一行地删就不明智了. 例如我要复制以下代码 1 public clas ...

  6. PAT A1102 Invert a Binary Tree (25 分)——静态树,层序遍历,先序遍历,后序遍历

    The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ...

  7. java 二维数组和对象数组

    1.二维数组:二维数组就是存储一维数组(内存地址/引用)的数组 2.二维数组的初始化 1) int intA[][]={{1,2},{2,3},{3,4,5}}; 2) int [][] intB=n ...

  8. 学习CSS布局 - dispaly属性

    "display"属性 display 是CSS中最重要的用于控制布局的属性. 每个元素都有一个默认的 display 值,这与元素的类型有关. 对于大多数元素它们的默认值通常是  ...

  9. 洛谷 P2835 刻录光盘

    题目链接 https://www.luogu.org/problemnew/show/P2835 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘 ...

  10. Luogu4040 AHOI/JSOI2014 宅男计划 贪心、二分、三分

    传送门 仍然对"为什么这个函数单峰"的问题毫无理解 首先,对于保质期又低.价格又贵的食物,我们显然不需要购买它.所以如果设\(pri_i\)表示保质期不小于\(i\)的所有食品中价 ...