简单的实现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. 10件5G能实现,但4G不能做的事情

    10件5G能实现,但4G不能做的事情 从三星Galaxy S10 5G手机到OnePlus 7 Pro 5G手机以及更高版本,首批5G手机现已上市.5G网络时代的开启是从小范围内,如果你居住在可以使用 ...

  2. noip 2010 引水入城 贪心 + 搜索

    不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...

  3. Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)C. Laboratory Work

    Anya and Kirill are doing a physics laboratory work. In one of the tasks they have to measure some v ...

  4. LINUX 中 VSFTPD安裝

    VSFTPD 简写:vsftpd是very secure FTP daemon 的缩写,是一个完全免费的,开源代码的ftp服务器软件 特点:vsftpd是一款在LINUX发行版中最受推崇的FTP服务器 ...

  5. InfoSYS-20170114

    1.描述Spring的事务机制 2.描述并发脏数据,如何避免 3.如何防止同一个请求重复提交(重复付款) 4.如何监控程序性能 5.CPU过高说明什么问题 通常是程序中有死循环, 参考 http:// ...

  6. 02018_StringBuffer练习

    1.已知int[] arr = {34,12,89,68}; 将其中的元素转成字符串,格式 [34,12,89,68]: 参考:02011_定义打印数组元素方法,按照给定的格式打印[11, 33, 4 ...

  7. Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  8. struts配置之namespace

  9. SQL优化的思路及基本原则(mysql)

    SQL优化的思路:  1.优化更需要优化的sql:  2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈.  3.明确优化目标:  4.从 ...

  10. rabbitMQ学习笔记(七) RPC 远程过程调用

    关于RPC的介绍请参考百度百科里的关于RPC的介绍:http://baike.baidu.com/view/32726.htm#sub32726 现在来看看Rabbitmq中RPC吧!RPC的工作示意 ...