简单的实现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. 【转】linux 增加用户 useradd 用法小结及配置文件说明

    原文地址:https://blog.csdn.net/warden2010/article/details/5132290 在Linux 系统中,所有的用户和组像一个国家.如果国家要繁荣昌盛的话,需要 ...

  2. Linux下清空文件的几种方法

    $ : > filename $ > filename $ echo "" > filename $ echo > filename $ cat /dev/ ...

  3. Django生命周期,FBV,CBV

    一. Django生命周期 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串,在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中.Django的请求生命周 ...

  4. SQL更新字段内容部分值

    UPDATE att_allSET attachment = REPLACE(attachment, 'pw/', '')WHERE (attachment LIKE 'pw/%')

  5. ConcurrentHashMap 并发HashMap原理分析

        ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁.如图   左边便是Hashtable的实现方式---锁整个hash表:而右边则是Concurrent ...

  6. Scrum敏捷开发过程

    首先来说一下什么是敏捷开发: 敏捷开发(Agile Development)是一种以人为核心.迭代.循序渐进的开发方法. 怎么理解呢?首先,我们要理解它不是一门技术,它是一种开发方法,也就是一种软件开 ...

  7. SimpleDateFormat 格式化 解析

    package chengbaoDemo; import java.text.DateFormat; import java.text.ParseException; import java.text ...

  8. 使用magento eav数据模型为用户提供图片上传功能的实践

    一,在megento表中,增加一个存储上传图片路径的属性, 给magento的customer实体类型增加一个audit_file_path属性,因为要customer使用的是EAV模型,得操作几个关 ...

  9. Scrapy系列教程(6)------怎样避免被禁

    避免被禁止(ban) 有些网站实现了特定的机制,以一定规则来避免被爬虫爬取. 与这些规则打交道并不easy,须要技巧,有时候也须要些特别的基础. 假设有疑问请考虑联系 商业支持 . 以下是些处理这些网 ...

  10. Bridge模式

    Bridge模式 Bridge模式 在面向对象的开发过程中,要做到2点:1.高内聚(cohesion).2.松耦合(coupling).可是在实际开发过程中难以把握,比如会遇到这种问题: 1)客户给了 ...