简单的实现javaArrayList(可扩容)功能,实现新增,删除,取数据。

package algorithm.data_structure;

/**
* 模拟ArrayList类的功能
* @author fangsh
*
*/
public class SimpleList<T> { private Object[] elements ; private int size = 0 ;//记录元素数组的长度 private int elementsNum = 0 ;//记录元素的个数 private final static int ADD_NUMBER = 10 ;//扩容数量
private final static int RELEASE_CACHE = 5 ;//释放内存的大小 /**
* 添加元素
* @param e
* @return
*/
public void add(T e){
if(elements == null) elements = new Object[10] ; // 初始化元素数组,初始化长度为10 if(elements.length <= elementsNum){//判断是否有空间添加元素
addNumberCache() ;
}
elements[elementsNum] = e ; elementsNum++ ;
} /**
* 删除元素的方法,删除元素时,列表的长度不应该有所改变
* @param e
* @return
* 第一次写方法时犯的错误:对象比较的时候,使用了==,应该使用equals;
* 需要优化的地方,在删除元素的时候,是否把元素占用的内存释放(涉及长度不够增加的情况)
*/
public boolean remove(T e){
if(elements != null){
if(elements.length > 0){
int removeIndex = 0 ;
for(int i=0; i<elements.length; i++){
Object obj = elements[i] ;
if(obj.equals(e)){
removeIndex = i ;
break ;
}
}
Object[] newObject = new Object[elements.length - 1] ;
for(int begin=0; begin<removeIndex; begin++){
newObject[begin] = elements[begin] ;
}
for(int continueIndex= removeIndex+1; continueIndex<elements.length; continueIndex++){
newObject[continueIndex - 1] = elements[continueIndex] ;
} elements = newObject ;
elementsNum -- ; return true ;
}
}
return false ;
} /**
* 改进的删除方法,返回删除的元素,并且删除时不修改列表的长度
* @param t
* @return
*/
public T remove2(T t) throws Throwable{
if(elements == null || isEmpty())
throw new Throwable("列表为空,或者列表中没有数据") ;
int removeIndex = -1 ;
for(int i=0; i<elements.length; i++){
Object obj = elements[i] ;
if(obj.equals(t)){
removeIndex = i ;
}
if(removeIndex != -1){
Object nextElement = null ;
if(i != elements.length-1)
nextElement = elements[i+1] ;
elements[i] = nextElement ;
}
}
elementsNum -- ;
if(removeIndex < 0)
throw new Throwable("删除的元素不在列表内!") ;
return t ;
} public boolean isEmpty(){
if(elementsNum == 0){
return true ;
}
return false ;
} @SuppressWarnings("unchecked")
public T get(int index) throws Throwable{
if(elements == null) throw new NullPointerException("列表为空!") ;
if(index < 0) throw new Throwable("请输入有效的列表下标!") ;
if(index > elements.length) throw new Throwable("您输入的下标超过列表元素的个数!") ;
return (T)elements[index-1] ;
} /**
* 扩容的方法,默认扩容的长度为10
*/
private void addNumberCache(){
if(elements == null) return ;
if(elements.length == elementsNum){
Object[] newElements = new Object[elementsNum + ADD_NUMBER] ;
for(int i=0; i<elements.length; i++){
newElements[i] = elements[i] ;
}
elements = newElements ;
}
} /**
* 当SimpleList中的空余内存达到一定数量时,释放SimpleList中的内存
*/
private void releaseNumberCache(){
if(elements == null) return ;
if(elements.length > (elementsNum + 10)){//达到释放标准
Object[] newElements = new Object[elements.length - RELEASE_CACHE] ;
for(int i=0; i<(elements.length - RELEASE_CACHE); i++){
newElements[i] = elements[i] ;
}
elements = newElements ;
}
} /**
* 查询列表元素的个数
* @return
*/
public int getElementNum(){
return elementsNum;
} /**
* 查询元素列表的长度
* 注意这个方法一定不能用来判断列表元素的个数,因为列表可能存在多余空间
* @return
*/
public int getSize() throws Throwable{
if(elements == null)
throw new Throwable("列表为空!") ;
return elements.length ;
}
}

总结一下,做这个时出现的一些问题,日后注意:

1、在对比对象的时候,一开始脑残的使用了“==” ,导致删除方法不成功,对象比较注意一定使用equals方法。

