手写简单的ArrayList要求1: 实现扩容
要求2: 实现增删改查等功能
因为ArrayList底层是数组结构 具有下标 查询更快 直接上代码!!!
代码片段
package com.edit.util.list;
import java.util.Arrays;
import java.util.StringJoiner;
/**
* @author:Li
* @time: 2019/3/6 10:02
* @version: 1.0.0
*/
public class ArrList {/**
* 数据数组
*/
private Object[] data;
/**
* 最小空间
*/
private final int MIN_INDEX = 16;
/**
* 最大空间
*/
private final int MAX_INDEX = 0x7FFFFFFF;
/**
* 当前容量
*/
private int capacity;
/**
* 当前下标
*/
private int currentIndex = 0;
/**
* 构造方法
*
* @param capacity 给定一个空间
*/
public ArrList(int capacity) {
this.capacity = capacity;
data = https://www.it610.com/article/new Object[capacity];
}/**
* 无参构造默认空间16
*/
public ArrList() {
this(16);
}/**
* 扩容
*/
private void dilatation() {
int newCapacity = capacity;
// 是否需要扩容
if (currentIndex == capacity) {
// 扩容1.5倍
newCapacity = capacity + (capacity>> 1);
// 最小空间处理 以及 最大空间处理
if (newCapacity > MAX_INDEX) {
newCapacity = MAX_INDEX;
} else if (newCapacity < MIN_INDEX) {
newCapacity = MIN_INDEX;
}
// 扩容数据
Object[] newData = https://www.it610.com/article/new Object[newCapacity];
// 拷贝数组
System.arraycopy(data, 0, newData, 0, currentIndex);
data = newData;
capacity = newCapacity;
}
}/**
* 添加
* @param e 元素
*/
public void add(E e) {
dilatation();
data[currentIndex] = e;
currentIndex++;
}/**
* 指定位置添加
* @param index 下标
* @param e 元素
*/
public void add(int index, E e) {
dilatation();
System.arraycopy(data, index, data, index + 1, currentIndex - index);
data[index] = e;
currentIndex++;
}/**
* 获取
* @param index 下标
* @return
*/
public E get(int index) {
if (index < currentIndex) {
return (E) data[index];
} else {
throw new IndexOutOfBoundsException("index: " + index + " size:" + currentIndex);
}
}/**
* 修改值
* @param index 下标
* @param e 新值
* @return
*/
public E set(int index, E e) {
if (index < currentIndex) {
data[index] = e;
return (E) data[index];
} else {
throw new IndexOutOfBoundsException("index: " + index + " size:" + currentIndex);
}
}/**
* 大小
* @return
*/
public int size() {
return currentIndex;
}/**
* 清空集合
*/
public void clear() {
data = https://www.it610.com/article/new Object[16];
currentIndex = 0;
capacity = 16;
}/**
* 通过下标删除元素
* @param index 下标
*/
public void remove(int index) {
if (index < currentIndex) {
System.arraycopy(data, index + 1, data, index, currentIndex - index);
currentIndex--;
} else {
throw new IndexOutOfBoundsException("index: " + index + " size:" + currentIndex);
}
}/**
* 删除元素
* @param e 元素
* @return 是否删除成功
*/
public boolean remove(E e) {
for (int i = 0;
i < currentIndex;
i++) {
if (data[i].equals(e)) {
remove(i);
return true;
}
}
return false;
}/**
* 集合是否为空
* @return
*/
public boolean isEmpty() {
return size() == 0;
}/**
* 是否包含某个元素
* @param e 元素
* @return
*/
public boolean contains(E e) {
return indexOf(e) != -1;
}/**
* 获得第一个匹配元素的下标
* @param e 元素
* @return 出现的下标
*/
public int indexOf(E e) {
for (int i = 0;
i < currentIndex;
i++) {
if (data[i].equals(e)) {
return i;
}
}
return -1;
}/**
* 获得最后一个匹配元素的下标
* @param e 元素
* @return 出现的下标
*/
public int lastIndexOf(E e) {
for (int i = currentIndex - 1;
i > -1;
i--) {
if (data[i].equals(e)) {
return i;
}
}
return -1;
}/**
* 将集合转为数组
* @return
*/
public Object[] toArray() {
return Arrays.copyOf(data, currentIndex);
}@Override
public String toString() {
final StringJoiner join = new StringJoiner(",", "[", "]");
for (int i = 0;
i < currentIndex;
i++) {
join.add(String.valueOf(data[i]));
}
return join.toString();
}
}
结束【手撕源码|Java: 手撕Arraylist (扩容)】这就是手撕简单的ArrayList感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出相互学习共同进步
推荐阅读
- java|Java教程(一文详解函数式编程)
- 程序员|全网已破千万点击,MyBatis源码(配置、映射文件SQL执行过程等等)
- java|Java教程(手撕MybatisPlus分页原理)
- spring|spring cloud alibaba 笔记 (三)nacos 通过Feign服务调用
- flowable|spring cloud alibaba gateway nacos 503错误代码
- zero|SpringCloud Alibaba&nacos&OpenFeign简介
- spring|【大型电商项目开发】分布式组件SpringCloud Alibaba简介Nacos&Feign-08
- 分布式|springcloud学习 feign与nacos的使用
- 算法|简单粗暴的多对象目标跟踪神器 – DeepSort