自定义容器

基于数组的IntArrayList

自定义容器类,目标希望: 1. 可以存储任意多个数据 2. 可以存储任意数据类型 具体实现:

  • 定义一个容器类IntArray
  • 创建一个存放数据的数组,比如int[] arr = new int[10];
  • 定义一个add方法,用于添加数据
  • 创建容器对象,调用add方法,添加元素

代码实现

**IntArray.java

import java.util.Arrays;
public class IntArray {
	    private Object[] data;
		private int size;
		public IntArray() {
		      this(6);//默认创建6个长度的数组
		}
		public IntArray(int len) {
		      data = new Object[len];
		}
		/*
		add方法
		*/
		public void add(Object obj) {
		      if(size >= data.length) {//判断是否越界,如果越界则扩容
					      Object dataPlus = new Object[size+20];
						  System.arraycopy(data,0,dataPlus,0,size);
						  data = dataPlus;
			  }
			  data[size++] = obj;
		}
		//getLength 获取容器长度
		public int getLength() {
		      return size;
		}
		//找到一个元素第一次出现的位置
		public int getIndexByElement(Object obj) {
		      for(int i = 0; i < size; i++) {
					      if(data[i].equals(obj)) {
								      return i;
						  }
			  }
			  return -1;
		}
		//找到指定下标的元素
		public Object getElementByIndex(int index) {
		      if(index >=size) {
				        throw new ArrayIndexOutOfBoundsException();
			  }
			  return data[index];
		}
		//删除指定下标元素
		public void delElementByIndex(int index) {
		      if(index >= size) {
					  throw new ArrayIndexOutOfBoundsException();
			  }
			  System.arraycopy(data, index+1, data, index, size-index-1);
		      size--;
		}
		//删除指定元素
		public void delElementByElement(Object obj) {
		      int indexByElement = getIndexByElement(obj);
		      delElementByIndex(indexByElement);
	}
		//toString
		public String toString() {
		      Object arr = new Object[size];
			  Systen.arraycopy(data,0,arr,0;size);
			  return Arrays.toString(arr);
		}
}
基于变量的LinkedList

****LikedList.java

public class LikedList {
	  Node first;//头结点
	  Node last;//尾节点
	  int size;
	  public void add(Object obj) {
		  Node node = new Node(obj);
		  if(first == null) {
			  first = node;
			  last = node;
		  }/*else {
			Node temp = first;
			while(temp.next != null) {//判断寻找尾节点
				temp = temp.next;	//如果该节点不为空,则移到下一节点继续判断
			}
			temp.next = node;			//找到尾节点,直接指向下一节点node
		}*/
		  last.next = node;
		  last = node;
		  size++;
	}
	
	@Override
	public String toString() {
		  StringBuffer sb = new StringBuffer();
		  Node temp = first;
		  sb.append("[");
		  while(temp != null) {
			  if(temp.next != null) {
				  sb.append(temp.data).append(", ");
			  }else {
				  sb.append(temp.data);
			  }
			    temp = temp.next;
		   }
		  sb.append("]");
		  return sb.toString();
	}
	
	private class Node {
		  Object data;//用于存放数据
	      Node next;//用于存放下一个节点地址值
		  public Node(Object data) {
			    this.data = data;
		  }
		
	 }
}

数组与链表的优缺点相信也是有所了解的:

数组:适用于查询、排序等业务情况。连续存储 链表:适用于频繁增删改的业务情况。不连续存储