自定义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 ...
随机推荐
- web开发性能优化---分布式篇
1.分布式架构-独立站点开发 模块化结构化开发,实现多资源分站点,数据分库,为后期实现分布式部署做准备,主要分为以下几部分: web站点: 1.web前端站点 2.图片.文件资源站点 3.管理端站点4 ...
- 《你不知道的 JavaScript 上卷》 学习笔记
第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...
- each遍历的用法
- 第二篇:操纵MySQL数据库(2) - 基于ORM思想的SQLAlchemy库
前言 本文讲解在Python语言中使用SQLAlchemy库操纵MySQL数据库的方法. 由于具体内容涉及较多,本文仅以插入及展示数据为例,更多内容请查阅有关文档. ORM ORM也即对象 - 关系映 ...
- javascript学习记录-2-18
对象定义的几种方法: var person=new Object(); person.name="111"; person.age=22; 或 var person={ na ...
- 【洛谷2055】【CJOJ2487】【ZJOI2009】 假期的宿舍
题面 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不 ...
- mongo分布式集群搭建手记
一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明 在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PS ...
- 魔改版ss-panel v3前端配置文件
配置文件所在目录:网站根目录/config/.config.php <?php // ss-panel v3 配置 // // !!! 修改此key为随机字符串确保网站安全 !!! $Syste ...
- AWS 认证攻略(SA)
很高兴经过一个多月的努力顺利pass了自己的SA认证,同事说证都是虚的,不过考个证也算是对自己实力的认可吧,博主第一次写博文,先简单的写一些认证的攻略吧 1.博主11月正式入职云服务提供商,领导要求每 ...
- Liunx2:Liunx目录结构
Liunx目录图 进入根目录,使用ll命令看一下Liunx整个根目录图: 这里面所有的目录都是买完服务器之后最初始的目录,没有进过任何加工.Liunx以树的结构组织所有目录,用一张图表示一下Liunx ...