zoukankan      html  css  js  c++  java
  • MyArrayList

    注:

      ArrayList的实现还是比较简单,毕竟底层都是对数组的操作,相对容易理解。我是直接实现了List<E>接口,没有继承AbstractList<E>抽象类,直接将List中的方法都实现一遍。代码中ArrayList<E>中的常用操作基本都实现了,也有少许尚未实现。

    package soul.demo.lists;
    
    import java.util.*;
    
    class MyArrayList<E> implements List<E>{
        
        public static void main(String[] args){
            
        }
        
        //空列表
        private final static Object[] EMPTY_ELEMENTDATA={};
        
        //存储元素的Object数组
        private Object[] elementData;
        
        //默认容量
        private final static int DEFAULT_CAPACITY=10;
        
        //容量大小(实际存储的元素数量,默认为0)
        private int size=0;
        
        /**
         * 构造一个初始容量为initCapacity的空列表
         * @param initCapacity
         */
        public MyArrayList(int initCapacity){
            if(initCapacity>0)
                elementData=new Object[initCapacity];
            else if(initCapacity==0)
                elementData=EMPTY_ELEMENTDATA;
            else
                throw new IllegalArgumentException("Illegal Capacity: "+
                        initCapacity);
        }
        
        /**
         * 构造一个初始容量为10的空列表
         */
        public MyArrayList(){
            elementData=new Object[DEFAULT_CAPACITY];
        }
        
        /**
         * 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的
         * @param c
         */
        public MyArrayList(Collection<? extends E> c){
            if(c.size()>0){
                elementData=new Object[c.size()];
                addAll(c);
            }
            else
                elementData=EMPTY_ELEMENTDATA;
        }
        @Override
        /**
         * 返回列表中的元素数
         */
        public int size() {
            // TODO Auto-generated method stub
            return this.size;
        }
    
        @Override
        /**
         * 若列表中不包含元素,则返回true
         */
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return this.size==0;
        }
    
        @Override
        /**
         * 如果列表包含指定的元素,则返回true
         */
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return indexOf(o)>0;
        }
    
        @Override
        /**
         * 返回按适当顺序在列表上进行迭代的迭代器
         */
        public Iterator<E> iterator() {
            // TODO Auto-generated method stub
            return new Itr<E>();
        }
        @SuppressWarnings("hiding")
        private class Itr<E> implements Iterator<E>{
    
            private int index=0;
            @Override
            public boolean hasNext() {
                // TODO Auto-generated method stub
                return index!=size;
            }
    
            @SuppressWarnings("unchecked")
            @Override
            public E next() {
                // TODO Auto-generated method stub
                return (E)elementData[index++];
            }
            
        }
        @Override
        /**
         * 返回按适当顺序包含列表中所有元素的数组
         */
        public Object[] toArray() {
            // TODO Auto-generated method stub
            Object[] arrElementData=new Object[size]; 
            System.arraycopy(elementData, 0, arrElementData, 0, size);
            return arrElementData;
        }
    
        @Override
        /**
         * 尽可能的将列表中的元素存储在数组a中;返回数组的运行时类型是指定数组的运行时类型。
         */
        public <T> T[] toArray(T[] a) {
            // TODO Auto-generated method stub
            
            if(a.length>=size){
                System.arraycopy(elementData, 0, a, 0, size);
            }else{
                System.arraycopy(elementData, 0, a, 0, a.length);
            }
            return a;
        }
    
        @Override
        /**
         * 向列表的尾部添加指定的元素
         * 
         * @param 
         * @return 
         */
        public boolean add(E e) {
            // TODO Auto-generated method stub
            if(size==elementData.length)
                growCapacity();
            elementData[size++]=e;
            return true;
        }
    
        @Override
        /**
         * 从列表中移除第一次出现的指定元素(若存在)
         */
        public boolean remove(Object o) {
            // TODO Auto-generated method stub
            int index=indexOf(o);
            if(index>=0)
                return remove_0(index);
            else 
                return false;
        }
    
        private boolean remove_0(int index) {
            // TODO Auto-generated method stub
            System.arraycopy(elementData, index+1, elementData, index, size-index-1);
            elementData[--size]=null;
            return true;
        }
    
        @Override
        /**
         * 如果列表包含指定collection中的所有元素,则返回true
         */
        public boolean containsAll(Collection<?> c) {
            // TODO Auto-generated method stub
            Iterator<?> iterator=c.iterator();
            Object obj;
            while((obj=iterator.next())!=null){
                if(indexOf(obj)<0)
                    return false;
            }
            return true;
        }
    
        @Override
        /**
         * 添加指定Collection中的元素到此列表的结尾,顺序是指定的Collection迭代器返回的顺序
         */
        public boolean addAll(Collection<? extends E> c) {
            // TODO Auto-generated method stub
            return addAll(size+1,c);
        }
    
        @Override
        /**
         * 将指定的collection中的所有元素插入列表的指定位置
         */
        public boolean addAll(int index, Collection<? extends E> c) {
            // TODO Auto-generated method stub
            int _size=size;
            size+=c.size();
            Object[] source=c.toArray();
            if(elementData.length<size)
                growCapacity(c.size());        
            if(index<_size+1){
                Object[] trasientArr=new Object[_size-index];
                System.arraycopy(elementData, index, trasientArr, 0, size-index);
                System.arraycopy(trasientArr, 0, elementData, index+c.size(), trasientArr.length);
            }
            System.arraycopy(elementData, index, source, 0,c.size() );
            return true;
        }
    
        @Override
        /**
         * 从列表中移除指定collection的所有元素
         * 思路是将不需要remove的元素单独取出来
         */
        public boolean removeAll(Collection<?> c) {
            // TODO Auto-generated method stub
            return batchRemove(c,false);
        }
    
        @Override
        /**
         * 仅在列表中保留指定collection的所有元素
         */
        public boolean retainAll(Collection<?> c) {
            // TODO Auto-generated method stub
            return batchRemove(c,true);
        }
    
        private boolean batchRemove(Collection<?> c,boolean isRemove){
            
            Object tempStore[]=new Object[size];
            int ts=0;
            
            for(int i=0;i<size;i++){
                if(c.contains(elementData[i])==isRemove)
                    tempStore[ts++]=elementData[i];
            }
            System.arraycopy(tempStore, 0, elementData, 0, ts);
            size=ts-1;
            return true;
        }
        @Override
        /**
         * 从列表中移除移除所有元素
         */
        public void clear() {
            // TODO Auto-generated method stub
            for(int i=0;i<size;i++)
                elementData[size]=null;
            size=0;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        /**
         * 返回列表中指定位置的元素
         */
        public E get(int index) {
            // TODO Auto-generated method stub
            rangeCheck(index);
            return (E)elementData[index];
        }
    
        @SuppressWarnings("unchecked")
        @Override
        /**
         * 用指定元素在替换指定位置的元素
         */
        public E set(int index, E element) {
            // TODO Auto-generated method stub
            rangeCheck(index);
            E oldValue=(E)elementData[index];
            elementData[index]=element;
            return oldValue;
        }
    
        @Override
        /**
         * 在列表的指定位置插入指定元素
         */
        public void add(int index, E element) {
            // TODO Auto-generated method stub
            rangeCheck(index);
            if(size==elementData.length)
                growCapacity();
            System.arraycopy(elementData, index, elementData, index+1, size-index);
            elementData[index]=element;
            size++;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        /**
         * 移除列表中指定位置的元素
         */
        public E remove(int index) {
            // TODO Auto-generated method stub
            rangeCheck(index);
            E oldValue=(E)elementData[index];
            remove_0(index);
            return oldValue;
        }
    
        @Override
        /**
         * 返回此列表中第一次出现指定元素的指引,若列表不包含该元素,则返回-1
         */
        public int indexOf(Object o) {
            // TODO Auto-generated method stub
            if(o==null){
                for(int i=0;i<size;i++){
                    if(elementData[i]==null)
                        return i;
                }
            }else{
                for(int i=0;i<size;i++){
                    if(o==elementData[i])
                        return i;
                }    
            }
    
            return -1;
        }
    
        @Override
        /**
         * 返回列表中指定元素最后出现的位置,若列表不包含该元素,则返回-1
         */
        public int lastIndexOf(Object o) {
            // TODO Auto-generated method stub
            int goal=-1;
            if(o==null){
                for(int i=0;i<size;i++){
                    if(elementData[i]==null)
                        goal=i;
                }
            }else{
                for(int i=0;i<size;i++){
                    if(o==elementData[i])
                        goal=i;;
                }    
            }
    
            return goal;
        }
    
        @Override
        /**
         * 返回此列表元素的列表迭代器
         */
        public ListIterator<E> listIterator() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        /**
         * 返回列表元素的列表迭代器,从列表的指定位置开始
         */
        public ListIterator<E> listIterator(int index) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        /**
         * 返回列表中指定索引之间的部分视图
         */
        public List<E> subList(int fromIndex, int toIndex) {
            // TODO Auto-generated method stub
            return null;
        }
        
        /**
         * 比较指定的对象与列表是否相等
         */
        public boolean equals(Object obj){
            return false;
        }
        
        /**
         * 返回列表的哈希码值
         */
        public int hashCode(){
            return 0;
        }
        
        /**
         * 增加容量
         */
        private void growCapacity(){
            growCapacity(elementData.length>>1);
        }
        
        private void growCapacity(int addLen){
            int oldLen=elementData.length;
            int newLen=(int)(oldLen+addLen);
            Object[] newElementData=new Object[newLen];
            System.arraycopy(elementData, 0, newElementData, 0, oldLen);
            elementData=newElementData;
        }
        
        /**
         * 检查index是否超出列表范围
         * @param index
         */
        private void rangeCheck(int index) {
            if (index >= size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
        private String outOfBoundsMsg(int index) {
            return "Index: "+index+", Size: "+size;
        }
        
        public String toString(){
            String str="[";
            for(int i=0;i<size;i++){
                if(i==size-1)
                    str+=elementData[i];
                else
                    str+=elementData[i]+",";
                
            }
            return str+"]";
        }
    }
     
  • 相关阅读:
    游戏开发中——垂直同步、绘制效率、显示器刷新频率与帧率
    python 异常
    python 多文件知识
    python if,for,while
    python 算术运算
    1.英语单词笔记
    Java import的作用
    java基础点
    Eclipse Java注释模板设置详解
    Java文档注释详解
  • 原文地址:https://www.cnblogs.com/realsoul/p/5769024.html
Copyright © 2011-2022 走看看