本篇介绍手动实现一个ArrayList的基本功能。

ArrayList的底层是一个动态数组,这个有别于LinkedList的链表。代码实现了ArrayList的基本功能,所以没有实现ArrayList实现的一些接口,比如:RandomAccess和Serializable等。

方法名

作用

getSize()

获取数组大小

checkIncrease(int index,Object obj)

扩容,将原来的数组扩容一倍并将原来数据拷贝到新数组

indexOf(Object o)

根据元素获取在数组中首次出现的索引值

add(Object o)

往数组中添加元素

remove(int index)

删除数组中的元素如果此元素不在数组最后位置则将其后面的每个元素向前移动一位

checkIndexOut(int index)

检查所给下标是否越界

get(int index)

获取指定下标数据

removeAll()

清空数组

change(int index,Object o)

修改对应索引的值

contains(Object o)

判断是否包含对应值

isEmpty()

判断是否为空

public class MyArrayList {

//用于存储数据

private Object[] data = null;

//集合的元素个数

private int size = 0;

//定义一个常量为 10.(后面用于定义默认的集合大小)

private static final int DEFAULT_CAPACITY = 10;

/**

* 无参构造函数,指定初始大小为10

*/

public MyArrayList(){

this(DEFAULT_CAPACITY);//调用有参构造函数

}

/**

* 有参构造函数,指定数组大小

* @param initialCapacity

*/

public MyArrayList(int initialCapacity){

if(initialCapacity < 0){//判断数组大小不嗯呢该为负数

throw new IllegalArgumentException("非法的集合初始容量值 Illegal Capacity: "+initialCapacity);

}else{

//实例化数组

this.data = new Object[initialCapacity];

}

}

/**

* 获取数组大小

* @return

*/

public int getSize(){

return size;

}

/**

* 扩容,复制原来的数组并扩容一倍

* @param index

* @param obj

*/

public void checkIncrease(int index,Object obj){

if(size >= data.length){//原来数组放满之后进行扩容

//实例化一个新数组

Object[] newData = new Object[size*2];

if(index == -1 && obj == null){

System.arraycopy(data, 0, newData, 0, size);

}else{

//将要插入索引位置前面的对象 拷贝

System.arraycopy(data, index, newData, index+1, size-index);

}

data = newData;

newData = null;

}

}

/**

* 根据元素获得在集合中首次出现的索引

* @param o

* @return

*/

public int indexOf(Object o){

if(o == null){

for(int i = 0,len=data.length;i

if(data[i] == null){

return i;

}

}

}else{

for(int i=0,len=data.length;i

if(o.equals(data[i])){

return i;

}

}

}

return -1;

}

/**

* 在尾部添加元素

* @param o 需要被添加的元素

*/

public boolean add(Object o){

//检查是否需要扩容

checkIncrease(-1,null);

data[size++] = o;

return true;

}

/**

* 根据索引删除元素

* @param index

* @return

*/

public boolean remove(int index){

if(checkIndexOut(index)){//判断数组是否越界

if(index == size-1){//如果要删除的元素为最后一个元素

data[index] = null;

}else{//如果删除的元素不为最后一个元素则需要将此元素之后的元素向前移一位

System.arraycopy(data,index+1,data,index,size-index);

}

size--;

return false;

}else{//数组越界情况

throw new IndexOutOfBoundsException("指定的索引越界,集合大小为:"+size+",您指定的索引大小为:"+index);

}

}

/**

* 判断给定索引是否越界

* @param index

* @return

*/

public boolean checkIndexOut(int index){

if(index >= size || index <0){

// throw new IndexOutOfBoundsException("指定的索引越界,集合大小为:"+size+",您指定的索引大小为:"+index);

return false;

}

return true;

}

/**

* 根据给定索引获取元素

* @param index

* @return

*/

public Object get(int index) {

checkIndexOut(index);//判断是否越界

return data[index];

}

/**

* 删除所有元素

*/

public void removeAll(){

for(int i=0,len=data.length;i

data[i] = null;

}

size = 0;//

}

/**

* 根据索引修改元素

* @param index

* @param o

* @return

*/

public boolean change(int index,Object o){

checkIndexOut(index);//判断是否越界

data[index] = o;

return true;

}

/**

* 判断某个元素是否存在,若存在则返回索引,不存在返回-1

* @param o

* @return

*/

public int contains(Object o){

for(int i = 0,len=data.length;i

if(o.equals(data[i])){

return i;

}

}

return -1;

}

/**

* 判断数组是否为空

* @return

*/

public boolean isEmpty() {

return size == 0;

}

}

