自定义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 ...
随机推荐
- Linux 显示权限
Linux 显示权限 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -lh 总用量 56K -rw-r--r-- 1 youhaidong youhai ...
- nest exception is java.sql.SQLException:ORA-01476:除数为0
1.错误描述 nest exception is java.sql.SQLException:ORA-01476:除数为0 2.错误原因 3.解决办法
- 使用Python收集获取Linux系统主机信息
爬虫代理IP由芝麻HTTP服务供应商提供 使用 python 代码收集主机的系统信息,主要:主机名称.IP.系统版本.服务器厂商.型号.序列号.CPU信息.内存等系统信息. #!/usr/bin/en ...
- UniCode 下 CString 转 char* 的方法(转)
转自:http://blog.csdn.net/neverup_/article/details/5664733 今天进行文件操作时,将CString的GetBuffer()后直接倒到char数组后写 ...
- Java8 日期/时间(Date Time)使用简介
特别说明: LocalDateTime 为日期时间的计算提供了很大的方便, 在构造对象/运算/toString等方便都非常便利. 3个常用的类: java.time.LocalDateTime; ja ...
- 【洛谷T7153】(考试) 中位数
题目描述 给定 n 个数 a1, a2, ..., an,求这 n 个数两两的差值(共 n(n−1) 2 个)的中位数. 输入格式: 第一行一个正整数 n,表示数的个数. 接下来一行 n 个正整数,分 ...
- Bzoj4555: [Tjoi2016&Heoi2016]求和
题面 Bzoj Sol 推柿子 因为当\(j>i\)时\(S(i, j)=0\),所以有 \[\sum_{i=0}^{n}\sum_{j=0}^{n}S(i, j)2^j(j!)\] 枚举\(j ...
- zjoi网络
map加LCT水一下就过了 # include <stdio.h> # include <stdlib.h> # include <iostream> # incl ...
- 关于hibernate中hql语句 case when的写法
java hql case when的用法 if(null == sorter){ hql.append(" order by m.mDate desc,case when m.mealTi ...
- 关于LINUX里面查找,替换,编辑的一些用法
1.GREP查找(如果只是查找文件当中是否有该内容的话) grep -rn "hello,world!" * "hello,world!":表示要查找的字段 * ...