数据结构--ArrayList的Java实现

上代码:

package com.itany.MyArrayList;

import java.util.Iterator;

public class MyArrayList<T> implements Iterable<T>
{
    private static final int DEFAULT_CAPACITY=10;//默认数组容量大小
    private int theSize;//集合中元素的个数大小
    private T[] theItems;//集合中的数组
    public MyArrayList()
    {
        theSize=0;
        clear();
    }
    public int size()
    {
        return theSize;
    }
    //清除所有集合中的所有元素
    public void clear()
    {
        theSize=0;
        ensureCapacity(DEFAULT_CAPACITY);
    }
    public boolean isEmpty()
    {
        return size()==0;
    }
    //缩小数组大小 缩小到和集合中元素个数一样大
    public void trimToSize()
    {
        ensureCapacity(size());
    }
    public T get(int idx)
    {
        //注意这里idx>最好写size()因为 get方法返回的是T 如果写theItems.length可能返回的是一个空 而不是对应的T
        if(idx<0 || idx>=size())
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
    }
    //返回被修改的原始值
    public T set(int idx,T newT)
    {
        if(idx<0 || idx>size())
            throw new ArrayIndexOutOfBoundsException();
        T old=theItems[idx];
        theItems[idx]=newT;
        return old;
    }
    //根据新的容量大小来扩充theItems数组的大小 并且把旧的数组内容传进新theItems的里面
    public void ensureCapacity(int newCapacity)
    {
        //如果新容量大小<集合中元素的个数 则直接结束方法
        if(newCapacity<theSize)
            return;
        T[] old=theItems;
        //theItems=new T[newCapacity]; Cannot create a generic array of T不能直接new泛型数组
        theItems=(T[])new Object[newCapacity];//只能这样写 这样的警告不可避免
        //把所有旧的数组里面内容全部给到新的容量数组里面  注意在clear调用时 由于theSize=0 不会赋值
        for(int i=0;i<size();i++)
        {
            theItems[i]=old[i];//剩余的为空
        }
    }
    //直接默认加在最后一个
    public void add(T newT)
    {
        add(size(),newT);
    }
    public void add(int idx,T newT)
    {
        //在插入时,需要考虑集合的元素个数是否已经等于数组的容量大小 负责需要对数组容量进行扩容
        if(size()==theItems.length)
            ensureCapacity(2*size()+1);
        //此时数组容量是大于集合元素个数
        //对于插入有两种可能 1如果插入位置>=size()大小的位置 那么不需要移动  2另一种 如果插入位置<size() 则需要平移
        //但是两者都需要相同的语句theItems[idx]=newT
        for(int i=size();i>idx;i--)//size()>idx的情况 不满足的话 不执行跳过即可
        {
            theItems[i]=theItems[i-1];
        }
        theItems[idx]=newT;//所有情况都要
        theSize++;
    }
    public T remove(int idx)
    {
        T oldT=theItems[idx];
        for(int i=idx;i<size()-1;i++)
        {
            theItems[i]=theItems[i+1];
        }
        theSize--;
        return oldT;
    }

    @Override
    //重写iterator方法 以获得一个自己写的ArrayListIterator迭代器
    public Iterator<T> iterator()
    {
        // TODO Auto-generated method stub
        return new ArrayListIterator();
    }
    //自己写的迭代器类ArrayListIterator
    private class ArrayListIterator implements Iterator<T>
    {
        private int current=0;
        @Override
        public boolean hasNext()
        {
            return current<size();
        }
        @Override
        public T next()
        {
            if(!hasNext())
                throw new java.util.NoSuchElementException();
            return theItems[current++];//current是先调用后+1
        }
        @Override
        public void remove()
        {
            //调用完next之后 current已经+1 因此要先-1 再删除当前
            //不能只写this.remove(--current); 因为这个this是ArrayListIterator对象
            MyArrayList.this.remove(--current);
        }
    }
}
package com.itany.MyArrayList;

import java.util.Iterator;

public class Test
{

    public static void main(String[] args)
    {
        MyArrayList<Integer> my=new MyArrayList<Integer>();
        my.add(12);
        my.add(11);
        my.add(13);
        my.add(2,14);
        my.remove(1);
        Iterator<Integer> it=my.iterator();
        while(it.hasNext())
        {
            System.out.print(it.next()+"  ");
        }
    }

}
时间: 2024-12-28 16:29:08

