import java.util.Arrays;
/**自定义ArrayList
* 泛型用于约束集合中所存储的元素类型
* */
public class MyArrayList<E> {
/**集合内部用于存储元素的数组*/
private Object[] elementData;
/**统计有效元素个数*/
private int size;
/**默认数组*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**默认容量*/
private static final int DEFAULT_CAPACITY = 10;
/**无参构造*/
public MyArrayList(){
this.elementData = EMPTY_ELEMENTDATA;
}
/**带初始容量的构造器*/
public MyArrayList(int initialCapcity) {
if(initialCapcity<0) {
throw new IllegalArgumentException("容量大小错误");
}
this.elementData = new Object[initialCapcity];
}
/**
* 向集合末尾添加一个元素
*/
public void add(E e) {
//考虑需不需要扩容
ensureCapacityInternal();
//往数组中存储元素,同时计数加1
elementData[size++] = e;
}
/**获取集合中有效元素的个数*/
public int size() {
return size;
}
/**获取存储元素的内部数组*/
public Object[] elementData() {
return elementData;
}
/**判断集合是否为空*/
public boolean isEmpty() {
return size==0;
}
/**清空集合中元素*/
public void clear() {
for(int i=0;i<size;i++) {
elementData[i] = null;
}
size = 0;
}
/**向集合中指定下标位置插入元素
* [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
* index=3
* [aaa, bbb, ccc, mmm, aaa, bbb,ccc , null, null, null]
*
* */
public void add(int index,E e) {
//判断下标
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("插入元素下标越界");
}
//考虑是否需要扩容
ensureCapacityInternal();
System.arraycopy(elementData, index,
elementData, index+1, size-index);
//替换指定下标位置元素
elementData[index] = e;
size++;
}
/**
* 根据下标删除指定位置元素,
* 返回被删除的元素
*
* [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
* size=6
* index=2
* [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
* aaa, bbb,ccc
*/
public E remove(int index) {
//判断下标
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException("删除元素下标越界");
}
//获取需要被删除的元素
E oldValue = (E)elementData[index];
System.arraycopy(
elementData, index+1,
elementData, index, size-index-1);
size--;
return oldValue;
}
/**
* 获取指定元素的下标
* [aaa, null, ccc, aaa, bbb,ccc , null, null, null, null]
* size=6
*/
public int indexOf(E e) {
if(e==null) {
for(int i=0;i<size;i++) {
if(get(i)==null) {
return i;
}
}
}else {
for(int i=0;i<size;i++) {
if(e.equals(get(i))) {
return i;
}
}
}
return -1;
}
/**根据元素内容移除集合中元素*/
public boolean remove(E e) {
//根据元素内容获取他的下标
int index = indexOf(e);
//没有找到该元素内容
if(index<0)return false;
//根据下标去删除元素
remove(index);
return true;
}
/**获取指定下标位置的元素*/
public E get(int index) {
//判断下标
if(index<0 || index>=size) {
throw new IndexOutOfBoundsException("获取元素下标越界");
}
return (E)elementData[index];
}
/**
* 扩容的方法
* 1>第一次添加元素时,将数组长度改为10
* 2>后续数组中元素内容满了,扩容之前长度1.5倍
*/
private void ensureCapacityInternal() {
if(elementData.length==0) {//第1次添加元素
this.elementData = new Object[DEFAULT_CAPACITY];
}else if(elementData.length==size) {//数组满了
this.elementData = Arrays.copyOf(
elementData,elementData.length+(elementData.length>>1));
}
}
/**
* [aaa, bbb, ccc, aaa, bbb,ccc , null, null, null, null]
* size=6
*
* [aaa, bbb, ccc, aaa, bbb,ccc]
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
for(int index=0;index<size;index++) {
Object obj = elementData[index];
sb.append(obj+",");
}
sb.setCharAt(sb.length()-1,']');
return sb.toString();
}
public static void main(String[] args) {
//创建集合对象
MyArrayList<String> list = new MyArrayList<String>();
// System.out.println(list.size);
// System.out.println(Arrays.toString(list.elementData()));
list.add("aaa");
list.add(null);
list.add("ccc");
list.add("bbb");
list.add("ccc");
list.add(null);
//[aaa,bbb,ccc,null]
System.out.println(list);
list.remove(null);
list.remove("ccc");
System.out.println(list);
// System.out.println(list.indexOf(null));//1
// System.out.println(list.indexOf("ccc"));//2
// list.add(3,"mmm");
// list.add(7,"nnn");
// System.out.println(list);
//
// //[aaa,bbb,ccc,mmm,aaa,bbb,ccc,nnn]
// String e = list.remove(2);
// System.out.println("e:"+e);
// System.out.println(list);
}
}
【自定义ArrayList链表】
最新推荐文章于 2024-03-31 18:35:50 发布