ArrayList源码

来源:互联网 发布:愚公移山源码 编辑:程序博客网 时间:2024/05/21 17:29
//这是接口类,myarrylist类实现职责个接口
public interface MyList<E>{
 
/**添加元素
 * @author l
 * @param e
 * @return
 */
 boolean add(E e);
 /**判断是否包含
  *
  * @author l
  * @param o
  * @return
  */
 boolean contains(Object o);
 
 /**移除元素
  *
  * @author l
  * @param o
  * @return
  */
 boolean remove(Object o);
 /** 判断表是否为空
  *
  * @author l
  * @return
  */
 boolean isEmpty();
 /**清楚表
  *
  * @author l
  * @return
  */
 boolean clear();
 /**
  * 表的大小
  * @author l
  * @return
  */
 int size();
 
 /**
  * @author l
  * @param t
  * @return
  */
 Object[] toArray(E[] t);
}















//arraylist类
//里面在接口的基础上还添加了几个方法添加了
//特别注意的是有一个判断数组大小是否足够的方法,不够的时候增加数组长度
//底层就是对一个数组的疯狂操作







package myCollection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
public class MyArrayList<E> implements MyList<E> {
 /**
  * jdk8
  * 给id版本唯一编号
  */
 //private static final long serialVersionUID = 8683452581122892189L;
 /**
  * 表的底层依赖,说白了就是数组,后面的方法就是对这个数组的各种操作
  */
 private transient Object[] dataElement;
 private int size;
 
 //规定大小的构造方法
 //给dataelement定大小
 public MyArrayList(int initialCapacity){
  if (initialCapacity<0) {
   throw new RuntimeException(initialCapacity+"表的大小不能为负数");
  }
  this.dataElement= new Object[initialCapacity];
  
 }
 
 /**
  * 默认表的大小是10
  */
 public MyArrayList(){
  this(10);
 }
 //检查是否越界
 public void rangeCheck(int index){
  if (index>size) {
   throw new RuntimeException(index+"越界");
  }
 }
 /**
  * 确保表有足够空间做添加操作
  * @param index
  */
 public void ensureCapacity(int minCapacity){
 
  int oldCapacity=dataElement.length;
  if (oldCapacity<minCapacity) {
   oldCapacity=oldCapacity*2;
   if (minCapacity>oldCapacity) {
    oldCapacity=minCapacity;
   }
   dataElement=Arrays.copyOf(dataElement, oldCapacity);
  }
  
 }
 
 
 public boolean add(E e) {
  ensureCapacity(size+1);
  dataElement[size++]=e;
  return true;
 }
 @Override
 public boolean contains(Object o) {
  // TODO Auto-generated method stub
  if (indexof(o)>=0) {
   return true;
  }
  return false;
 }
 @Override
 /**
  *
  */
 public boolean remove(Object o) {
  // TODO Auto-generated method stub
  for (int i = 0; i < size; i++) {
   if (dataElement[i].equals(o)) {
    remove(i);
    i--;
   }
  }
  return true;
 }
 public E remove(int index) {
  rangeCheck(index);
  Object oldValue=dataElement[index];
  for (int i = index; i < size-2; i++) {
   dataElement[index]=dataElement[index+1];
  }
  size=size-1;
  return (E) oldValue;
 }
 @Override
 public boolean isEmpty() {
  // TODO Auto-generated method stub
  return size==0;
 }
 //清空表
 @Override
 public boolean clear() {
  for (int i = 0; i < size; i++) {
   dataElement[i]=null;
  }
  return true;
 }
 @Override
 public int size() {
  return size;
 }
//调用的是Arrays数组的方法
 @Override
 public Object[] toArray(E[] t) {
  // TODO Auto-generated method stub
  return Arrays.copyOf(dataElement, size);
 }
/**
 * 获取指定位置的元素
 *@author l
 * @param index
 * @return
 */
 public E get(int index){
  rangeCheck(index);
  return (E)dataElement[index];
  
 }
 /**
  * @author l
  * @param index
  * @param data
  * @return
  */
 public boolean set(int index,E data){
  rangeCheck(index);
  dataElement[index]=data;
  return true;
 }
 /**在指定位置添加元素,后面的元素向后移
  * @author l
  * @param index
  * @param data
  * @return
  */
 public boolean add(int index,E data){
  rangeCheck(index);
  ensureCapacity(size+1);
  for (int i = size; i >index; i--) {
   dataElement[i]=dataElement[i-1];
  }
  dataElement[index]=data;
  size=size+1;
  return true;
 }
 /**
  * 查找元素编号,
  * 无返回-1
  * @param o
  * @return
  */
 public int indexof(Object o){
  for (int i = 0; i < dataElement.length; i++) {
   if (dataElement[i].equals(o)) {
    return i;
   }
  }
  return -1;
 }
}
原创粉丝点击