手写基本容器——ArrayList(一)

思路

ArrayList的地层是用数组来进行搭建的,所以我们可以先用数组来搭建底层,
我们需要一个变量来计算数组的大小
然后在一个一个的往里面添加自己需要的方法

1、先写一个基与数组的对象,可以存储我们的数据到里面

//为了定义默认的数组大小
private static final int DEFAULT_SIZE=10;
	//一种是有参构造器,另一种是无参构造器,在调用的时候会自动的创建Oject的数组(暂时定义Object的)
		public myConlection01() {
		  element = new Object[DEFAULT_SIZE];
	  }
	  
	 	public myConlection01 (int length_array) {
		  element = new Object[length_array];
	}

2、增加一个可以可以添加元素的函数

//添加一个记录数组大小的元素
private int size;
public void add(Object str) {
		  element[size++] = str;
	  }

3、然后容器建成后需要打印数组,就需要重写toString的方法,这里我们调用其它的对象来代替

@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(element[i]+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
		
	}

4、我们可以写成一个最基本的和原始的ArrayList容器

public class myConlection01 {
	private Object[] element;
	  private static final int DEFAULT_SIZE=10;
	  private int size;

	  
	  //添加元素
	  public void add(Object str) {
		  element[size++] = str;
	  }
	  
	  
	  public void setChart(int index, Object ob) {
		element[index] = ob;
	}
	  
	  //打印字符串
	  @Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(element[i]+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
		
	}
	  
	  
	  public myConlection01() {
		  element = new Object[DEFAULT_SIZE];
	  }
	  
	  
	  public myConlection01 (int length_array) {
		  element = new Object[length_array];
	  }
	}
	  

5、增加了泛型

public class myConlection02 <E> {
	private Object[] element;
	  private static final int DEFAULT_SIZE=10;
	  private int size;

	  
	  
	  public void add(E str) {
		  element[size++] = str;
	  }
	  
	  
	  public void printLength() {
		  System.out.println(element.length);
	  }
	  
	  
	  public void setChart(int index, E ob) {
		element[index] = ob;
	}
	  
	  @Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(element[i]+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
		
	}
	  
	  
	  public myConlection02() {
		  element = new Object[DEFAULT_SIZE];
	  }
	  
	  
	  public myConlection02 (int length_array) {
		  element = new Object[length_array];
	  }

}

6、增加自动扩容,当数组满的时候,我们可以根据一定的算法来进扩容

一般是扩容为原来的1.5倍,(size+(size>>1))

public class myConlection03<E> {
	Object[] element;
	  private static final int DEFAULT_SIZE=10;
	  public int size;

	  
	  
	  public myConlection03() {
		  element = new Object[DEFAULT_SIZE];
	  }
	  
	  
	  public myConlection03 (int length_array) {
		  element = new Object[length_array];
	  }
	  
