自定义实现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. JavaScript控制输入框只能输入非负正整数

    1.问题背景 问题:一个输入框,输入的是月份,保证输入的内容只能是非负正整数 2.JavaScript代码 function checkMonth() { $("month").k ...

  2. Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html 一.AsyncTask的使用 AsyncTask是一种轻 ...

  3. Alice and Bob HDU - 4268

    Alice and Bob's game never ends. Today, they introduce a new game. In this game, both of them have N ...

  4. java SpringWeb 接收安卓android传来的图片集合及其他信息入库存储

    公司是做APP的,进公司一年了还是第一次做安卓的接口 安卓是使用OkGo.post("").addFileParams("key",File); 通过这种方式传 ...

  5. Windows Developer Day - MSIX and Advanced Installer

    前面一篇我们介绍了 Adaptive Cards 的基础知识,而在 Windows Developer Day 的 Modern Application Experience 环节,还有一个需要划重点 ...

  6. PowerShell 发布farm solution

    SharePoint PowerShell在SharePoint Product列表里边,然后以管理员权限启动. 1. 添加Solution 到 SharePoint Farm. Add-SPSolu ...

  7. asp.net跳出iframe结构转向登录

    在网页编程时,我们经常需要处理,当session过期时,我们要跳到登陆页面让用户登陆,由于我们可能用到IFrame框架,所以我们我登陆页面需要显示在整个页面,而不是一个IFrame中,大部分的网友是用 ...

  8. iframe结构的项目,登录页面嵌套

    参考:http://www.cnblogs.com/qixin622/p/6548076.html 在网页编程时,我们经常需要处理,当session过期时,我们要跳到登陆页面让用户登陆,由于我们可能用 ...

  9. struts_01

    1.   Struts2概述 1.1.  什么是struts2框架 1.1.1.   概念 Struts2 是一个非常优秀的MVC框架,基于Model2设计模型 关键词解释: l  框架: 框架是可以 ...

  10. 机器学习之类别不平衡问题 (2) —— ROC和PR曲线

    机器学习之类别不平衡问题 (1) -- 各种评估指标 机器学习之类别不平衡问题 (2) -- ROC和PR曲线 完整代码 ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题 ...