Java中ArrayList的自我实现
对于ArrayList相比大家都很熟悉,它是java中最常用的集合之一。下面就给出它的自我实现的java代码。
需要说明的一点是,它是基于数组创建的。所以它在内存中是顺序存储,对于查找十分的方便。
package com.pinjia.shop.common.collection; import java.util.Iterator;
import java.util.NoSuchElementException; /**
* Created by wangwei on 2017/1/3.
* ArrayList的自己封装,实现
*/
public class MyArrayList<E> implements Iterable<E> { private static final int DEFAULT_SIZE = 10;//容器默认大小
private int theSize;
private E[] theItems; public MyArrayList(){
clear();
} public void clear(){
theSize = 0;
ensureCapacity(DEFAULT_SIZE);
} public int size(){
return theSize;
} public boolean isEmpty(){
return size() == 0;
} public void trimToSize(){
ensureCapacity(size());
} public E get(int idx){
if(idx<0||idx>=size())
throw new ArrayIndexOutOfBoundsException();
return theItems[idx];
} public E set(int idx,E newVal){
if(idx<0||idx>size())
throw new ArrayIndexOutOfBoundsException();
E old = theItems[idx];
theItems[idx] = newVal;
return old;
} public void ensureCapacity(int newCapacity) { //数组的扩展
if(newCapacity<theSize)
return;
E[] old = theItems;
theItems = (E[])new Object[newCapacity];
for(int i=0;i<size();i++){
theItems[i] = old[i];
}
} public boolean add(E x){
add(size(),x);
return true;
} public void add(int idx,E x){
if(theItems.length == size())
ensureCapacity(size()*2+1);
for(int i=theSize;i>idx;i--){
theItems[i] = theItems[i-1];
}
theItems[idx] = x;
theSize++;
} public E remove(int idx){
E removeItem = theItems[idx];
for(int i=idx;i<size()-1;i++){
theItems[i] = theItems[i+1];
}
theSize--;
return removeItem;
} public Iterator<E> iterator() {
return new ArrayListIterator();
} private class ArrayListIterator implements Iterator<E>{ //内部类
private int current = 0;
public boolean hasNext(){
return current<size();
}
public E next(){
if(!hasNext())
throw new NoSuchElementException();
return theItems[current++];
}
public void remove(){
MyArrayList.this.remove(--current);
}
}
}
Java中ArrayList的自我实现的更多相关文章
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- JAVA中ArrayList用法
JAVA中ArrayList用法 2011-07-20 15:02:03| 分类: 计算机专业 | 标签:java arraylist用法 |举报|字号 订阅 Java学习过程中做题时 ...
- Java中ArrayList与LinkedList的区别
Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- java中ArrayList 和 LinkedList 有什么区别
转: java中ArrayList 和 LinkedList 有什么区别 ArrayList和LinkedList都实现了List接口,有以下的不同点:1.ArrayList是基于索引的数据接口,它的 ...
- Java中ArrayList相关的5道面试题
本文参考了 <关于ArrayList的5道面试题 > 1.ArrayList的大小是如何自动增加的? 这个问题我想曾经debug过并且查看过arraylist源码的人都有印象,它的过程是: ...
- Java中ArrayList类详解
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- Java中ArrayList源码分析
一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...
- Java中ArrayList和LinkedList差别
一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机訪问get和set.A ...
随机推荐
- SOAP 格式设置选项
SOAP 格式设置选项 两个格式设置选项为: Style:适用于 SOAP 消息中 Body 元素的子元素(也可能是孙级).此选项指定为 binding WSDL 元素(通常情况下)或 operati ...
- MySQL force Index 强制索引概述
以下的文章主要介绍的是MySQL force Index 强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...
- 改变了Tomcat路径后无法卸载和重装的解决办法
错误如下: ---------------------------Apache Tomcat Setup---------------------------Failed to install Tom ...
- C语言转换大小写
#include <stdio.h> #include <ctype.h> // Contains the tolower prototype void main (void) ...
- ASP.NET MVC4中使用Ninject
1.NuGet获取Ninject.dll 选中项目右键: .NET技术交流群 199281001 .欢迎加入. 2.全局注册 Global.asax.cs //注册Ninject依赖注入全局解析器 ...
- 转:Java NIO系列教程(七) Socket Channel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器. ...
- Hadoop 2.2.0部署安装(笔记,单机安装)
SSH无密安装与配置 具体配置步骤: ◎ 在root根目录下创建.ssh目录 (必须root用户登录) cd /root & mkdir .ssh chmod 700 .ssh & c ...
- Linux中表示“时间”的结构体和相关函数
转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html Linux中表示“时间”的结构体和相关函数 2011-09-13 17: ...
- C#中跨线程访问控件问题解决方案
net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ...
- LoadRunner中响应时间与事物时间详解
1. 响应时间 事务是指用户在客户端做一种或多种业务所需要的操作集,通过事务函数可以标记完成该业务所需要的操作内容:另一方面事务可以用来统计用户操作的响应时间,事务响应时间是通过记录用户请求的开始时间 ...