欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单实现ArrayList以及LinkedList

程序员文章站 2022-06-16 23:43:46
...

1.手工编写一个arrayList

public Class MyArrayList{
     //初始化容量
     private int initCapacity = 8; 
     private int oldCapacity = initCapacity;
     // 数组元素的个数  
     private int size=0;
     private Object[] list;
     public MyArrayList(){
           list = new Object[initCapacity];
    }
     public int size(){
           return size;
      }
     //扩容方法
     public int ensureCapacity(){
             oldCapacity = (size*3)/2+1;
             Object[] temp = new Object[oldCapacity]();
             for(int i=0;i<list.length;i++){
                    temp[i] = list[i];
              }
              list = temp;
          }
      //添加元素
      public void add(Object o){
              if(size>=oldCapacity){
                   ensureCapacity();
              }
              list[size]=o;
               size++;
      }
      //修改元素
      public void set(int index,int value){  
            if(index<0||index>=size){
                 throw new Exception("超出范围");
           }
           list[index] = value;
      }
      //获取元素
      public Object get(int index){
         if(index<0||index>=size){
                 throw new Exception("超出范围");
         }
         return list[index];
      }
   //清空整个集合
  public void clear(){
          size=0;
          list = new Object[initCapacity];
    }
 //删除指定位置的元素
   public void removeAt(int index){
          
        if(index<0||index>=size){
                 throw new Exception("超出范围");
         }
          for(int i = index-1;i<size-1;i++){
                list[i+1]=list[i];
           }

          size--;

     }
}

2.手工编写一个linkedList

public class MyLinkedList {
	private Node head;
	private int size = 0;

	public int size() {
		return size;
	}

	public void add(Object value) {
		Node tempNode = new Node();
		tempNode.setData(value);
		if (head == null) {
			head = tempNode;
		} else {
			Node currentNode = head;
			while (currentNode.getNext() != null) {
				currentNode = currentNode.getNext();
			}
			currentNode.setNext(tempNode);
		}
		size++;
	}

	public void set(int index, Object value) {
		Node currentNode = head;
		for (int i = 0; i < index; i++) {
			currentNode = currentNode.getNext();
		}
		currentNode.setData(value);
	}

	public Object get(int index) {
		Node currentNode = head;
		for (int i = 0; i < index; i++) {
			currentNode = currentNode.getNext();
		}
		return currentNode.getData();
	}

	public void clear() {
		size = 0;
		head = null;
	}

	public void removeAt(int index) {
		if (index == 0) {
			head = head.getNext();
		} else {
			Node currentNode = head;
			for (int i = 0; i < index - 1; i++) {
				currentNode = currentNode.getNext();
			}
			currentNode.setNext(currentNode.getNext().getNext());
		}
		size--;
	}

	private class Node {
		private Object data;
		private Node next;

		public Object getData() {
			return data;
		}

		public void setData(Object data) {
			this.data = data;
		}

		public Node getNext() {
			return next;
		}

		public void setNext(Node next) {
			this.next = next;
		}

	}
	public static void main(String[] args) {
		MyLinkedList list = new MyLinkedList();
		list.add(1);
		list.add(2);
		list.add(3);
		list.set(1, 4);
		for(int i=0;i<list.size();i++){
			
			System.out.println(list.get(i));
		}
		list.removeAt(1);

	
	}

}

总结:上面只是简单的使用数据结构的知识实现了java里面较为常用的list集合,很多细节并没有具体的去实现,另外LinkedList是由双向循环链表实现的,在这里只是简单的使用单链表实现的。透过结构看本质大概可以清楚的看出ArrayList和LinkedList的几点主要区别:

1.arrayList底层是由数组来实现的,而LinkedList是由双向链表来实现的,并且都是有序集合

2.在性能方面,arraylist遍历性能更高,而linkedlist由于每次遍历都要移动指针(注意:java里面并没有指针这个概念,这里的指针指的是对对象的引用)性能较低,在获取、修改等操作的性能LinkedList比arrayList更加的高效