实现简单的List功能
简单的实现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功能的更多相关文章
- ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能
参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-method ...
- Web---创建Servlet的3种方式、简单的用户注册功能
说明: 创建Servlet的方式,在上篇博客中,已经用了方式1(实现Servlet接口),接下来本节讲的是另外2种方式. 上篇博客地址:http://blog.csdn.net/qq_26525215 ...
- 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. ...
- Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能
本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...
- Django文件上传三种方式以及简单预览功能
主要内容: 一.文件长传的三种方式 二.简单预览功能实现 一.form表单上传 1.页面代码 <!DOCTYPE html> <html lang="en"> ...
- 运用socket实现简单的ssh功能
在python socket知识点中已经对socket进行了初步的了解,那现在就使用这些知识来实现一个简单的ssh(Secure Shell)功能. 首先同样是建立两个端(服务器端和客户端) 需求是: ...
- Jenkins实现简单的CI功能
步骤一:安装JDK.Tomcat,小儿科的东西不在此详细描述 步骤二:下载安装Jenkins下载链接:https://jenkins.io/download/ 步骤三:将下载的jenkins.war部 ...
- jQuery实现简单前端搜索功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Unity UGUI 实现简单拖拽功能
说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...
- AngularJS实现简单的分页功能
本篇文章由:http://xinpure.com/angularjs-simple-paging-functionality/ 初学 AngularJS, 尝试着写一些小功能 代码逻辑写得略粗糙,仅仅 ...
随机推荐
- 杭电2060WA
#include<stdio.h> int main() { int n,num,p,q,i,a[]={2,3,4,5,6,7}; scanf("%d",&n) ...
- 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 ...
- BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归
Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...
- 洛谷P2296 寻找道路_简单BFS
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
- XSS Chanllenges 1-5
XSS Chanllenges XSS Chanllenges 是一个XSS的练习平台,可以借助这个平台练习各种绕过,以及手工进行XSS的学习 平台链接:https://xss-quiz.int21h ...
- Fastdfs环境搭建
环境准备 使用的系统软件 名称 说明 centos 7.x libfatscommon FastDFS分离出的一些公用函数包 FastDFS FastDFS本体 fastdfs-nginx-modul ...
- python笔记(1)
1.python2.x版本默认编码格式是ASSIC,不支持中文: 2.python3.x版本默认编码格式是UNICODE,支持中文: 3.支持中文的字符编码表:GB2312→GBK1.0→GB1803 ...
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第一篇【安装】
文章来源http://blog.csdn.net/deadgrape/article/details/50563119 前言:关于RobotFrameWork+APPIUM实现对安卓APK的自动化测试 ...
- 工具-VS CODE快捷键
快捷键 Ctrl+P 通过文件名或者标签名导航 Ctrl+Tab 在前一个文件和当前文件间切换 F1 打开全局命令 Ctrl+Shift+O will let you navigate ...
- Java泛型(一):入门、原理、使用
远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都是类似于下面这样: List list = new ArrayList(); list.add(&q ...