import java.util.ArrayList;
/**
* 自定义ArrayList,体会底层原理 泛型
* size
* isEmpty
* 数组扩容
* set get
* 数组边界检查
* remove
* 和ArrayList对比
*
* @author Chill Lyn
*
*/
public class MyArrayList<E> {
private Object[] elementData;
private int size;
private static int DEFAULT_CAPACITY = 10;
// 构造器,默认容量
public MyArrayList() {
super();
elementData = new Object[DEFAULT_CAPACITY];
}
// 构造器,自定义容量
public MyArrayList(int capacity) {
if (capacity < 0) {
throw new RuntimeException("容器容量不能为负数!");
} else if (capacity == 0) {
elementData = new Object[DEFAULT_CAPACITY];
} else {
elementData = new Object[capacity];
}
}
// 添加元素
public void add(E element) {
// 数组扩容when
if (size == elementData.length) {
// how
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
// 容器容量
public int size() {
return size;
}
// 容器是否为空判断
public boolean isEmpty() {
if (size == 0) {
return true;
} else {
return false;
}
}
// 数组边界检查
public void checkRange(int index) {
// 索引合法判断[0,size)
if (index < 0 || index >= size) {
throw new RuntimeException(index + " 非法索引!");
}
}
// get
public E get(int index) {
checkRange(index);
return (E) elementData[index];
}
// set
public void set(E element, int index) {
checkRange(index);
elementData[index] = element;
}
// 根据指定索引移除元素
public void remove(int index) {
int numberMoved = elementData.length - index - 1;
if (numberMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numberMoved);
}
elementData[--size] = null;
}
// 根据元素内容移除元素
public void remove(E element) {
for (int i = 0; i < size; i++) {
if (element.equals(get(i))) {
remove(i);
}
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
// [a,b,c]
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i] + ",");
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
// test
public static void main(String[] args) {
MyArrayList a1 = new MyArrayList(10);
for (int i = 1; i < 40; i++) {
a1.add(i);
}
a1.set("abc", 3);
System.out.println(a1);
a1.remove(4);
a1.remove("abc");
System.out.println(a1);
System.out.println(a1.size);
System.out.println(a1.isEmpty());
System.out.println(a1.get(3));
// Arraylist对比
ArrayList a2 = new ArrayList(10);
for (int i = 1; i < 40; i++) {
a2.add(i);
}
a2.set(3, "abc");
System.out.println(a2);
a2.remove(4);
a2.remove("abc");
System.out.println(a2);
// System.out.println(a2.size); ArrayList中size是不可见的
System.out.println(a2.isEmpty());
System.out.println(a2.get(3));
}
}
Java_简单自定义ArrayList(旨在理解底层原理)
最新推荐文章于 2022-03-26 15:23:02 发布
本文主要探讨了Java中自定义ArrayList的实现,旨在深入理解其内部工作机制。通过创建一个简单的ArrayList类,详细解析了如何进行元素添加、删除、查找等操作,并分析了容量自动扩容的策略,帮助读者掌握ArrayList的数据结构和性能优化关键点。
摘要由CSDN通过智能技术生成