在java中的List接口下,我们常用的实现类分别是ArrayList和LinkedList,这两者虽然功能几乎一样,但是内部的实现原理却完全不一样
ArrayList 采用的是 线性结构
Linkedlist 采用的是链式结构
ArrayList 的实现方式(我们这里只是写它的原理代码,真正的ArrayList要比我们现在写的要复杂的多)
MyArrayList类
package arrayList;
import javax.sound.midi.VoiceStatus;
public class MyArrayList {
// 定义一个固定长度的数组
Object[] objs = new Object[4];
// 数组长度 默认为0
private int size = 0;
/**
* 返回数组长度
*/
public int size() {
return size;
}
/**
* 添加方法
*/
public void add(Object value) {
// 判断数组长度是否越界
if (size >= objs.length) {
// 对数组进行扩容
Object[] temp = new Object[objs.length * 2];
// 将原始数组进行复制
for (int i = 0; i < objs.length; i++) {
temp[i] = objs[i];
}
// 将扩容后的数组重新复制给objs
objs = temp;
}
objs[size] = value;
size++;
}
/**
* 删除方法
*
* @author PP_boy
* @param index
* @throws Exception
*
*/
public void removeAt(int index) throws Exception {
// 验证索引是否越界
if (index < 0 || index >= size) {
throw new Exception("数组下标越界");
}
// 从索引开始遍历之后的数组
for (int i = index + 1; i < objs.length; i++) {
// 依次向前挪一位
objs[i - 1] = objs[i];
}
size--;
}
/**
* 设置方法
*
* @throws Exception
*/
public void set(int index, Object value) throws Exception {
// 验证索引是否越界
if (index < 0 || index >= size) {
throw new Exception("数组下标越界");
}
objs[index] = value;
}
/**
* 获取方法
*
* @throws Exception
*/
public Object get(int index) throws Exception {
// 验证索引是否越界
if (index < 0 || index >= size) {
throw new Exception("数组下标越界");
}
return objs[index];
}
/**
* 清空数组
*
*/
public void clear() {
size = 0;
}
}
测试类
public class MainTest {
public static void main(String[] args) throws Exception {
MyArrayList list = new MyArrayList();
list.add(1);
list.add(3);
list.add(5);
list.add(7);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
list.removeAt(1);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
list.set(0, 8);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
list.clear();
System.out.println(list.size());
}
}
Linkedlist (这里用单链表来写,在实际中Linkedlist采用的是双向循环链表,但由于我们重在说原理,使用双向链表比较复杂不易理解)
结点类
package linkedList;
public class Node {
Object value;
Node next;
public Node(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
Mylinkedlist 类
package linkedList;
public class MyLinkedList {
//定义头结点
private Node head = null;
//链表长度
private int size = 0;
/**
* 返回链表长度
*/
public int size() {
return size;
}
/**
* 添加方法
*/
public void add(Object value) {
Node node = new Node(value);
if (head == null) {
head = node;
}
else {
//当前结点
Node temp = head;
while(temp.getNext()!=null) {
temp = temp.getNext();
}
temp.setNext(node);
}
size++;
}
/**
* 删除方法
*/
public void removeAt(int index) {
if (index==0) {
//将头结点指向下一节点
head = head.getNext();
}
else {
//找到索引结点的前一个结点
Node temp = head;
for (int i = 0; i < index-1; i++) {
temp = temp.getNext();
}
//将索引的前一个结点指向索引结点的后一个结点
temp.setNext(temp.getNext().getNext());
}
size--;
}
/**
* 修改
*/
public void set(int index,Object value) {
Node temp = head;
for (int i = 0; i < index; i++) {
temp = temp.getNext();
}
temp.setValue(value);
}
/**
* 查询
*/
public Object get(int index) {
Node temp = head;
for (int i = 0; i < index; i++) {
temp = temp.getNext();
}
return temp.getValue();
}
/**
* 清空数据
*/
public void clear() {
size = 0;
}
}
测试类
package linkedList;
import arrayList.MyArrayList;
public class MainTest {
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.add(1);
list.add(3);
list.add(5);
list.add(7);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
list.removeAt(1);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
list.set(0, 8);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
list.clear();
System.out.println(list.size());
}
}