数据结构--ArrayList的Java实现的相关文章

数据结构与问题求解-Java语言描述(第三版)

数据结构对程序的重要性不言而喻,用java语言来实现常见的一些数据结构,以及在相应数据结构上的操作对学习java的同学来说是必须掌握的. 本系列博文参考<数据结构与问题求解-Java语言描述(第三版)>来实现 在自己学习的过程中,更希望有机会与大家交流. PS :本人是菜鸟,只是用博客的方式激励自己.请轻喷.Fighting!

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

Difference between LinkedList vs ArrayList in Java

source-url LinkedList implements it with a doubly-linked list. ArrayList implements it with a dynamically resizing array. This will lead further differences in performance. Difference between LinkedList vs ArrayList in Java By Lokesh Gupta | Filed Un

java数据结构之链表(java核心卷Ⅰ读书笔记)

1.链表 数组和ArrayList的一个重大缺陷就是:从中间位置删除一个元素要付出很大的代价,因为在这个元素删除之后,所有的元素都要向前端移动,在中间的某个位置插入一个元素也是这个原因. (小感悟:sun-zheng说了一句,每天在那安静地写代码,才是最轻松的活,不用这跑那跑,不用费太多的口舌,每天吹着空调,外面就是建筑地,别人风吹日赛,真的写代码是一件最轻松的事情) 我们在数据结构这门课中,在链表中添加或者删除某个元素时候,绕来如去的指针可能已经给人留下了极坏的印象,那么Java的集合类库提供

数据结构之Heap (Java)

Heap简介 Heap译为“堆”,是一种特殊的树形数据结构,它满足所有堆的特性:父节点的值大于等于子节点的值(max heap),或者小于等于子节点的值(min heap).对于max heap 根节点的值为整个树最大值,反之亦然,min heap 根节点的值为整个树最小值.本文采用Java编程语言简单实现min heap. Java Heap 对于大多数应用来说,Java堆 (Java Heap) 是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚拟机启动

数据结构和算法(Java版)

主要内容:(内容来自互联网以及李刚著作的<突破程序员基本功的16课>) 1.数据结构:线性表.栈.队列.树&二叉树 2.算法:常用内部排序(选择.插入.交换.归并) 目录: 1. 线性表(顺序存储.链式存储单链表.双向链表)-------------2014/10/15 2. 栈(顺序栈.链栈)                                        -------------2014/10/15 线性表(顺序存储.链式存储):一对一松耦合关系.(List就是线性

数据结构--图 的JAVA实现(上)

1,摘要: 本系列文章主要学习如何使用JAVA语言以邻接表的方式实现了数据结构---图(Graph),这是第一篇文章,学习如何用JAVA来表示图的顶点.从数据的表示方法来说,有二种表示图的方式:一种是邻接矩阵,其实是一个二维数组:一种是邻接表,其实是一个顶点表,每个顶点又拥有一个边列表.下图是图的邻接表表示. 从图中可以看出,图的实现需要能够表示顶点表,能够表示边表.邻接表指是的哪部分呢?每个顶点都有一个邻接表,一个指定顶点的邻接表中,起始顶点表示边的起点,其他顶点表示边的终点.这样,就可以用邻

数据结构--图 的JAVA实现(下)

在上一篇文章中记录了如何实现图的邻接表.本文借助上一篇文章实现的邻接表来表示一个有向无环图. 1,概述 图的实现与邻接表的实现最大的不同就是,图的实现需要定义一个数据结构来存储所有的顶点以及能够对图进行什么操作,而邻接表的实现重点关注的图中顶点的实现,即怎么定义JAVA类来表示顶点,以及能够对顶点进行什么操作. 为了存储图中所有的顶点,定义了一个Map<key, value>,实际实现为LinkedHashMap<T, VertexInterface<T>>,key 为

数据结构与算法分析Java版pdf

下载地址:网盘下载 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计).本书把算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面.缜密严格,并细致讲解精心构造程序的方法. 原文地址:https://www.cnblogs.com/longgg/p/8419233.html