	  public void add(E str) {	
		  if (size == element.length) {
			Object[] newelemrnt = new Object[size+(size>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
		}
		  element[size++]=str;
	  }
	  
	  
	  public void printLength() {
		  System.out.println(element.length);
	  }
	  
	  
	  public void printSize() {
		  System.out.println(size);
	  }
	  
	  
	  @Override
	public String toString() {System.out.print("[");		  
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(element[i]+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
		
	}}

7、增加一些索引(index)的操作,但同时还要去检查索引是否越界

public class myConlection04 <E>{
	  Object[] element;
	  private static final int DEFAULT_SIZE=10;
	  public int size;

	  
	  
	  public myConlection04() {
		  element = new Object[DEFAULT_SIZE];
	  }
	  
	  
	  public myConlection04 (int length_array) {
		  if(length_array<0) {
			  throw new RuntimeException("length_array不能为负数;length_array:"+length_array);
		  }else if (length_array == 0) {
			  element = new Object[DEFAULT_SIZE];
		  }else if (length_array>0) {
			  element = new Object[length_array];
		  }
	  }
	  
	  
	  public void add(E str) {	
		
		  if (size == element.length) {
			Object[] newelemrnt = new Object[size+(size>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
		}
		  element[size++]=str;
	  }
	  
	  public void add(E str,int index) {	
		  if(index>=element.length) {
			  throw new RuntimeException("引索超出范围:index"+index);
		  }
		  if (size == element.length||index+1 >= element.length) {
			Object[] newelemrnt = new Object[element.length+(element.length>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
		}
		  
		  try {
			  element[size++] = element[size-1];
			  System.arraycopy(element, index, element, index+1, size-index); 
				 
		} catch (Exception e) {
			Object[] newelemrnt = new Object[element.length+(element.length>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
			element[size++] = element[size-1];
			System.arraycopy(element, index, element, index+1, element.length-index);
		}finally {
			 
		}
		  
		 	element[index]=str;
	  }
	  
	  
	  public void printLength() {
		  System.out.println(element.length);
	  }
	  
	  
	  public void printSize() {
		  System.out.println(size);
	  }
	  
	  
	  @Override
	public String toString() {		  
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(element[i]+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
//		
	}}

8、增加删除的方法

public class myConlecction05<E> {
	Object[] element;
	  private static final int DEFAULT_SIZE=10;
	  public int size;

	  /**
	   * 默认为10的大小
	   */
	  public myConlecction05() {
		  element = new Object[DEFAULT_SIZE];
	  }
	  
	  
	  /**
	   *输入容器的大小
	   * @param length_array
	   */
	  public myConlecction05 (int length_array) {
		  if(length_array<0) {
			  throw new RuntimeException("length_array不能为负数;length_array:"+length_array);
		  }else if (length_array == 0) {
			  element = new Object[DEFAULT_SIZE];
		  }else if (length_array>0) {
			  element = new Object[length_array];
		  }
	  }
	  
	  
	  /**
	   * 添加一个内容,在底部
	   * @param str
	   */
	  public void add(E str) {	
		
		  if (size == element.length) {
			Object[] newelemrnt = new Object[size+(size>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
		}
		  element[size++]=str;
	  }
	  
	  
	  
	  /**
	   * 提取某个未知的参数
	   * @param index
	   * @return
	   */
	  public Object getElement(int index) {
		  if (index>size||index<0) {
			  throw new RuntimeException("超出范围:"+size+"index"+index);
		}
		  return element[index]; 
	  }
	  
	  
	  
	  /**
	   * 去除某个位置的参数
	   * @param index
	   */
	  public void remove(int index){
		  System.arraycopy(element, index+1, element, index, size-index);	  
	  }
	  
	  
	  /**
	   * 判断是否为空容器
	   * @return
	   */
	  public Boolean isEmpty(){
		  return size == 0;
	  }
	  
	  
	  /**
	   * 根据位置去增加内容
	   * @param str
	   * @param index
	   */
	  public void add(E str,int index) {	
		  if(index>=element.length) {
			  throw new RuntimeException("引索超出范围:index"+index);
		  }
		  if (size == element.length||index+1 >= element.length) {
			Object[] newelemrnt = new Object[element.length+(element.length>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
		}
		  
		  try {
			  element[size++] = element[size-1];
			  System.arraycopy(element, index, element, index+1, size-index); 
				 
		} catch (Exception e) {
			Object[] newelemrnt = new Object[element.length+(element.length>>1)];
			System.arraycopy(element, 0, newelemrnt, 0, size);
			element = newelemrnt;
			element[size] = element[size-1];
			System.arraycopy(element, index, element, index+1, size-index);
		}finally {
			 
		}
		  
		 	element[index]=str;
	  }
	  
	  /**
	   * 返回容器长度
	   * @return
	   */
	  public int length() {
		  return element.length;
	  }
	  
	  
	  /**
	   * 返回size
	   * @return
	   */
	  public int size() {
		  return size;
	  }
	  
	  
	  @Override
	public String toString() {		  
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < size; i++) {
			sb.append(element[i]+",");
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
//		
	}}
	  

9、代码链接

GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值