简单的实现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. 杭电2060WA

    #include<stdio.h> int main() { int n,num,p,q,i,a[]={2,3,4,5,6,7}; scanf("%d",&n) ...

  2. VMware ESXi定制版(OEM ISO)资源下载(包含5.1\5.5\6.0)

     一.VMware ESXi 5.1.0 update03 1.VMware-ESXi-5.1.0-Update3-2323236-hitachi-0400.iso(日立) 2.VMware-ESXi ...

  3. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

  4. 洛谷P2296 寻找道路_简单BFS

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...

  5. XSS Chanllenges 1-5

    XSS Chanllenges XSS Chanllenges 是一个XSS的练习平台,可以借助这个平台练习各种绕过,以及手工进行XSS的学习 平台链接:https://xss-quiz.int21h ...

  6. Fastdfs环境搭建

    环境准备 使用的系统软件 名称 说明 centos 7.x libfatscommon FastDFS分离出的一些公用函数包 FastDFS FastDFS本体 fastdfs-nginx-modul ...

  7. python笔记(1)

    1.python2.x版本默认编码格式是ASSIC,不支持中文: 2.python3.x版本默认编码格式是UNICODE,支持中文: 3.支持中文的字符编码表:GB2312→GBK1.0→GB1803 ...

  8. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】

    文章来源http://blog.csdn.net/deadgrape/article/details/50563119 前言:关于RobotFrameWork+APPIUM实现对安卓APK的自动化测试 ...

  9. 工具-VS CODE快捷键

    快捷键 Ctrl+P 通过文件名或者标签名导航 Ctrl+Tab  在前一个文件和当前文件间切换 F1       打开全局命令 Ctrl+Shift+O will let you navigate ...

  10. Java泛型(一):入门、原理、使用

    远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都是类似于下面这样: List list = new ArrayList(); list.add(&q ...