ArrayList类的实现:
- MyArrayList将保证基础数组,数组的容量,以及存储在MyArrayList中的当前项。
- MyArrayList将提供一种机制以改变基础数组的容量。通过获得一个新数组,将老数组拷贝到新数组中改变数组的容量,允许虚拟机回收老数组。
- 提供基本的方法,get,set,add,remove等操作。
- 提供一个实现Iterator接口的类。
具体实现方法:
/**
* Created by Administrator on 2017/3/5/005.
* 实现自定义ArrayList
*/
public class MyArrayList<AnyType> implements Iterable<AnyType> {
//定义默认数组大小
private static final int DEFAULT_CAPACITY = 10;
//定义数组当前大小
private int theSize;
//定义存储的数组
private AnyType[] theItems;
//构造函数,实现初始化操作
public MyArrayList(){
doClear();
}
public void clear(){
doClear();
}
/**
* 实现清空操作:设置数组大小为0,且设置默认大小的数组
*/
public void doClear(){
theSize = 0;
ensureCapacity(DEFAULT_CAPACITY);
}
//获取到ArrayList的长度
public int size(){
return theSize;
}
//判断ArrayList是否为空
public boolean isEmpty(){
return size() == 0;
}
//提供设置内置数组的大小
public void trimToSize(){
ensureCapacity(size());
}
//获取到对应的数据
public AnyType get( int idx){
if ( idx < 0 || idx >= size() )
throw new ArrayIndexOutOfBoundsException();
return theItems[idx];
}
/**
* 进行更新数据,并返回原来的数据
* @param idx
* @param newVal
* @return
*/
public AnyType set( int idx, AnyType newVal ){
if ( idx < 0 || idx >= size() )
throw new ArrayIndexOutOfBoundsException();
AnyType old = theItems[idx];
theItems[idx] = newVal;
return old;
}
/**
* 重新构造内置数组,以改变其大小
* @param newCapacity
*/
private void ensureCapacity(int newCapacity) {
if (newCapacity < size())
return;
AnyType [] old = theItems;
theItems = (AnyType[]) new Object[newCapacity];
for ( int i = 0; i < size(); i ++ ){
theItems[i] = old[i];
}
}
//默认方式添加数据
public boolean add(AnyType x){
add(size(), x);
return true;
}
//实现添加数据
private void add(int idx, AnyType x) {
//theItems.length表示其长度,而theSize表示为具体内容的长度,注意两者区别
//若相等,表示数组要满了,因此要扩充数组
if (theItems.length == size()){
ensureCapacity(size() * 2 + 1);
}
//对数组中的数据进行移动,整体往右移动
for (int i = theSize; i > idx; i --){
theItems[i] = theItems[i-1];
}
//进行赋值,并size++
theItems[idx] = x;
theSize ++;
}
//添加一个集合
public void addAll(Collection<AnyType> collection){
if (collection == null){
throw new NullPointerException();
}
for (AnyType c : collection){
add(c);
}
}
//实现删除数据,并返回删除的数据
public AnyType remove(int idx){
AnyType removeItem = theItems[idx];
//移动数组位置,整体往左移动
for ( int i = idx; i < size() - 1; i ++){
theItems[i] = theItems[i + 1];
}
theSize --;
return removeItem;
}
//实现删除某个元素
public boolean remove(AnyType x){
//先判断是否存在该元素
if (indexOf(x) != -1){
//获取到元素的位置,再进行删除操作
remove(indexOf(x));
return true;
}
return false;
}
//是否包含该元素
public boolean contains(AnyType x){
return indexOf(x) != -1;
}
//查找元素最早出现的位置
public int indexOf(AnyType x){
int index = 0;
if (x == null){
for (int i = 0; i < theSize; i ++){
if (theItems[i] == null){
return index;
}
index ++;
}
} else {
for (int i = 0; i < theSize; i ++){
if (x.equals(theItems[i])){
return index;
}
index ++;
}
}
return -1;
}
//查找元素最后出现的位置
public int lastIndexOf(AnyType x){
int index = theSize-1;
if (x == null){
for (int i = theSize - 1; i >= 0; i --){
if (theItems[i] == null){
return index;
}
index --;
}
} else {
for (int i = theSize - 1; i >= 0; i --){
if (x.equals(theItems[i])){
return index;
}
index --;
}
}
return -1;
}
//返回为一个数组
public AnyType[] toArray(){
return theItems;
}
public Iterator<AnyType> iterator(){
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator<AnyType>{
//记录当前位置
private int current = 0;
//判断是否存在下一项
@Override
public boolean hasNext() {
return current < size();
}
//返回当前位置的元素
@Override
public AnyType next() {
if (!hasNext()){
throw new NoSuchElementException();
}
return theItems[current++];
}
//删除当前位置,注意这里是--current,对应上面next的current++
public void remove(){
MyArrayList.this.remove(--current);
}
}
}
测试代码:
public class ArrayListTest {
public static void main(String[] args){
//测试添加操作
MyArrayList<String> myArrayList = new MyArrayList<>();
myArrayList.add("Android");
myArrayList.add("Web");
myArrayList.add("IOS");
printArrayList(myArrayList.iterator());
//测试更新以及删除操作
myArrayList.set(1,"JAVA");
myArrayList.remove(0);
myArrayList.remove("IOS");
printArrayList(myArrayList.iterator());
//测试addAll操作
List<String> list = new ArrayList<>();
list.add("PHP");
list.add("C++");
myArrayList.addAll(list);
printArrayList(myArrayList.iterator());
//测试查找位置操作
myArrayList.add("JAVA");
myArrayList.add("HTML");
printArrayList(myArrayList.iterator());
System.out.println("是否存在JAVA课程:" + myArrayList.contains("JAVA"));
System.out.println("JAVA课程的开始位置:" + myArrayList.indexOf("JAVA"));
System.out.println("JAVA课程的最后位置:" + myArrayList.lastIndexOf("JAVA"));
}
private static void printArrayList(Iterator iterator){
System.out.print("当前ArrayList为:");
while (iterator.hasNext()){
System.out.print(iterator.next() + " ");
}
System.out.println();
}
}
测试结果:
当前ArrayList为:Android Web IOS
当前ArrayList为:JAVA
当前ArrayList为:JAVA PHP C++
当前ArrayList为:JAVA PHP C++ JAVA HTML
是否存在JAVA课程:true
JAVA课程的开始位置:0
JAVA课程的最后位置:3