zoukankan      html  css  js  c++  java
  • 实现自己的ArrayList

    最近在学习数据结构和算法,书上有个ArrayList的简单实现,写的很不错。

      1 package cn.sp.test4;
      2 
      3 import java.util.Iterator;
      4 import java.util.NoSuchElementException;
      5 
      6 /**
      7  * Created by 2YSP on 2017/10/9.
      8  */
      9 public class MyArrayList<AnyType> implements Iterable<AnyType> {
     10 
     11     private static  final  int DEFAULT_CAPACITY = 10;
     12 
     13     private int theSize;
     14     private AnyType[] theItems;
     15 
     16     public MyArrayList(){
     17         doClear();
     18     }
     19 
     20     private void doClear() {
     21         theSize = 0;
     22         ensureCapacity(DEFAULT_CAPACITY);
     23     }
     24 
     25     public int size(){
     26         return theSize;
     27     }
     28 
     29     public boolean isEmpty(){
     30         return size() == 0;
     31     }
     32 
     33     public void trimToSize(){
     34         ensureCapacity(size());
     35     }
     36 
     37     /**
     38      * 获取角标处的值
     39      * @param idx
     40      * @return
     41      */
     42     public AnyType get(int idx){
     43         if (idx < 0 || idx >= size()){
     44             //角标越界异常
     45             throw new ArrayIndexOutOfBoundsException();
     46         }
     47 
     48         return theItems[idx];
     49     }
     50 
     51     /**
     52      * 替换目标位置的值,并返回旧值
     53      * @param idx
     54      * @param newVal
     55      * @return
     56      */
     57     public AnyType set(int idx , AnyType newVal){
     58         if (idx < 0 || idx >= size()){
     59             //角标越界异常
     60             throw new ArrayIndexOutOfBoundsException();
     61         }
     62 
     63         AnyType old = theItems[idx];
     64         theItems[idx] = newVal;
     65         return old;
     66     }
     67 
     68     public void ensureCapacity(int newCapacity) {
     69         if (newCapacity < theSize){
     70             return;
     71         }
     72 
     73         AnyType[] old = theItems;
     74         theItems = (AnyType[]) new Object[newCapacity];
     75         for(int i = 0 ;i < old.length ; i++){
     76             theItems[i] = old[i];
     77         }
     78     }
     79 
     80     public boolean add(AnyType x){
     81         add(size(),x);
     82         return true;
     83     }
     84 
     85     public void add(int idx,AnyType x){
     86         if (theItems.length == size()){
     87             //如果已满则扩容为之前的两倍
     88             ensureCapacity(size()*2 + 1);
     89         }
     90 
     91         for (int i = theSize ; i > idx ; i--){
     92             theItems[i] = theItems[i-1];//依次后挪
     93         }
     94 
     95         theItems[idx] = x;
     96         theSize++;
     97     }
     98 
     99     public AnyType remove(int idx){
    100         AnyType removedItem = theItems[idx];
    101         for(int i = idx ; i <size()-1;i++){//依次前移
    102             theItems[i] = theItems[i+1];
    103         }
    104         theSize--;
    105         return removedItem;
    106     }
    107 
    108     @Override
    109     public Iterator<AnyType> iterator() {
    110         return new ArrayListIterator();
    111     }
    112 
    113     private class ArrayListIterator<AnyType> implements java.util.Iterator<AnyType>{
    114 
    115         private int current = 0;
    116 
    117         @Override
    118         public boolean hasNext() {
    119             return current < size();
    120         }
    121 
    122         @Override
    123         public AnyType next() {
    124             if (!hasNext()){
    125                 throw new NoSuchElementException();
    126             }
    127 
    128             return (AnyType) theItems[ current++ ];
    129         }
    130 
    131         @Override
    132         public void remove() {
    133             MyArrayList.this.remove(current--);
    134         }
    135     }
    136 }

    注意理解current++和current--

  • 相关阅读:
    秒杀系统性能测试和优化
    性能测试分析过程(三)linux下查看最消耗CPU/内存的进程
    [改善Java代码]注意方法中传递的参数要求(replaceAll和replace的区别)
    [改善Java代码]由点及面,一叶知秋----集合大家族
    [改善Java代码]非稳定排序推荐使用List
    [改善Java代码]多线程使用Vector或HashTable
    [改善Java代码]减少HashMap中元素的数量
    [改善Java代码]使用shuffle打乱列表
    [改善Java代码]集合运算时使用更优雅的方式
    [改善Java代码]集合中的元素必须做到compareTo和equals同步
  • 原文地址:https://www.cnblogs.com/2YSP/p/7642073.html
Copyright © 2011-2022 走看看