最近就是想扒一扒存在硬盘里面的学习资料(突然想到什么),把以前写过的一些东西整理一下分享出来。

这边是ArrayList 的简单实现,当然只实现了部分方法

package com.yck.collection;

import java.util.Iterator;

/**
 * 手动实现ArrayList的主要功能
 * ArrayList的底层实现就是数组
 *
 */

public class MyArrayList
{
    private Object []elementDate;    //
    private int size;

    /**
     * 索引范围的检查
     * @param index
     */
    private void rangCheck(int index)
    {
        if(index<0 || index >= size)
        {
            try
            {
                throw new Exception();
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * 带参构造
     * @param initicalCapacity
     */
    public MyArrayList(int initicalCapacity)
    {
        if(initicalCapacity<0)
            try
        {
            throw new Exception("int cannot below 0.");
        }
        catch (Exception e)
        {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
        this.elementDate = new Object[initicalCapacity];
    }

    /**
     * 无参构造,使用上一个构造函数,初始化数组长度默认为10
     */
    public MyArrayList()
    {
        this(10);
    }

    /**
     * 以下是List接口的一些方法实现,主要的问题在于add 和 remove一定要记住size要跟着改变
     * 方法的实现很简单,看一下就能懂
     * @param obj
     */
    public void add(Object obj)
    {
        if(size >= elementDate.length)
        {
            Object []newElementDate = new Object[size*2];
            /**
             * 用for循环写一个复制方法。
             */
            for(int i=0;i<elementDate.length;i++)
            {
                newElementDate[i] =elementDate[i];
            }
            elementDate = newElementDate;
        }
        elementDate[size] = obj;
        size++;
    }

    public void add(MyArrayList arr)
    {
        if((size+arr.elementDate.length)>this.elementDate.length)//是否需要扩容判断
        {
            Object []newElementDate = new Object[(size+arr.elementDate.length)*2];
            //System.arraycopy(elementDate, 0, newElementDate, 0, elementDate.length);//调用系统方法复制
            for(int i=0;i<this.size;i++)
            {
                newElementDate[i] = elementDate[i];
            }
            elementDate = newElementDate;
        }
        for(int i=0;i<arr.size;i++)
        {
            this.elementDate[size]=arr.elementDate[i];
            size++;
        }

    }

    public void remove(int index)
    {
        this.rangCheck(index);
        for(int i=index;i<elementDate.length-1;i++)
            elementDate[i] = elementDate[i+1];
        size--;

    }
    public void remove(Object obj)
    {
        for(int i=0;i<size;i++)
        {
            if(this.get(i).equals(obj))
                this.remove(i);
        }
    }

    public Object get(int index)
    {
        this.rangCheck(index);
        return this.elementDate[index];

    }

    public int size()
    {
        return this.size;
    }
    public boolean isEmpty()
    {
        if(this.size == 0)
            return true;
        else return false;
    }

    public Iterator iterator()
    {
        return new MyIt();
    }

    private class MyIt implements Iterator //那个什么跌蛋器。。不好意思我输入法写出来是这样。。。自定义迭代器的实现
    {
        private int cursor = -1;  //游标初始值置为-1;

        /**
         * 判断是否有下一个元素
         * 1、如果curror + 1 < size;说明有,返回true
         * 2、如果curror + 1 >size;说明没有,返回 false
         */
        public boolean hasNext()
        {
            return cursor+1 < size;
        }

        /**
         * 取出下当前元素,并把游标指向下一个元素
         */
        public Object next()
        {
            cursor++;
            return elementDate[cursor];
        }
    }

    public static void main(String[] args)
    {
        MyArrayList list = new MyArrayList(3);
        list.add("aaa");
        list.add("uuu");
        list.add("ddd");
        list.add("eee");
        System.out.println(list.elementDate.length+"..."+list.size);
        for(Iterator iter = list.iterator();iter.hasNext();)
        {
            System.out.println((String)iter.next());
        }
    }

}

上面有简单的测试,主要是为了测试迭代器。当时写的时候肯定是写一个方法测试一下的= =

有兴趣的朋友可以稍作修改加上泛型

javaSE基础之 ArrayList的底层简单实现的更多相关文章

  1. javaSE基础之 LinkedList的底层简单实现

    这里贴上LinkedList底层的简单实现 package com.yck.mylinkedlist; public class Node { private Node previous; //上一结 ...

  2. 基础1 JavaSe基础

    JavaSe基础 1. 九种基本数据类型的大小,以及他们的封装类 boolean 无明确指定 Boolean char 16bits Character byte 8bits Byte short 1 ...

  3. Java基础系列-ArrayList

    原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...

  4. Java基础系列--ArrayList集合

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...

  5. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ...

  6. JavaSE基础:集合类

    JavaSE基础:集合类 简单认识类集 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储. 而要向存储多个对象,就不能是 ...

  7. javaSE基础07

    javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...

  8. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  9. javaSE基础04

    javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...

随机推荐

  1. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  2. 关于解决mysql数据库乱码的问题

    最近在开发的过程中频繁的使用到了mysql'这款数据库,mysql的中文乱码问题一直让人头疼.以前遇到过几次,但是都一不小心就解决了,这次终于明白到底是怎么回事了.可能我下面手的这种解决方案只适合于我 ...

  3. forget Alinx * quena

    生活片段linux与queena进入我的生活 今天来分享一下学习心得与在生生活当中遇到的情况!..属于基础与小白该看的的文章 ,学长们多多给建议... 学习是一个循序渐进不断坚持的一个过程,贵在坚持, ...

  4. css3关键帧动画实现轮播效果

    实现效果:打开手机京东,可以看到首页的头部,以这个头部为基础,仿写一个类似的样式. 思路:仔细观察可以发现,手机京东的头部是以一个搜索栏和轮播特效组成的,而这个搜索栏是以轮播特效做为背景的,现在运用c ...

  5. <EffectiveJava>读书笔记--02泛型数组

    1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public c ...

  6. App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

    面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...

  7. 带有WS-Security验证的webservice

    示例用的是spring+CXF来配置webservice 首先是web.xml配置,将spring,CXF的配置文件加载进去,由于我客户端跟服务端在同一个工程里面,所以配置文件在一块. <con ...

  8. jQuery基础知识总结二

     * DOM操作 *1 基本操作 * html() - 等价于innerHTML属性 * text() - 等价于textContent属性 * val() - 等价于value属性 * attr() ...

  9. 关于ftp出现425错误

    在centos上搭建一个ftp,一切都配置好之后,我去访问时仍然会出现425 Failed to establish connection.这个错误,经过一番查找,原来是这个 -A INPUT -j ...

  10. 一步一步学多线程-ThreadLocal源码解析

    上网查看了很多篇ThreadLocal的原理的博客,上来都是文字一大堆,费劲看了半天,大脑中也没有一个模型,想着要是能够有一张图明确表示出来ThreadLocal的设计该多好,所以就自己看了源码,画了 ...