自定义ArrayList
自定义实现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的更多相关文章
- ArrayList 源码分析和自定义ArrayList实现
概述 ArrayList 是基于数组实现的,是一个能自动扩展的动态数组. ArrayList 是线程不安全的,多线程情况下添加元素会出现数组越界的情况,而且数组赋值操作不是原子操作,会导致多线程情况下 ...
- 自定义Java集合
一.泛型 1.在JDK1.4以前,所有的集合元素全都按照Object来存储,拿出来还要进行强制转型.由于这样的做法有太多的缺点,容易出现ClassCaseException,不安全,让人不省心,于是乎 ...
- Java集合篇一:ArrayList
package com.test.collection; /** * 自定义ArrayList容器 * * 1.实现原理:底层封装数组 * * 2.查询 * LinkList 相较 ArrayList ...
- 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)
一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...
- JDK1.8 ArrayList 源码解析
源码的解读逻辑按照程序运行的轨迹展开 Arraylist的继承&实现关系 打开ArrayList源码,会看到有如下的属性定义, ArrayList中定义的属性 /** * Default in ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 【原创】这道Java基础题真的有坑!我也没想到还有续集。
前情回顾 自从我上次发了<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章后.我通过这样的一个行文结构: 解析了小马哥出的这道题,让大家明白了这题的坑在哪里,这题背后隐藏 ...
- Java 代码实现链表
Linked List 用多少就申请多少内存. 链表是一种链式存储的线性表,所有元素的内存地址不一定连续的. 接口设计 代码实现 MyList.java(接口) package com.cyb; pu ...
- java 16 -11 ArrayList存储自定义对象并增强for遍历
需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for C:增强for LinkedList,Vector,Colleciton,List ...
随机推荐
- INS-30002 口令和确认口令不同
1.错误描述 2.错误原因 由截图上的提示,可以看出是管理口令和确认口令不一致 3.解决办法 重新输入密码
- OpenStack_I版 2.keystone部署
生成keystone默认证书,指定用户 修改keystone主配置文件 第625行,修改数据库连接方式 修改完成同步数据库 同步完成可以查看数据库是否有表生成 为了以后调试keystone方便,现 ...
- Keras官方中文文档:keras后端Backend
所属分类:Keras Keras后端 什么是"后端" Keras是一个模型级的库,提供了快速构建深度学习网络的模块.Keras并不处理如张量乘法.卷积等底层操作.这些操作依赖于某种 ...
- 【BZOJ2555】SubString(后缀自动机,Link-Cut Tree)
[BZOJ2555]SubString(后缀自动机,Link-Cut Tree) 题面 BZOJ 题解 这题看起来不难 每次要求的就是\(right/endpos\)集合的大小 所以搞一个\(LCT\ ...
- 【SPOJ】Longest Common Substring II (后缀自动机)
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...
- 【BZOJ2330】【SDOI2012】糖果(差分约束,SPFA)
[BZOJ2330][SDOI2012]糖果 题面 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要 ...
- Lucene就是这么简单
什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的架构,提供了完整的创建索引 ...
- windows xp/7/8/8.1/10安全模式详解和系统修复讲解
如果你的电脑因为各种原因(强关电脑等原因导致的电脑蓝屏,或者引导文件受损等)开不了机,进不了电脑桌面,那么就可以看看我这篇文章了. 先贴上百度百科,说得挺好的.最下面有我贴的图片操作过程详解. 百度百 ...
- Firefox取消“订阅实时书签”功能
如果你勾选了Firefox“总是用实时书签订阅收取”, 一打开RSS页面就直接弹出添订阅实时书签对话,而当你想在火狐中直接查看RSS页面时,发现不知如何取消“订阅实时书签”功能了.就怨这个关闭功能藏的 ...
- js 显示数字不断增加
一个小小的函数,很容易看懂,就不过多解释了,只为下次用时直接用就ok了... function countUp(count) { var div_by = 100, speed = Math.roun ...