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. css3属性中background-clip与background-origin的用法释疑

    困惑在哪里? background-clip 与 background-origin是css3中引入的两个跟元素背景相关的属性,它们有相同的可选值,即border.padding.content 三种 ...

  2. ThinkPHP5.0 实现 app微信支付功能

    相对于之前随笔写的<ThinkPHP5.0实现app支付宝支付功能>来说,php对接app微信支付功能就相对简单的多了,最近有加我的朋友问到app微信支付,所以我把app微信支付的demo ...

  3. Redis和Memcached的一些区别

    我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memcached好呢,以下是它们两者之间一些简单的区别与比较: 1. Redis不仅支持简单的k/v类型的数据 ...

  4. oracle 添加登陆数据库触发器--记录IP 地址

    ----触发器--- ---创建中间插入的表 create table session_history tablespace bap_data as (select sid,username,prog ...

  5. Java面试题复习之Java基础

    1.面向对象的特征主要有哪些?   封装.继承.多态.抽象 2.final.finally.finalize的区别? final主要用于修饰类.方法.属性(变量)等. 通常被final修饰的类不能够被 ...

  6. lombok的使用和原理

    一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省 ...

  7. Objective-C @executable_path、@loader_path和@rpath

    工程配置中,有三个路径和库的加载息息相关: 1.@executable_path 可执行文件的路径,例如/Applications/WeChat.app/Contents/MacOS. 2.@load ...

  8. nginx-haproxy-lvs功能和性能对比 nginx - max-fail + 调度算法

    优点(性能和功能两方面分析) 缺点 lvs 工作在4层,可以对http,MySQL等服务负载均衡.负责流量的分发,对io,cpu,mem的消耗少 功能比较少,没有正则匹配的功能 nginx 工作在7层 ...

  9. 滚动歌词制作 之 ncm格式转mp3

    导读 BesLyric 可以将 ncm格式转MP3 了! 前几天有网友到我的博客下评论说现在会员才能下载下来的音乐发现后缀是 ncm, 没法使用 Beslyric 来制作歌词,昨天升级了一下软件,将 ...

  10. Rabbitmq-topic演示

    在direct演示里,我们的日志系统实现了可选择性的接收日志.但仍旧有一些限制:不能基于多种标准进路由.在一个完整的日志系统中,我们可能不仅要根据日志的严重级别来接收日志,可能需要基于日志的来源来进行 ...