2、做删除元素的时候,将元素数组的长度减少了,没有更新size这个字段,这个字段可以不用,需要这个值的时候,直接调用数组的length方法,减少bug出现的可能性(要随时同步size这个值,增加了出bug的可能性)

3、一开始的删除方法,会新建一个数组,并且还要重新遍历原素组,将元素重新加入到新数组中,这样造成资源的浪费,可以直接将被删除元素之后的元素依次往前移,最后一个数组位置补null。这样避免了新建数组造成的资源开销。

实现简单的List功能的更多相关文章

  1. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...

  2. Web---创建Servlet的3种方式、简单的用户注册功能

    说明: 创建Servlet的方式,在上篇博客中,已经用了方式1(实现Servlet接口),接下来本节讲的是另外2种方式. 上篇博客地址:http://blog.csdn.net/qq_26525215 ...

  3. js+html+css简单的互动功能页面(2015知道几乎尖笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

    js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html? from=y1.7-1. ...

  4. Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能

    本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...

  5. Django文件上传三种方式以及简单预览功能

    主要内容: 一.文件长传的三种方式 二.简单预览功能实现 一.form表单上传 1.页面代码 <!DOCTYPE html> <html lang="en"> ...

  6. 运用socket实现简单的ssh功能

    在python socket知识点中已经对socket进行了初步的了解,那现在就使用这些知识来实现一个简单的ssh(Secure Shell)功能. 首先同样是建立两个端(服务器端和客户端) 需求是: ...

  7. Jenkins实现简单的CI功能

    步骤一:安装JDK.Tomcat,小儿科的东西不在此详细描述 步骤二:下载安装Jenkins下载链接:https://jenkins.io/download/ 步骤三:将下载的jenkins.war部 ...

  8. jQuery实现简单前端搜索功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Unity UGUI 实现简单拖拽功能

    说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...

  10. AngularJS实现简单的分页功能

    本篇文章由:http://xinpure.com/angularjs-simple-paging-functionality/ 初学 AngularJS, 尝试着写一些小功能 代码逻辑写得略粗糙,仅仅 ...

随机推荐

  1. 开发一个 App 有多难?说出来你可能不信!

    上图为程序员客栈儿童类视频APP 1.开发一个APP有多难?说实话,单纯地从开发来说,开发一个APP没有那么难.如果一款APP的基本功能点确定了,开发时间一般为1-2个月就完成了,费用大约5-10万的 ...

  2. 01--[转]C++强大背后

    [转]C++强大背后 2014-01-22 分类:互联网 阅读(9295) 评论(6) 在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bj ...

  3. node——四种注册路由方式

      app.get和app.post 1.请求的方法必须是get/post2.请求的路径的pathname必须等于(====)路径 app.use 1.在进行路由匹配的时候不限定方法,什么请求方法都可 ...

  4. C#常用 API函数大全

    常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConne ...

  5. 2018年九个很受欢迎的vue前端UI框架

    最近在逛各大网站,论坛,SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,小编自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在做自己 ...

  6. socketpair和pipe的区别

    http://blog.csdn.net/bingqingsuimeng/article/details/9055499 管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂.socket ...

  7. DOMContentLoaded事件<zz>

    今天查看百度空间源代码,发现多了个util.js文件,打开看看.里面里面定义了addDOMLoadEvent.这是干什么用的? 仔细查看代码,发现在Mozilla添加了DOMContentLoaded ...

  8. RecyclerView的点击事件

    RecyclerView 一.简单介绍 这个是谷歌官方出的控件.使我们能够很easy的做出列表装的一个控件,当然recyclerview的功能不止这些,它还能够做出瀑布流的效果,这是一个很强大的控件, ...

  9. emacs使用本地emacs server模式打开远程文件

    使用emacs的用户都知道,一般要打开远程机器上的文件要使用TrampMode模式,调用方式例如以下: C-x C-f /remotehost:filename RET (or /method:use ...

  10. EasyUI----动态拼接EasyUI控件

    近期在做的项目中.依据查询到的数据,然后动态的拼接easyUI的控件显示到界面上. 在数据库中,有一个命令的表,另一个參数的表,先到命令的表中去查询这一个设备有哪些命令,比方说.摄像头有一个转动的命令 ...