import org.omg.CORBA.PUBLIC_MEMBER;

import java.io.Serializable;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Stream; public class MyArrayList<T> {
int size;
private Object array[];
private static final Object[] EMPTY_ARRAY={};
public MyArrayList()
{
this(10);
}
public MyArrayList(int initCapcity) {
if (initCapcity < 0)
throw new IllegalArgumentException("initCapcity必须大于0");
else if (initCapcity==0)
{
this.array=EMPTY_ARRAY;
}else {
array=new Object[initCapcity];
} }
public MyArrayList(Collection<? extends T> c)
{
array=c.toArray();
if((size=array.length)!=0)
{
if (array.getClass()!=Object[].class)
{
array=Arrays.copyOf(array,size,Object[].class);
}
}else {
this.array=EMPTY_ARRAY;
}
}
public boolean isEmpty()
{
return size==0;
} public int size() {
return size;
}
public boolean add(Object obj)
{
ensureCapacity();
array[size++]=obj;
return true;
}
public void add(int index,Object object)
{
rangeCheck(index);
ensureCapacity();
System.arraycopy(array,index,array,index+1,size-index);
array[index]=object;
size++; }
public Object remove(int index)
{
rangeCheck(index);
Object oldObject=array[index];
if (array.length-index-1>0)
{
System.arraycopy(array,index+1,array,index,array.length-index-1);
}
array[size--]=null;
return oldObject;
}
public boolean remove(Object object)
{
if (object==null)
{
for (int i=0;i<size;i++)
{
if (array[i]==null)
remove(i);
return true;
}
}else {
for (int i=0;i<size;i++)
{
if (object.equals(array[i]))
{
remove(i);
return true;
} }
}
return false;
} public Object get(int index)
{
rangeCheck(index);
return array[index];
}
public void set(int index,Object object)
{
rangeCheck(index);
Object oldObject=array[index];
array[index]=object;
}
//判断索引是否越界
public void rangeCheck(int index)
{
if (index>=size||index<0)
throw new IndexOutOfBoundsException("索引不在范围内");
} //数组容量与size相等时进行扩容
public void ensureCapacity()
{
if (size==array.length)
{
Object [] newArray=new Object[2*size+1];
System.arraycopy(array,0,newArray,0,array.length);
array=newArray;
}
}
}

测试类:

import java.util.ArrayList;

public class Demo1 {
public static void main(String[] args)
{
MyArrayList myArrayList=new MyArrayList<String>();
myArrayList.add("aaaaa");
myArrayList.add("bbbbb");
System.out.println(myArrayList.get(0));
System.out.println(myArrayList.get(1));
myArrayList.remove(0);
System.out.println(myArrayList.get(0));
myArrayList.set(0,"xujinfeng");
System.out.println(myArrayList.get(0));
System.out.println(myArrayList.size());
}
}

手动实现一个简单的ArrayList的更多相关文章

  1. 自己动手系列——实现一个简单的ArrayList

    ArrayList是Java集合框架中一个经典的实现类.他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小.处于练手的目的,实现一个简单的ArrayList,并且把实现 ...

  2. java学习之—实现一个简单的ArrayList

    package thread1; /** * 实现一个简单的ArrayList * * @Title: uminton */ public class SimpleArrayList<T> ...

  3. 手动编写一个简单的loadrunner脚本

    loadrunner除了自动录制脚本外,还可以手动编写脚本,通过右键+inset step添加步骤,还可以手动添加事务,集合点等 下面是一个简单的Action脚本,服务是运行在本机的flask服务: ...

  4. 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

    写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...

  5. js new一个对象的过程,实现一个简单的new方法

    对于大部分前端开发者而言,new一个构造函数或类得到对应实例,是非常普遍的操作了.下面的例子中分别通过构造函数与class类实现了一个简单的创建实例的过程. // ES5构造函数 let Parent ...

  6. 原来热加载如此简单,手动写一个 Java 热加载吧

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  7. 手动实现一个简易版SpringMvc

    版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...

  8. 手动实现一个 IOC/DI 容器

    第一章为源码解析. 第二章为实现一个简单的 IOC 容器. 第三章进阶 Spring 插件开发. 手动实现一个 IOC/DI 容器 上一篇文章里我们已经对 Spring 的源码有了一个大概的认识,对于 ...

  9. [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图

    第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...

随机推荐

  1. 网络流——二分图最优匹配KM算法

    前言 其实这个东西只是为了把网络流的内容凑齐而写的(反正我是没有看到过这样子的题不知道田忌赛马算不算) 算法过程 我们令左边的点(其实二分图没有什么左右)为女生,右边的点为男生,那么: 为每一个女生定 ...

  2. OpenSL的代码编写

    #include <jni.h>#include <string>#include <SLES/OpenSLES.h>#include <SLES/OpenS ...

  3. 920. Number of Music Playlists

    Your music player contains N different songs and she wants to listen to L (not necessarily different ...

  4. 移动端页面模板viewport

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <meta nam ...

  5. Java并发编程实践读书笔记(4)任务取消和关闭

    任务的取消 中断传递原理 Java中没有抢占式中断,就是武力让线程直接中断. Java中的中断可以理解为就是一种简单的消息机制.某个线程可以向其他线程发送消息,告诉你“你应该中断了”.收到这条消息的线 ...

  6. Fiddler工具详细介绍

    百度看到Fiddler工具的详细介绍,转载收藏,侵权删,原文地址:http://blog.csdn.net/qq_21445563/article/details/51017605 前部分讲解Fidd ...

  7. UR5 改造

    背景 项目要求 UR5 安装在移动平台上,需要做以下改造: 供电:由 220V 市电改为直流电源(锂电池)直接供电: 控制:由示教器控制改为上位机远程控制 线路改造 1. UR5 电气图(来自UR5服 ...

  8. django框架--底层架构

    目录 零.参考 一.对于web服务的理解 二.对于wsgi协议的理解 三.自定义一个简单的基于wsgi协议的web框架 四.django中的server实现 五.django中的application ...

  9. Netty核心概念(5)之Channel

    1.前言 上一节讲了Netty的第一个关键启动类,启动类所做的一些操作,和服务端的channel固定的handler执行过程,谈到了不管是connect还是bind方法最终都是调用了channel的相 ...

  10. python的 del 函数是删对象还是删引用

    1.首先介绍下python的对象引用 1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用.即Python不允许程序员选择采用传值或传引用.Python参数传递采用的是“传对 ...