ArrayList

java.util.Collection,Collection是java中保存元素的数据结构,因此数据结构采用java中集合collection。通过类型分类的接口来构造对数据结构分析。Collection类支持大多数集合类的操作

Collection中包含不同数据结构的不同接口的共性,通过Collection类,自己定义属于自己的数据接口类的接口,下面ArrayList自己构造一个数组列表的类实现Collection接口,对Collection接口的理解

存储一组类型相同的对象。

一个类实现一个接口,如果其子类是非abstract类,必须要实现其中接口中的方法,若子类是abstract不一定要实现其中接口的方法

1.ADT:抽象数据类型,抽象的数据类型可以add,remove,contain这样的操作,当然有并union和查找find,等操作,通过自己重写构造方法

2.list按照位置存储元素的集合,一种动态的结构。在List接口中extends的Collection方法。

3.数据结构与算法分析对数据结构一个升华,之前必须要先看看数据结构的表达方式,两者是明显分开的

ArrayList 自己自定义的类,使用数据存储结构来阐述如何实现ArrayList类。ArrayList类实现List接口

List接口中包含集合Collection接口所有方法,自己独特方法,List 接口中数据按照位置存储的动态结构

ArrayList集合。下面采用数组的存储接口开发属于自己ArrayList集合,同时实现ArrayList集合中各种操作:

 ArrayList 最重要一个方法ensureCapacity() 对原来数组的开阔,这也是动态结构原因所在

 1 public class test {
 2     private int [] listArr;
 3     private int theSize;
 4     
 5     //构造方法初始化
 6     public test(int [] arr,int n)
 7     {
 8         this.theSize=n;
 9         this.listArr=arr;
10     }
11     public void ensureCapacity(int newCapacity)
12     {
13         if(newCapacity<theSize)
14         {
15             return;
16         }
17         //为原来的数组开辟新的长度空间  
18         int []old=listArr;
19         listArr= (int[])new int[newCapacity];
20         
21         for (int i=0;i<theSize;i++)
22         {
23             listArr[i]=old[i];
24         }
25     }
26     
27     public   void main1() {
28         // TODO Auto-generated method stub
29         
30         System.out.println(theSize);
31         ensureCapacity(8);
32         System.out.println(listArr.length);
33     }
34     public static void main(String[] args)
35     {
36         int []arr={1,2,3,4,5};
37         int n=5;
38         test a=new test(arr,n);
39         a.main1();
40     }
41 }

注意点,1.构造方法初始化2.静态方法不能够直接使用非静态方法,间接调用:类对象名.方法,如上a.main1()

自己定义编写的MyArrayList 与jdk中ArrayList的理解:

package MyArrayList;

import java.util.Iterator;

//使用泛型类,实现Iterator的接口,必须实现Iterator中iterator方法
public class MyArrayList <AnyType> implements Iterable<AnyType>{
    private static final int DEFAULT_CAPACITY=10;//ArryList中默认的容量10
    
    private int theSize;
    private AnyType [] theItems;//Number of elements
    public MyArrayList()
    {//构造函数初始化
        doClear();
    }
    
    private void doClear()
    {
        theSize=0;
        //开辟一个默认为10的数组
        enSureCapacity(DEFAULT_CAPACITY);
    }
    
    /*****为了外部调用内部方法****/
    public int size()
    {
        return theSize;
    }
    public boolean isEmpty()
    {
        return size()==0;
    }
    public void trimToSize()
    {
        enSureCapacity(size());
    }
    @SuppressWarnings("unchecked")
    public void enSureCapacity(int newCapacity)
    {
        if(newCapacity<theSize)
            return;
        //如果发现要的容量大于theSize,必须开辟更多空间
        AnyType [] old=theItems;
        theItems=(AnyType[]) new Object[newCapacity];
        for(int i=0;i<theSize;i++)
            theItems[i]=old[i];
        
    }
    public AnyType get(int idx)
    {
        if(idx<0||idx>=size())
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
    }
    public AnyType set(int idx,AnyType newVal)
    {
        if(idx<0||idx>=size())
            throw new ArrayIndexOutOfBoundsException();
        AnyType old=theItems[idx];
        theItems[idx]=newVal;
        return old;//告诉我们已经完成设置
    }
    public void add(int idx,AnyType x)
    {//防止是否在数组满情况下相加
        if(size()==theItems.length)
        {
            enSureCapacity(size()*2+1);
        }
        //在idx位置上插入一个数,将idx右侧数据向右边移动,腾出插入位置
        for(int i=theSize;i>idx;i--)
            theItems[i]=theItems[i-1];
        theItems[idx]=x;
        theSize++;
        
        
    }
    public AnyType remove(int idx)
    {
        //与插入相反,将右侧位置覆盖就行
        AnyType removeItem=theItems[idx];
        for(int i=idx;i<size();i++)
            theItems[i]=theItems[i++];
        theSize--;
        return removeItem;
    }
    //对ArrayList数组数进行遍历:
    public void access()
    {  AnyType val=null;
    
        for(int i=0;i<size();i++)
        {
            val=theItems[i];
            System.out.print(val+" ");
        }
    }
    //实现Iterator下iterator方法
    @Override
    public    java.util.Iterator<AnyType>  iterator() {
        // TODO Auto-generated method stub
        return new ArrayListIterator();
        //这个实列实现Iterator接口
    }
    private class ArrayListIterator implements java.util.Iterator<AnyType>
    {
        private int current=0;
        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            
            return current<size();
        }

        @Override
        public AnyType next() {
            // TODO Auto-generated method stub
            if(!hasNext())
                throw new java.util.NoSuchElementException();
            return theItems[current++];
        }
        public void remove()
        {
            MyArrayList.this.remove(--current);
        }
        
    }
    public static  void main(String[] args)
    {
        @SuppressWarnings("unused")
        MyArrayList<Integer> test=new MyArrayList<Integer>();
        test.enSureCapacity(10);
        test.add(0, 1);
        test.access();
        
    }

    
}
原文地址:https://www.cnblogs.com/woainifanfan/p/6002091.html