数据结构是计算机存储、组织数据的方式。
线性结构
线性表是具有n个相同类型元素的有限序列(n>=0)
常见的线性表有
数组
链表
栈
队列
哈希表
手动实现一个动态数组:GitHub链接:https://github.com/iosKey/ArrayList
核心代码:
1 //数组使用,可以添加任何类型 2 ArrayList<Object> list3 = new ArrayList<>(); 3 list3.add(10); 4 list3.add(new Person(12, "Jack"));
/** * 在index位置插入一个元素 * @param index * @param element * * **/ public void add(int index,E element) { //判断size是否合法 rangeCheckForAdd(index); //数组扩容 ensureCapacity(size + 1); //如果插入的下标是2 那么4 3 2就要往后移 // for (int i = size - 1; i >= index; i--) { // elements[i + 1] = elements[i]; // } //第二种写法 如果插入的下标是2 那么5 4 3往后移 for (int i = size; i > index; i--) { elements[i] = elements[i - 1]; } elements[index] = element; size++; }
/** * 查看元素的索引 * @param element * @return * * **/ public int indexOf(E element) { //既然数组能存null 就要进行非null判断 不然用null调用equals方法会报错 if(element == null) { //返回第一个null的下标 for (int i = 0; i < size; i++) { if (elements[i] == null) { return i; } } }else { for (int i = 0; i < size; i++) { //对象之间对比 Person类重写equals方法 //Integer默认重写了equals方法 是比较值的结果 if (element.equals(elements[i])) { return i; } } } return ELEMENT_NOT_FOUND; }
* 删除index位置的元素 * @param index * @return * * **/ public E remove(int index) { rangeCheck(index); E old = elements[index]; //例如要删除下标3 size是7 要移动的范围就是4-6 //范围是index后一位到size-1的数都往前移一格 //删除是小的下标先移动 for (int i = index + 1; i < size; i++) { //要插入的范围是3到5 elements[i - 1] = elements[i]; } size--; //清空最后一个 清空6 elements[size] = null; return old; }