|
@@ -0,0 +1,157 @@
|
|
|
+package com.four.day18.srcs;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+/*
|
|
|
+ MyArrayList
|
|
|
+ 存储任意类型,泛型指定类型。
|
|
|
+ */
|
|
|
+public class MyArrayList<E> {
|
|
|
+
|
|
|
+ //存储数组 长度 10.
|
|
|
+ private Object[] elementData = new Object[5]; ;
|
|
|
+ //元素的个数
|
|
|
+ private int size = 0;
|
|
|
+
|
|
|
+ //无参构造
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加方法
|
|
|
+ */
|
|
|
+ public boolean add(E e) {
|
|
|
+ //检查要不要扩容,如果需要,就进行扩容
|
|
|
+ //Ctrl + Alt + m 抽取方法的快捷键
|
|
|
+ grow();
|
|
|
+ //添加
|
|
|
+ elementData[size++] = e;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean add (int index, E e) {
|
|
|
+ //判断
|
|
|
+ if ( index < 0 || index > size - 1 ){
|
|
|
+ new ArrayIndexOutOfBoundsException("index out of bounds");
|
|
|
+ }
|
|
|
+ //检查要不要扩容,如果需要,就进行扩容
|
|
|
+ grow();
|
|
|
+ //操作
|
|
|
+ System.arraycopy(elementData, index, elementData, index + 1, size - index);
|
|
|
+
|
|
|
+ //元素赋值
|
|
|
+ elementData[index] = e;
|
|
|
+ //元素个数++
|
|
|
+ size++;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查要不要扩容,如果需要,就进行扩容
|
|
|
+ */
|
|
|
+ private void grow() {
|
|
|
+ if ( size >= elementData.length ){
|
|
|
+
|
|
|
+ //旧的数组
|
|
|
+ Object[] oldElement = elementData;
|
|
|
+ //修改数组长度
|
|
|
+ int newLength = elementData.length * 2;
|
|
|
+ //新数组
|
|
|
+ elementData = new Object[newLength];
|
|
|
+ //复制元素
|
|
|
+ // elementData 元数组 pos 位置 dest 新数组 length 长度。
|
|
|
+ System.arraycopy(oldElement,0,elementData,0,size);
|
|
|
+ //elementData = Arrays.copyOf(elementData, elementData.length + elementData.length/2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除 根据索引删除
|
|
|
+ * @param index
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean remove(int index ) {
|
|
|
+ //判断
|
|
|
+ if ( index < 0 || index > size - 1 ){
|
|
|
+ new ArrayIndexOutOfBoundsException("index out of bounds");
|
|
|
+ }
|
|
|
+
|
|
|
+ //删除移动
|
|
|
+ System.arraycopy(elementData,index+1,elementData,index,size - index-1);
|
|
|
+ //最后一位置为空null
|
|
|
+ elementData[size-1] = null;
|
|
|
+ //--
|
|
|
+ size--;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据 对象删除
|
|
|
+ * @param obj
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public int remove(Object obj ) {
|
|
|
+ //遍历数组 获取对应 obj的下标
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ if (Objects.equals(elementData[i],obj)){
|
|
|
+ //获取索引
|
|
|
+ remove(i);
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询返回索引
|
|
|
+ * @param obj
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public int indexOf( Object obj ){
|
|
|
+ //遍历数组 获取对应 obj的下标
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ if (Objects.equals(elementData[i],obj)){
|
|
|
+ //获取索引
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询返回索引
|
|
|
+ * @param obj
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public int lastIndexOf( Object obj ){
|
|
|
+ //遍历数组 获取对应 obj的下标
|
|
|
+ for (int i = size-1; i >= 0; i--) {
|
|
|
+ if (Objects.equals(elementData[i],obj)){
|
|
|
+ //获取索引
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //toString
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String toString() {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ sb.append("[");
|
|
|
+ //字符串拼接
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ if ( i == size - 1 ){
|
|
|
+ sb.append(elementData[i]+"]");
|
|
|
+ }else {
|
|
|
+ sb.append(elementData[i]+",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+}
|