线性表里面的a1可以是个数据,也可以是对象,那么下面的表就是线性表。
线性表可以是逻辑结构中的顺序结构线性表和物理结构中的顺序存储线性表和链式存储方式线性表。
链式存储的存储单元可以是连续的也可以是不连续的。
数组一般是顺序存储方式。
物理结构中的顺序存储线性表
优点:查询很快。查询是指在查在i位置是什么参数。直接位置锁定。
缺点:插入和删除效率慢。
物理结构中的链式存储方式线性表。
优点:删除和插入效率高。
缺点:查询效率低。为什么这种查询慢,因为要获取一个个对象的next参数,找到指向的地址。
单向循环链表
双向循环链表
自己创建arraylist实现增删查改
核心代码:
核心部分:对于引用参数的操作注意事项,对于物理结构的线性链表可以采用的copy方式
package com.example.jareld.testdatastructure.JareldDS; import java.util.Collection; /** * Created by Xiejianlin on 2018/6/24. 这是我自己定义的一个Arraylist数据结构数组 物理结构的顺序结构。 查询容易,增删难。 注意点1: 为什么操作的时候要进行 Object[] a = array; 原因:1 线程安全,多线程同时操作。 2 数组是引用类型,改变会改变整体。 一般全局变量操作时会先进行局部变量。 */ public class JareldArraylist<E> { //说明真实数据的数量。比如分配8个空间,使用了3个。 //那么size = 3 ; length = 8; int size; Object[] array; //这个得意思是 分配大小的时候不可能一个个去增加 //那么我必然会把某个固定空间大小作为单位量来做添加 //这里的意思就是每次增加的空间为12 private static final int MIN_CAPACITY_INCREMENT = 12; // 构造方法分三种 // 1.无参构造 public JareldArraylist(){ array = new Object[0]; } // 2.带容量构造 public JareldArraylist(int capacity){ array = new Object[capacity]; } // 3.带集合数组构造 public JareldArraylist(Collection<? extends E> collection){ Object[] a = collection.toArray(); //这里注意。这个集合中的?可能不是E,比如猫和动物的关系 // 所以不能直接把a赋值给array。 if(a.getClass()!=Object[].class){ Object[] newArr = new Object[a.length]; System.arraycopy(a,0,newArr,0,a.length); a = newArr; } array = a; size = a.length; } // 扩容函数 目的:又目前的容量获取到 private static int newCapacity(int currentCapacity){ //如果现在容量小于最小容量 那么 加12个 //如果现在容量大于最小容量 那么 加6个 int incremet = (currentCapacity<MIN_CAPACITY_INCREMENT/2)?MIN_CAPACITY_INCREMENT:currentCapacity>>1; return incremet + currentCapacity; } //增加: public boolean add(E object) { //重新定义一个a Object[] a = array; int s = size; if(s == a.length){ //这里就需要扩容了 //因为是顺序结构的 所以要重新申请一部分空间来作为这个数组的存放位置 Object[] newArr = new Object[s + newCapacity(s)]; System.arraycopy(a,0,newArr,0,s); array = a = newArr; } a[s] = object; size = s +1; return true; } //查询size大小 public int size(){ return size; } //判断是否为空 public boolean isEmpty(){ return size == 0; } //查找下标。 public int indexOf(Object object){ Object[] a = array; int s = size; if(object!=null){ //这里判断是因为object为null的情况下不能用equals的方法 for(int i = 0 ; i < s; i++){ if(object.equals(a[i])){ return i; } } }else{ for(int i = 0 ; i < s; i++){ if(a[i] == null){ return i; } } } return -1; } //查找last的坐标 public int lastIndexOf(Object object){ return -1; } //删除某个元素 public E remove(int index){ Object[] a = array; int s = size; if(index>s){ throw new IndexOutOfBoundsException(); } E e = (E) a[index]; //把数组整体迁移一下 System.arraycopy(a,index + 1 , a,index,--s - index); //把最后一个数据进行清空处理 a[s] =null; //这个s之前做了 --s的处理 size = s; return e; } //删除某个object public E remove(Object object){ return null; } //修改值 public E set(int index , Object object){ Object[] a = array; if(index>size){ throw new IndexOutOfBoundsException(); } //这里获取是要获取变之前的数据e E e = (E) a[index]; a[index] = object; return e; } //获取值 public E get(int index){ Object[] a = array; if(index > size){ throw new IndexOutOfBoundsException(); } E e = (E) a[index]; return e; } }