zoukankan      html  css  js  c++  java
  • 模拟ArrayList扩容

    模拟集合元素的扩容过程:
    package arrayList;
    
    /**
     * 模拟ArrayList容器进行JDK扩容
     * @author Drew
     * 
     */
    public class MyArrayList {
        Object [] value;
        int size;
        public MyArrayList() {
    //        value = new Object[16];
            this(16);//调用本地构造方法
        }
        public MyArrayList(int size) {
            value = new Object[size];
        }
        
        /**
         * 添加数组元素
         * @param obj  任何java的数据类型
         */
        public void add(Object obj) {
            value[size]  = obj;
            size ++;
            if(size >= value.length) {
                //dilation
                int newCapacity = value.length * 2;        /*关键的一步*/
                Object[] newList = new Object[newCapacity];
                
                for(int i = 0; i < value.length; i++) {
                    newList[i] = value[i];
                }
                value = newList;
            }
        }
        
        public Object get(int index) {//数组的大小.
            /*if(index < 0 || index > size - 1) {
                try {
                    throw new Exception();
                }catch (Exception e) {//异常一抛出,程序就停止了。
                    e.printStackTrace();
                }
            }*/
            rangeCheck(index);
            return value[index];
        }
        /**
         * 返回元素的索引
         * @param obj 元素
         * @return 返回一个int类型的索引
         */
        public int indexOf(Object obj) {
            if(obj == null) {
                return -1;
            }else {
                for(int i = 0; i < value.length; i++){
                    if(obj == value[i]) {
                        return i;
                    }
                }
                return -1;
            }
        }
        public int LastindexOf(Object obj) {
            if(obj == null) {
                return -1;
            }else {
                for(int i = value.length; i >= 0 ; i--){
                    if(obj == value[i]) {
                        return i;
                    }
                }
                return -1;
            }
        }
        /**
         * 在指定位置上插入元素
         * @param index  需要插入元素的索引
         * @param obj  插入的元素类型·任意
         * @return  返回一个Object类型
         */
        public Object set(int index, Object obj) {
            /*if(index < 0||index >size - 1) {
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }*/
            rangeCheck(index);
            Object old = value[index];
            value[index] = obj;
            return old;
        }
        
        /**
         * 检查数组的最大的长度,是否需要扩充。
         * @param index
         */
        public void rangeCheck(int index) {
            if(index < 0||index >size - 1) {
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        /**
         * main方法,用于测试。
         * @param args
         */
        public static void main(String[] args) {
            MyArrayList list = new MyArrayList(2);
            list.add("size");
            list.add("length");
            list.add("sizeandlength");
            list.add("sizeorlength");
            System.out.println(list.get(1));
            System.out.println(list.get(2));
    //        System.out.println(list.get(-1));//抛出异常,超出范围。
    //        int string = list.LastindexOf(0);
    //        System.out.println(string);
        }
    
    }
    结果展示:

    这是自己学着玩的,有兴趣也可以尝试其他的java底层源码做做玩玩。

  • 相关阅读:
    Activity之间的数据传递
    解析JSON
    使用HTTP协议访问网路
    WebView的初体验
    Alarm机制用于定时服务
    IntentService和Service执行子线程对比
    前台服务
    Android四大组件之服务
    异步消息处理机制,UI更新
    Git学习
  • 原文地址:https://www.cnblogs.com/superdrew/p/8082220.html
Copyright © 2011-2022 走看看