ArrayList
2022-02-24 本文已影响0人
Alsan_L3
实现:
ArrayList内部实现是由一个数组实现的,我们增加、删除都是操作该数据,所以他继承了数组的一些优缺点。
优点:
- 查询速度快
缺点
- 增加到一定大小时,会触发数组的扩容,而且当前数组的默认长度是实际长度的1.5倍,存在额外的内存开销
- add和remove操作都是通过数组的复制来实现的,这两种操作太多,也会有一定的性能问题
- 线程不安全
实现类图:
微信截图_20220222113417如何实现一个简单的ArrayList:
- 自定义一个类:CustomArrayList
- 创建一个数组,定义数组默认大小和扩容策略
- 实现方法:add、get、remove、size、iterator等方法
- 这样一个简单的ArrayList就实现了
代码实现如下:
public class CustomArrayList<T> {
private Object[] elementArr;
private int size;
public CustomArrayList(int initialCapacity) {
if(initialCapacity < 0){
throw new IllegalArgumentException("初始大小不能小于0");
}
elementArr = new Object[initialCapacity];
}
public CustomArrayList() {
this(10);
}
public boolean add(T t){
if(size == elementArr.length){
Object[] temp = new Object[size*2 + 1];
System.arraycopy(elementArr, 0, temp, 0, elementArr.length);
elementArr = temp;
}
elementArr[size ++] = t;
return true;
}
public void remove(int index){
if(index < 0 || index >= size){
throw new ArrayIndexOutOfBoundsException("索引超出数组边界");
}
int m = size - index - 1;
if(m > 0){
System.arraycopy(elementArr, index + 1, elementArr, index, m);
}
elementArr[--size] = null;
}
public void remove(T t){
if(t != null){
for(int i = 0; i < size; i ++){
if(elementArr[i] == t){
remove(i);
}
}
}
}
public T get(int index){
if(index < 0 || index >= size){
throw new ArrayIndexOutOfBoundsException("索引超出数组边界");
}
return (T) elementArr[index];
}
public int size(){
return this.size;
}
public static void main(String[] args) {
CustomArrayList<Integer> s=new CustomArrayList();
s.add(1);
s.add(2);
s.add(3);
s.add(4);
System.out.println("集合长度:"+s.size());
s.remove(1);
for (int i = 0; i < s.size(); i++) {
System.out.println(s.get(i));
}
}
}