zoukankan      html  css  js  c++  java
  • 模仿JDK写一个简单的ArrayList——高淇JAVA300讲笔记之ArrayList

        最近在看高淇300讲的视频,已经看了100集出头了,是时候整理下笔记了。

        ArrayList是List的子类,有顺序,可以重复。底层实现是数组,线程不安全,效率高。查询快,修改、插入、删除慢。

        以下代码简单地实现了ArrayList的add()、set()、isEmpty()、remove()、get()、size()等方法。其中在挪动数组中的元素时用到了java.lang.System类的静态方法arraycopy,数组拷贝。

        下面就直接放代码吧。

    package cn.bjsxt.collection;
    
    import java.util.Date;
    
    /**
     * 自己实现一个ArrayList
     * @author
     *
     */
    public class SxtArrayList /*implements List*/ {
        
        private Object[] elementData;  //一个对象数组
        
        private int size;  //ArrayList的大小
        
        //返回ArrayList的大小
        public int size() {
            return size;
        }
        
        //ArrayList是否为空
        public boolean isEmpty() {
            return size == 0;
        }
        
        //无参构造器
        public SxtArrayList() {
            this(10);  //默认容器大小是10
        }
        
        //构造器重载
        public SxtArrayList(int initialCapacity) {
            if(initialCapacity<0) {
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            elementData = new Object[initialCapacity];
        }
        
        //追加一个对象
        public void add(Object obj) {
            ensureCapacity();  //数组扩容
            elementData[size++] = obj;
        }
        
        //在指定位置插入一个对象
        public void add(int index, Object obj) {
            rangeCheck(index);
            
            ensureCapacity();  //数组扩容
            
            //将数组从指定位置开始往后挪一位
            System.arraycopy(elementData, index, elementData, index+1, size-index);
            elementData[index] = obj;
            size++;
        }
        
        //获得指定位置的元素
        public Object get(int index) {
            rangeCheck(index);  //检查数组越界
            return elementData[index];
        }
        
        //删除指定位置的对象
        public void remove(int index) {
            rangeCheck(index);  //检查数组越界
            int numMoved = size - index - 1;  //要挪动的元素的长度
            if(numMoved > 0) {
                //用数组拷贝的方式,将指定位置后面的元素往前挪一位
                System.arraycopy(elementData, index+1, elementData, index, numMoved);
            }
            elementData[--size] = null;  //使数组的最后一个元素为null
        }
        
        //remove的重载
        public void remove(Object obj) {
            for(int i=0;i<size;i++) {
                if(get(i).equals(obj)) {  //注意:底层调用的是equals方法而不是==
                    remove(i);
                    
                }
            }
        }
        
        //替换某个位置上的元素,并返回被替换掉的那个对象
        public Object set(int index, Object obj) {
            rangeCheck(index);
            
            Object oldValue = elementData[index];
            elementData[index] = obj;
            return oldValue;
        }
        
        private void ensureCapacity() {
            //数组扩容和数据的拷贝
            if(size == elementData.length) {
                Object[] newArray = new Object[size*2 + 1];  //新建一个数组,长度是原来的2倍加1
                
                System.arraycopy(elementData, 0, newArray, 0, elementData.length);  //把老数组里的元素拷贝给新数组
                elementData = newArray;
                
            }
        }
        
        //检查数组是否越界
        private void rangeCheck(int index) {
            if(index<0 || index>=size) {
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[] args) {
            SxtArrayList list = new SxtArrayList(3);
            list.add("aaa");
            list.add("aaa");
            list.add("444");
            list.add(new Date());
            System.out.println(list.isEmpty());
            System.out.println(list.size());
            System.out.println(list.get(3));
            System.out.println("被替换掉的元素是:" + list.set(3, "345"));
            System.out.println("被替换后的元素是:" + list.get(3));
            list.add(2,"abc");
            System.out.println(list.get(2));
            
            list.remove(2);
            System.out.println("####################################");
            for(int i=0;i<list.size();i++) {
                System.out.println(list.get(i));
            }
            list.remove("aaa");
            System.out.println("####################################");
            for(int i=0;i<list.size();i++) {
                System.out.println(list.get(i));
            }
            
        
        }
        
    }

          

  • 相关阅读:
    SQL Server中出现用户或角色在当前数据库已经存在的问题的解决
    vs项目中添加lib库的方法总结
    【转载】C++ Socket通信总结(附C++实现)
    【转载】windows socket函数详解
    如何在 Debian 9 下安装 LEMP 和 WHMCS 7.5
    13个云计算基础设施自动化的最佳工具
    5分钟打造一个前端性能监控工具
    我的处女作——设计模式之状态模式
    IOS逆向分析笔记——replay逆向分析
    IOS逆向分析——GL脚本的提取
  • 原文地址:https://www.cnblogs.com/swimminglover/p/8215547.html
Copyright © 2011-2022 走看看