package thread1;

/**
* 实现一个简单的ArrayList
*
* @Title: uminton
*/
public class SimpleArrayList<T> { //数组中元素的大小
private Integer elementSize = 0;
//创建SimpleArrayList时,数组的容量,默认为16
private Integer arrayCapacity = 16;
//当数组容量不够时,默认每次扩容的大小
private static final Integer DEFUALT_EXPAND_SIZE = 16;
//元素容器
Object[] array = null; //无参数构造,设置默认容量
public SimpleArrayList(){
this(DEFUALT_EXPAND_SIZE);
} /**
* 有参数构造,创建容器,设置数组大小
* @param arrayCapacity
*/
public SimpleArrayList(Integer arrayCapacity){
super();
if(arrayCapacity < 0){
throw new IllegalArgumentException("数组空间越界");
}
array = new Object[arrayCapacity];
this.arrayCapacity = arrayCapacity;
} /**
* 插入一个新元素,如果数组可以放下,直接添加
* 如果数组中放不下,扩容
* @param v
*/
public void add(T v){
//如果数组可以放下,直接添加
if(elementSize < arrayCapacity){
array[elementSize++] = v;
}else { //如果数组放不下,扩容后再添加
arrayCapacity += DEFUALT_EXPAND_SIZE; //扩容
System.out.println("数组放不下扩容:"+arrayCapacity);
Object[] newArray = new Object[arrayCapacity];
//创建新的数组
System.arraycopy(array,0,newArray,0,array.length);
//拷贝数据到新的数组
array = newArray;
//从新的数组赋值到原数组
array[elementSize++] = v;//添加
}
} /**
* 根据指定下标查找元素
* @param index
* @return
*/
public T get(int index){
if(index > elementSize-1 || index < 0){
throw new ArrayIndexOutOfBoundsException(index);
}
return (T) array[index];
} /**
* 删除指定位置的元素,所有之后的元素需要前移
* @param index
*/
public void remove(int index){
if(index > elementSize-1 || index < 0){
throw new ArrayIndexOutOfBoundsException(index);
}
for (int i = index; i < elementSize-1; i++) {
array[i] = array[i+1]; //覆盖前一个数据
}
elementSize--;
} /**
* 更新指定位置上的元素
* @param index
* @param t
*/
public void update(int index,T t){
if(index > elementSize-1 || index < 0){
throw new ArrayIndexOutOfBoundsException(index);
}
array[index] = t;
} /**
* 返回array中元素的大小
* @return
*/
public Integer size(){
return elementSize;
} public Integer capacity(){
return arrayCapacity;
} public static void main(String[] args) {
SimpleArrayList<Integer> list = new SimpleArrayList<>();
//添加
for (int i = 0; i < 20; i++) {
list.add(i);
}
//遍历
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
} //删除index为10的元素
list.remove(10); for (int i = 0; i < list.size(); i++) {
System.out.println("index:"+i+";value:"+list.get(i));
} System.out.println("size:" + list.size() + ",capacity:" + list.capacity());
} }

  

java学习之—实现一个简单的ArrayList的更多相关文章

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

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

  2. 用java从0生成一个简单的excel

    用java从0生成一个简单的excel 目标 用代码实现对一个excel的基础操作,包括创建,插入文字,(好像就这些了),生成的excel可以用wps打开,如果直接用c++的文件流会生成假的xls表格 ...

  3. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  4. Linux第三周学习总结——构造一个简单的Linux系统MenuOS

    第三周学习总结--构造一个简单的Linux系统MenuOS 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  5. 【Java】Jsoup爬虫,一个简单获取京东商品信息的小Demo

    简单记录 - Jsoup爬虫入门实战 数据问题?数据库获取,消息队列中获取中,都可以成为数据源,爬虫! 爬取数据:(获取请求返回的页面信息,筛选出我们想要的数据就可以了!) 我们经常需要分析HTML网 ...

  6. 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

    本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...

  7. 用IntelliJ IDEA学习Spring--创建一个简单的项目

    这段时间想学习一下Spring,其实之前学过Spring,只是有些忘记了.而且之前学的时候是适用eclipse学习的,现在好像对IntelliJ这个工具使用挺多的,现在就学习一下这个工具的用法,顺便复 ...

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

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

  9. micronaut 学习 二 创建一个简单的服务

    micronaut 提供的cli 很方便,我们可以快速创建具有所需特性的应用,以下是一个简单的web server app 创建命令 mn create-app hello-world 效果 mn c ...

随机推荐

  1. ES10特性详解

    摘要: 最新的JS特性. ES10 还只是一个草案.但是除了 Object.fromEntries 之外,Chrome 的大多数功能都已经实现了,为什么不早点开始探索呢?当所有浏览器都开始支持它时,你 ...

  2. 纯CSS实现点击事件展现隐藏div菜单列表/元素切换

    在写移动端导航的时候经常用到点击按钮出现/隐藏导航条的情况,最常见的方法当然还是前端框架直接调用,省心省力,不易出错:当然还有使用纯JS实现的小代码段.我这里整理了纯CSS实现方式,给需要的人和给自己 ...

  3. Vue开篇之Vue-cli搭建项目

    介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 第一步:安装node ...

  4. 后端开发者的Vue学习之路(五)

    目录 上节内容回顾 使用第三方组件库 如何发起请求 请求错误处理 请求带参 以get的方式带参: 以post的方式带参: 封装处理 请求的配置 axios实例 实现调用自定义函数来发起请求 抽取axi ...

  5. Dynamics 365-RetrieveDependenciesForDeleteRequest

    不少人在使用Dynamics 365的时候,或多或少都会遇到Delete a Component的情况,比如Unregister a Plugin/Workflow. 想象这么一个常见的情形:你定制了 ...

  6. 关于ajax用户名验证和jquery实现简单表单验证

    首先来说用户名验证: 前台: <tr> <td class="tableleft">教师编号</td> <td><input ...

  7. android 记一次富文本加载之路

    文章链接:https://mp.weixin.qq.com/s/69TRkmFL1aNuSqfw4ULMJw 项目中经常涉及到富文本的加载,后台管理端编辑器生成的一段html 代码要渲染到移动端上面, ...

  8. Python IO编程

    IO在计算机中指Input/Output,也就是输入和输出 一.文件读写 1.读文件 >>> f = open('/Users/michael/test.txt', 'r') --- ...

  9. 测者的测试技术笔记:揭开java method的一个秘密--巨型函数

    相信,很多人都不知道Java的Method的上限为64K.本文将超过这个上限的函数叫做巨型函数. 巨型函数的问题 1.如果代码超过了这个限制,Java编译器就报"Code too large ...

  10. 关于Python, ftplib模块中的cwd()进入含中文目录失败的问题

    使用Python的ftplib模块连接ftp服务器时, 使用cwd()连接含中文的目录, 报错 : UnicodeEncodeError: 'latin-1' codec can't encode c ...