java arraylist实现_java实现ArrayList基本功能相关推荐

  1. java list原理_Java中ArrayList实现原理

    前言 这个分类中,将会写写Java中的集合.集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织.存储数据.这里写的集合,一部分是比较常 ...

  2. java print快捷键_Java的ArrayList集合使用---唐代诗人斗地主!!!

    一.集合如何实现斗地主? 我们现实生活中关于斗地主,首先要有一副牌,然后把牌洗一下,在然后发牌,最后抢地主!因此斗地主需要以下的5步! 创建牌盒,定义一个集合对象,用ArrayList实现 往牌盒里装 ...

  3. java arraylist 源代码_java中ArrayList的源代码是什么

    展开全部 package java.util; public class ArrayList extends AbstractList implements List, RandomAccess, C ...

  4. java arraylist 函数_Java Extend ArrayList函数

    让我说我有 class Dummy { String a, b; public Dummy(String a, String b) { this.a = a; this.b = b; } public ...

  5. java用arraylist求和_Java中ArrayList的使用

    ArrayList类是一个特殊的数组--动态数组.来自于System.Collections命名空间:通过添加和删除元素,就可以动态改变数组的长度. 优点: 1.支持自动改变大小 2.可以灵活的插入元 ...

  6. Java的ArrayList集合_JAVA之ArrayList集合

    /** * ArrayList集合讲解 * 集合的添加.遍历.删除 */ package com.test; import java.util.*; public class test7 { /** ...

  7. java arraylist 源代码_Java中ArrayList源码浅析

    ArrayList基本使用 public class ArrayListTest { public static void main(String[] args) { List list = new ...

  8. java arraylist 重复_Java中ArrayList去除重复元素

    Java中ArrayList去除重复元素 //删除ArrayList中重复元素 public   static   void  removeDuplicate(ArrayList list)   { ...

  9. java 释放数组_java集合ArrayList中clear方法内存释放分析

    最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...

最新文章

  1. python内置函数open_python_内置函数和open
  2. 58回应“简历数据泄露”:将展开追查并加固安全系统
  3. [转载]JDBC/Spring/MyBatis性能比较
  4. java 左边补0_java 数字左补齐0
  5. PAT乙级1006 换个格式输出整数
  6. tcpip详解有必要看吗_车辆有必要安装“行车记录仪”吗?如何挑选看这里!
  7. scanf函数的读取
  8. 下载proteus-isis时出现的错误
  9. 吃着热狗就把数学整明白了?
  10. 哪个Linux可以运行国服lol,Linux wine国服LOL英雄联盟,完美运行!!
  11. snakeyaml操作yml文件中注释的处理
  12. excel输出线性拟合曲线的斜率
  13. 阿里云短信服务java发送短信验证码
  14. Cannot resolve org.springframework.boot:spring-boot-starter-web:2.2.6.RELEAS
  15. webstorm官网中文破解版(转自http://blog.csdn.net/vchen_hao/article/details/77248053)
  16. C语言邮箱名字用什么存储,用c++定义一个描述学生通讯录的类数据成员包括姓名学校电话号码和邮箱...
  17. Thumbnailator的简介和使用范例(图片压缩)
  18. OpenCV—用meanshift和Camshift进行目标追踪
  19. c语言现代诗如蚯蚓思路,现代诗大全
  20. ORA-01858 :在要求输入数字处找到非数字字符

热门文章

  1. 概率图模型中信念传播
  2. 牛客网学习笔记-day01
  3. Nginx搭建部署Web服务器并与NFS结合搭建负载均衡服务器
  4. 细数你不得不知的容器安全工具
  5. 当精准广告遇到大数据
  6. jenkins ssh发布配置
  7. 如果再不要求进步,那么你就是下一个陨落的巨头
  8. bacula 的安装、配置和运行
  9. 一个通过数据库镜像实现SPS 2003门户快速备份与恢复的操作手册
  10. dea工具debug断点红色变成灰色