手动实现一个简单的ArrayList
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的更多相关文章
- 自己动手系列——实现一个简单的ArrayList
ArrayList是Java集合框架中一个经典的实现类.他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小.处于练手的目的,实现一个简单的ArrayList,并且把实现 ...
- java学习之—实现一个简单的ArrayList
package thread1; /** * 实现一个简单的ArrayList * * @Title: uminton */ public class SimpleArrayList<T> ...
- 手动编写一个简单的loadrunner脚本
loadrunner除了自动录制脚本外,还可以手动编写脚本,通过右键+inset step添加步骤,还可以手动添加事务,集合点等 下面是一个简单的Action脚本,服务是运行在本机的flask服务: ...
- 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容
写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...
- js new一个对象的过程,实现一个简单的new方法
对于大部分前端开发者而言,new一个构造函数或类得到对应实例,是非常普遍的操作了.下面的例子中分别通过构造函数与class类实现了一个简单的创建实例的过程. // ES5构造函数 let Parent ...
- 原来热加载如此简单,手动写一个 Java 热加载吧
1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...
- 手动实现一个简易版SpringMvc
版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...
- 手动实现一个 IOC/DI 容器
第一章为源码解析. 第二章为实现一个简单的 IOC 容器. 第三章进阶 Spring 插件开发. 手动实现一个 IOC/DI 容器 上一篇文章里我们已经对 Spring 的源码有了一个大概的认识,对于 ...
- [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图
第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...
随机推荐
- c# 输入姓名直到输入的是quit时,停止输入然后显示出输入的姓名个数及姓名
1.输入姓名直到输入的是quit时(不区分大小写),停止输入然后显示出输入的姓名个数及姓名: 要求结果如下图所示: class Program { static void Main(string[] ...
- git生成Key操作保存到GITHUB中
https://blog.csdn.net/sinat_23880167/article/details/78502528 1. 在git中通过命令: $ ssh-keygen Generating ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Windows下木马的常用功能
有趣的键盘记录: 安装pyHook: http://nchc.dl.sourceforge.net/project/pyhook/pyhook/1.5.1/pyHook-1.5.1.win32-py2 ...
- 教你利用Node.js漏洞搞事情
PentestingNode.js Application : Nodejs Application Security 原文地址:http://www.websecgeeks.com/2017/04/ ...
- 理解JavaScript的数值型数据类型
分享一些在JavaScript中遇到的一些实用的技巧. 理解JavaScript的数值型数据类型 JavaScript的数值型数据类型只有一种:number.即不管是整数还是浮点数,JavaScrip ...
- 大数据技术之_19_Spark学习_04_Spark Streaming 应用解析小结
========== Spark Streaming 是什么 ==========1.SPark Streaming 是 Spark 中一个组件,基于 Spark Core 进行构建,用于对流式进行处 ...
- eclipseGUI的可视化开发工具插件
一 各种GUI开发插件的特色 Eclipse并不自带GUI的可视化开发工具,那么如果要在Eclipse进行可视化的GUI开发,就需要依靠第三方的插件. 1. Visual Editor Eclip ...
- 剑指offer二十四之二叉树中和为某一值的路径
一.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二.思路 详见代码 三.代码 1.解答代码 im ...
- 机器大数据也离不开Hadoop
转自:http://gtstorageworld.blog.51cto.com/908359/1286758 根据数据来源划分,大数据主要包括三类:商业运作产生的数据.人类行为产生的数据和机器数据.目 ...
- 获取设备信息——获取客户端ip地址和mac地址
1.获取本地IP(有可能是 内网IP,192.168.xxx.xxx) /** * 获取本地IP * * @return */ public static String getLocalIpAddre ...