自定义实现ArrayList很简单,只需要明白下面几点

  1、ArrayList 底层是由数组组成的

  2、数组有容量限制,但是ArrayList并没有(实际上也有,Integer.MAX_VALUE)。在增加数据的时候做好扩容

  3、移除数组中的某一个数据要怎么做

下面是我自定义的ArrayList。基本的增删改查是有了。

public class MyArrayList<E>
{
private int capacity = 10; //arrayList 容量 private Object[] element = new Object[capacity]; //构成arrayList的底层数组 int size; //arrayList中存在的元素 size <= capacity int next; //数组索引 永远指向下一个添加的数据位置
/**
* <默认构造函数>
*/
public MyArrayList() { } /**
* <默认构造函数>
*/
public MyArrayList(int capacity) {
this.capacity = capacity;
} /**
* 添加数据
* <功能详细描述>
* @param e
* @see [类、类#方法、类#成员]
*/
public void add(E e) {
if(e == null) {
throw new NullPointerException("cannot add null object");
}
checkSize(); //检查数组容量
if(size <= capacity/2) { //如果size <= capacity/2 不进行扩容直接添加
element[size] = e;
size ++;
}else { //扩容
growCapacity();
element[size] = e;
size ++;
}
} /**
* 获取inde指向的数据
* <功能详细描述>
* @param index
* @return
* @see [类、类#方法、类#成员]
*/
public E get(int index) {
if(index > size-1) {
throw new ArrayIndexOutOfBoundsException("index out of size, " + index);
}
return (E)element[index];
} /**
* 移除index指向的数据
* <功能详细描述>
* @param index
* @see [类、类#方法、类#成员]
*/
public E remove(int index) {
if(index > size-1) {
throw new ArrayIndexOutOfBoundsException("index out of size, " + index + "size :" + size);
}
Object result = element[index]; System.arraycopy(element, index+1, element, index, size-index-1);
element[--size] = null; return (E)result;
} /**
* 修改数据
* <功能详细描述>
* @param index
* @param e
* @see [类、类#方法、类#成员]
*/
public void change(int index, E e) {
if(index > size-1) {
throw new ArrayIndexOutOfBoundsException("index out of size, " + index);
}
if(e == null) {
throw new NullPointerException("cannot add null object");
}
element[index] = e;
} /**
* {@inheritDoc}
*/
public String toString() {
StringBuilder sbBuilder = new StringBuilder();
for(int i=0;i<size;i++) {
sbBuilder.append("("+i+","+element[i]+"),");
}
String result = sbBuilder.toString();
result = result.substring(0,result.length()-1);
return result;
} /**
* 检查容量
* <功能详细描述>
* @return
* @see [类、类#方法、类#成员]
*/
private void checkSize() {
if(size > capacity || size > Integer.MAX_VALUE) {
throw new ArrayIndexOutOfBoundsException("size too large, " + size);
}
} /**
* 将数组进行扩容
* <功能详细描述>
* @see [类、类#方法、类#成员]
*/
private void growCapacity() {
if(capacity > Integer.MAX_VALUE) {
throw new ArrayIndexOutOfBoundsException("capacity too large, " + capacity);
}
int newCapacity = capacity + capacity >> 1; //新的容量 = 老容量 + 老容量的1/2
element = Arrays.copyOf(element, newCapacity);
capacity = newCapacity;
} }

写一个main函数测试一下

public class TestList
{ public static void main(String[] args)
{
MyArrayList<String> list = new MyArrayList<String>();
for(int i=0;i<10;i++) {
list.add(i+"");
}
System.out.println(list.toString()); String s = list.get(6);
System.out.println(s); System.out.println(list.remove(5)); System.out.println(list.toString()); }
}

下面是运行结果

自定义ArrayList的更多相关文章

  1. ArrayList 源码分析和自定义ArrayList实现

    概述 ArrayList 是基于数组实现的,是一个能自动扩展的动态数组. ArrayList 是线程不安全的,多线程情况下添加元素会出现数组越界的情况,而且数组赋值操作不是原子操作,会导致多线程情况下 ...

  2. 自定义Java集合

    一.泛型 1.在JDK1.4以前,所有的集合元素全都按照Object来存储,拿出来还要进行强制转型.由于这样的做法有太多的缺点,容易出现ClassCaseException,不安全,让人不省心,于是乎 ...

  3. Java集合篇一:ArrayList

    package com.test.collection; /** * 自定义ArrayList容器 * * 1.实现原理:底层封装数组 * * 2.查询 * LinkList 相较 ArrayList ...

  4. 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)

    一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...

  5. JDK1.8 ArrayList 源码解析

    源码的解读逻辑按照程序运行的轨迹展开 Arraylist的继承&实现关系 打开ArrayList源码,会看到有如下的属性定义, ArrayList中定义的属性 /** * Default in ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. 【原创】这道Java基础题真的有坑!我也没想到还有续集。

    前情回顾 自从我上次发了<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章后.我通过这样的一个行文结构: 解析了小马哥出的这道题,让大家明白了这题的坑在哪里,这题背后隐藏 ...

  8. Java 代码实现链表

    Linked List 用多少就申请多少内存. 链表是一种链式存储的线性表,所有元素的内存地址不一定连续的. 接口设计 代码实现 MyList.java(接口) package com.cyb; pu ...

  9. java 16 -11 ArrayList存储自定义对象并增强for遍历

    需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for     C:增强for LinkedList,Vector,Colleciton,List ...

随机推荐

  1. Spring Security验证流程剖析及自定义验证方法

    Spring Security的本质 Spring Security本质上是一连串的Filter, 然后又以一个独立的Filter的形式插入到Filter Chain里,其名为FilterChainP ...

  2. Asp.Net Core轻松入门之WebHost的配置

    在本篇文章中,我来讲一讲如何利用WebHost来加载配置文件和设置启动的Url 在前面的文章中讲过,ASP.Net Core应用程序会自动加载appsettings.json中的配置文件,那么如果配置 ...

  3. C语言 字符串前加L的意义 如:L“A”

    转自:http://c.biancheng.net/cpp/html/1069.html Unicode或者宽字符都没有改变char数据型态在C中的含义.char继续表示1个字节的储存空间,sizeo ...

  4. ASP.NET CSS 小结

    1.ASP.NET 引用CSS 1.Site.master里面设置webopt <webopt:bundlereferencerunat="server"path=" ...

  5. 创建元素节点createElement

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. 【BZOJ1585】【Luogu2944】地震损失2(网络流)

    [BZOJ1585][Luogu2944]地震损失2(网络流) 题面 题目描述 Wisconsin has had an earthquake that has struck Farmer John' ...

  7. 【BZOJ1257】余数之和(数论分块,暴力)

    [BZOJ1257]余数之和(数论分块,暴力) 题解 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的 ...

  8. sql server 2008 sql prompt 自动提示

    sql server 2008 在编写SQL脚本的时候,总是希望能提示一些信息,或者自动提示需要查询的表的名字,或者表的基本信息,sql server默认会有一些提示的,如果没有可以设置工具--> ...

  9. office 2013补丁包更新

    总是有客户发现使用office 2013 下的插件有问题,这个问题出现在低版本上,所以要给office 2013打上补丁,打上后,运行插件ok,出现的bug解决掉了.那么给office打补丁包就成了解 ...

  10. Android JNI开发之C/C++层调用JAVA

    一.从C/C++层调用JAVA层代码(无参数调用) //在c代码里面调用java代码里面的方法 // java 反射 // 1 . 找到java代码的 class文件 // jclass (*Find ...