package com.helloidea;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ArrayListTest {
    transient Object[] elementDate;
    private static final int DEFAULT_CAPACITY = 10;
    //如果自定义容量为0,则用它来初始化ArrayList,或者用于空数组替换
    private static final Object[] EMPTY_ELEMENTDATE = {};
    //如果没有自定义容量,则用它拉初始化ArrayList,或者用于空数组对比
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATE = {};
    private int size;

    public ArrayListTest(){
        this.elementDate = DEFAULTCAPACITY_EMPTY_ELEMENTDATE;
    }

    public ArrayListTest(int ini){
        if(ini == 0){
            this.elementDate = EMPTY_ELEMENTDATE;
        }else if (ini>0){
            this.elementDate = new Object[ini];
        }else {
            System.out.println("初始容量不能小于0");
        }
    }

    public void add(Object o){
        ensureExplicitCapacity(size+1);
        elementDate[size++] = o;

    }
    //刚开始数组为空,长度为0.size = 0 minCapacity = 1
    private void ensureExplicitCapacity(int minCapacity){
        //容量不足,扩容
        if(minCapacity>elementDate.length){
            int oldCapacity = elementDate.length;
            int newCapacity = oldCapacity + (oldCapacity>>1);//这时候0扩容还是0,1扩容还是1
            if(newCapacity<minCapacity)
                newCapacity = minCapacity;
            Object []objects = new Object[newCapacity];
            //将数据复制给新数组
            System.arraycopy(elementDate,0,objects,0,elementDate.length);
            elementDate = objects;
        }
    }

    public Object get(int index){
        rangeCheck(index);
        return elementDate[index];
    }

    private void rangeCheck(int index){
        if(index>=size){
            System.out.println("下标越界");
        }
    }
    public Object remove(int index){
        rangeCheck(index);
        Object oldValue = elementDate[index];
        int numMoved = size - index - 1;
        if(numMoved>0){
            //从index+1开始,将值覆盖
            System.arraycopy(elementDate,index+1,elementDate,index,numMoved);
        }
        elementDate[--size] = null;
        return oldValue;
    }

    public boolean remove(Object o){
        for(int index = 0;index<size;index++)
            if(o.equals(elementDate[index])){
                remove(index);
                return  true;
            }
        return false;
    }
    public int size(){
        return size;
    }
}

class  test{
    public static void main(String[] args) {
        ArrayListTest list = new ArrayListTest();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        for (int i = 0;i<list.size();i++)
            System.out.print(list.get(i)+"  ");
    }
}

模拟ArrayList的更多相关文章

  1. JAVA容器-模拟ArrayList的底层实现

    概述 ArrayList实质上就是可变数组的实现,着重理解:add.get.set.remove.iterator的实现,我们将关注一下问题. 1.创建ArrayList的时候,默认给数组的长度设置为 ...

  2. 模拟ArrayList底层实现

    package chengbaoDemo; import java.util.ArrayList; import java.util.Arrays; import comman.Human; /** ...

  3. java数据结构--array与ArrayList的区别

    ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...

  4. 模仿.NET框架ArrayList写一个自己的动态数组类MyArrayList,揭示foreach实现原理

    通过.NET反编译工具可以查看到ArrayList内部的代码,发现ArrayList并非由链表实现,而是由一个不断扩容的数组对象组成. 下面模仿ArrayList写一个自己的MyArrayList. ...

  5. [工作中的设计模式]迭代子模式Iterator

    一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...

  6. java学习容器

    自己模拟ArrayList: private Object[] elementData; private int size; // 可以指定集合大小,默认10 public MyArrayList(i ...

  7. 第 2章 数组和 ArrayLists

    数组是最通用的数据结构,它出现在几乎所有的编程语言里.在 C#语言中使用数组包括创建 System.Array 类型的数组对象,以及创建针对所有数组的抽象的基类型.Array 类提供了一套方法,这些方 ...

  8. 实现简单的List功能

    简单的实现javaArrayList(可扩容)功能,实现新增,删除,取数据. package algorithm.data_structure; /** * 模拟ArrayList类的功能 * @au ...

  9. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

随机推荐

  1. rest-assured的JsonPath使用方法总结

    JsonPath对于解析Json格式的数据来说非常简单,比如有下面这样的Json数据: {"lotto":{ "lottoId":5, "winnin ...

  2. Python项目自动生成当前项目的requirements文件

      使用pip freeze $ pip freeze > requirements.txt 这种方式是把整个环境中的包都列出来了,如果是虚拟环境可以使用. 通常情况下我们只需要导出当前项目的r ...

  3. node.js知识点提取

    javascript是脚本语言,脚本语言都需要一个解析器才能运行.

  4. python练习七十:图片生成

    题目:使用python生成类似于下图的字母验证码图片 实现代码: from PIL import Image,ImageFont,ImageDraw,ImageFilter import random ...

  5. java中的线程(2):如何正确停止线程之3种常见停止方式

    1.常见停止方式 自定义线程,其中含退出标志位,在run中判断它. 使用interrupt()方法中断线程 使用stop方法暴力终止(已经弃用) 2.使用标志位 class TestThread ex ...

  6. vue2.0 在main.js引入scss文件报错

    在vue2.0的main.js中引入scss文件报错 原因是在 在build文件夹下的webpack.base.conf.js的rules里面添加配置 { test: /\.scss$/, loade ...

  7. Mac下Jenkins+SVN+Xcode构建持续导出环境

    1 安装Jenkins Jenkins是基于Java开发的一种持续集成工具.所以呢,要使用Jenkins必须使用先安装JDK. JDK安装 JDK 下载地址 jdk 1.8.png 安装JDK的过程略 ...

  8. DP Intro - OBST

    http://radford.edu/~nokie/classes/360/dp-opt-bst.html Overview Optimal Binary Search Trees - Problem ...

  9. 【转】python平台libsvm安装

    来源:http://blog.csdn.net/prom1201/article/details/51382358 网上有很多麻烦的在win64机器上安装libsvm的步骤,实际上只要在下面网站找到l ...

  10. Navicat Premium v12.0.23.0 破解教程x86,x64通用,手动破解

    教程来源于:吾爱破解网站 ----------更新线----------- 2018.01.23 Navicat Premium v12.0.23.0 测试破解依然有效 ----------更新线-- ...