java数据结构之ArrayList 和 LinkedList

在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());
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值