List 底层简单实现

    xiaoxiao2022-07-14  141

    List 容器实际上就是用数组模拟的容器,使用泛型可以规范数组管理。

    首先开辟一个Object类型的数组,默认长度为10,或者自己定义长度。

    add()方法:向数组的数据末端添加新数据,如果数组长度不够会使用扩容方法(原长度+原长度/2)。

    get()方法:根据索引值获取数组内容。

    set()方法:根据索引值和要设置的数据覆盖原来的数据。

    remove()方法:实际上就是数组的拷贝,把后一个数据覆盖到当前的位置,把最后一个赋为空。

    trimToSize()方法:声明一个与当前数组实际长度相等的新数组,把原来数组里的值拷贝到新数组里,在改变一下引用。

    isEmpty()方法:判断数组的实际大小是否为0,

    clean()方法:把数据变为空,大小变为0。

    package Conllection; /** * List 底层简单实现 * * @author zhaoy * */ public class List<T> { private Object[] elementData; private int size = 0; private static final int DEFAULT_CAPACITY = 10; public List() { elementData = new Object[DEFAULT_CAPACITY]; } public List(int capacity) { elementData = new Object[capacity]; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < size; i++) { sb.append(elementData[i] + ","); } sb.setCharAt(sb.length() - 1, ']'); return sb.toString(); } /** * 添加方法+ 数组扩容 * * @param obj */ public void add(T obj) { if (size == elementData.length) { Object[] newArray = new Object[size + (size >> 1)]; for (int i = 0; i < elementData.length; i++) { newArray[i] = elementData[i]; } elementData = newArray; } elementData[size++] = obj; } /** * 获取内容方法 * * @param index * @return */ public Object get(int index) { checkRange(index); return elementData[index]; } /** * 设置方法 * * @param index * @param obj */ public void set(int index, T obj) { checkRange(index); elementData[index] = obj; } /** * 根据索引位置移除数据 * * @param index */ public void remove(int index) { checkRange(index); for (int i = index + 1; i < size; i++) { elementData[i - 1] = elementData[i]; } elementData[size] = null; size--; } /** * 把数组容量变成实际大小的容量 */ public void trimToSize() { int length = elementData.length; Object[] newArray = new Object[length]; for (int i = 0; i < size; i++) { newArray[i] = elementData[i]; } size = length; elementData = newArray; } /** * 判断是否为空 * * @return */ public boolean isEmpty() { if (size == 0) { return true; } return false; } /** * 判断数组索引是否正确 * * @param index */ public void checkRange(int index) { if (index < 0 || index >= size) { throw new RuntimeException("索引不合法:" + index); } } /** * 清空数组 */ public void clean() { for (int i = 0; i < size; i++) { elementData[i] = null; } size = 0; } /** * 找出内容一样的第一个索引值 * @param obj * @return */ public int indexOf(T obj) { if(obj!=null) { for(int i=0;i<size;i++) { if(elementData[i].equals(obj)) { return i; } } } return -1; } /** * 找出内容一样的最后一个索引值 * @param obj * @return */ public int lastIndexOf(T obj) { if(obj!=null) { for(int i=size-1;i>=0;i--) { if(elementData[i].equals(obj)) { return i; } } } return -1; } /** * 主方法 * * @param args */ public static void main(String[] args) { List<String> list = new List<>(); list.add("1"); list.add("2"); list.add("2"); list.add("4"); System.out.println(list); Object resule = list.get(2); System.out.println(resule); int index = list.indexOf("2"); System.out.println("index:"+index); int lastIndex = list.lastIndexOf("2"); System.out.println("lastIndex:"+lastIndex); } }

     

    最新回复(0)