此例展示了ArrayList的存储实现,刚学集合类框架,希望对初学者有所借鉴,帮助理解ArrayList的用法等。此例不免有些许错误,还望各位高手指出。
package com.xiaodpro.util;
/**
* 模拟ArrayList类的实现
* @author xiaodpro
* 2010年3月7日
* @param <E>
*/
public class ArrayList<E>{
private Object[] elementData;
private int increment;
/**
* 创建一个默认大小及默认增长量的ArrayList
*/
public ArrayList() {
// 创建一个默认大小的ArrayList
this(10);
}
/**
* 创建一个指定初始大小的ArrayList
*
* @param initSize
* 初始大小
*/
public ArrayList(int initSize) {
this(initSize, 10);
}
/**
* 创建一个指定初始大小及增长量的ArrayList
*
* @param initSize
* 初始大小
* @param increment
* 增长量
*/
public ArrayList(int initSize, int increment) {
if(initSize < 10 || increment < 5)
throw new IllegalArgumentException();
this.elementData = new Object[initSize];
this.increment = increment;
}
/**
* 添加一个元素
* @param item 待添加的元素
*/
public void add(E item) {
// TODO Auto-generated method stub
add(item,size());
}
/**
* 向指定索引处添加一项
*
* @param item
* 待添加的元素
* @param index
* 指定索引
*/
public void add(E item, int index) {
if(index < 0 || index > size())
throw new ArrayIndexOutOfBoundsException();
while (isFull() || index > elementData.length) {
// 如果当前数据已满,则根据指定的增量增加一个单位值
Object[] tmp_ = new Object[elementData.length + increment];
// 将原来的数据复制到临时数组中
System.arraycopy(elementData, 0, tmp_, 0, elementData.length);
this.elementData = tmp_;
}
System.arraycopy(elementData, index, elementData, index+1, size()-index);
elementData[index] = item;
}
/**
* 移除指定的元素
*
* @param item
* 待移除的元素
* @return 移除的元素
*/
public E remove(Object item) {
// TODO Auto-generated method stub
if (isEmpty())
throw new NullPointerException();
try {
elementData[search(item)] = null;
} catch (ArrayIndexOutOfBoundsException e) {
throw new NullPointerException();
}
return remove(search(item));
}
/**
* 移除指定索引处的元素
*
* @param index
* 移除元素的索引
* @return 移除的元素
*/
public E remove(int index) {
if (isEmpty())
throw new NullPointerException();
E item = search(index);
System.arraycopy(elementData, index + 1, elementData, index, size() - index);
return item;
}
/**
* 移除ArrayList尾部元素
*
* @return 移除的元素
*/
public E remove() {
return remove(size() - 1);
}
/**
* 查找指定元素的索引
*
* @param item
* 指定的元素
* @return 指定元素的索引
*/
public int search(Object item) {
// TODO Auto-generated method stub
if (isEmpty())
return -1;
for (int i = 0; i < elementData.length; i++) {
// 遍历数组
if (elementData[i].equals(item))
return i;
}
return -1;
}
/**
* 查找指定索引处的元素
*
* @param index
* 指定的索引
* @return 指定索引处的元素
*/
@SuppressWarnings("unchecked")
public E search(int index) {
if(index < 0 || index > size())
throw new ArrayIndexOutOfBoundsException();
return (E) elementData[index];
}
/**
* 判断ArrayList是否为空
*
* @return 如果为空返回true,否则返回false
*/
public boolean isEmpty() {
if(this.size() == 0)
return true;
return false;
}
/**
* 将ArrayList转换为数组
*
* @return 转换后的数组
*/
@SuppressWarnings("unchecked")
public E[] toArray() {
Object temp = new Object[size()];
System.arraycopy(elementData, 0, temp, 0, size());
return (E[]) temp;
}
/**
* 获取ArrayList的元素个数
*
* @return 元素的有效个数
*/
public int size() {
for (int i = elementData.length - 1; i >= 0; i--) {
if (elementData[i] != null)
return i + 1;
}
return 0;
}
private boolean isFull() {
// 判断ArrayList是否已满;如果true,则返回true;否则返回false
if(this.size() < elementData.length)
return false;
return true;
}
public void clear() {
// TODO Auto-generated method stub
while(!isEmpty())
this.elementData[size()-1] = null;
}
}
专注成就未来!
分享到:
相关推荐
在Java中,ArrayList是一种常用的集合类,提供了许多实用的方法来操作集合数据,而本文则尝试模拟ArrayList的底层实现,通过自定义集合实现类MyArrayList,来实现基本的集合操作。 模拟ArrayList的add方法 在...
模拟ArrayList的Iterator实现,我们需要创建一个内部类,实现Iterator接口。这个内部类需要维护一个指向ArrayList实际元素的指针,以便于在迭代过程中跟踪当前位置。以下是一个简单的模拟实现: ```java public ...
在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...
这一步骤通过遍历`ArrayList`并调用`Goods`类的`compareTo()`方法来实现。如果发现已存在的商品,则显示提示信息而不执行添加操作。 ### 代码解析 下面是一些关键代码片段的分析: ```java // Goods.java public ...
在游戏开发、模拟和测试等场景中,`Random类`有着广泛的应用。 最后,我们来了解`ArrayList类`。这是Java集合框架的一部分,属于`java.util`包,实现了`List`接口。`ArrayList`是一个动态数组,允许我们在任何位置...
通过查看源代码,我们可以学习到如何在JavaScript环境中模拟ArrayList的行为,以及如何处理与Java中的ArrayList不同的问题,如线程安全和动态扩容等。 总的来说,ArrayList集合工具类是Java编程中的核心组件,它在...
在JavaScript中,ArrayList是一种常见的数据结构,它模拟了Java中的ArrayList功能,允许程序员进行动态数组操作。虽然JavaScript原生不支持ArrayList,但我们可以利用数组(Array)对象来实现类似的功能。下面将详细...
在Java中,可以使用ArrayList或LinkedList类来实现这两种方式。下面简述两种方法: - 数组实现:利用数组的索引,0号索引表示队头,最后一个索引表示队尾,通过调整索引实现队列操作。 - 链表实现:LinkedList类...
在JavaScript中,虽然没有内置的ArrayList类,但可以使用Array对象模拟类似的功能,因为Array在JavaScript中是动态的,可以随时添加、删除或修改元素。然而,JavaScript的Array不提供像ArrayList那样的线程同步功能...
JavaScript中没有直接的ArrayList实现,但我们可以使用`Array`作为替代。`Array`提供了丰富的操作方法,如`push`, `pop`, `shift`, `unshift`, `splice`等。例如: ```javascript let myList = []; myList.push(1);...
ArrayList是.NET框架中System.Collections命名空间下的一个类,它是基于数组实现的动态列表。ArrayList提供了在集合中添加、删除、查找和访问元素的功能,适用于存储各种类型的数据。在这个ArrayList测试中,我们将...
在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,属于List接口的实现类。它内部基于动态数组实现,提供了灵活的增删改查功能,同时保持了元素的有序性。本篇将深入探讨如何使用数组来模仿ArrayList的...
相比之下,ArrayList是C#中System.Collections命名空间下的一个类,它实现了IList接口,允许动态调整大小。ArrayList内部基于数组实现,但提供了更多的灵活性。当你不确定需要存储多少元素或者需要频繁添加、删除...
ArrayList是Java集合框架中的一种重要实现,它是一个基于数组实现的动态列表。ArrayList在JDK 1.8中,其内部使用一个Object数组`elementData`来存储元素,因此它的性能受到数组操作的影响,比如添加、删除和查找。...
在这个Java实现中,模拟退火算法的核心思想是通过随机改变当前解决方案(即旅行路线),并根据温度和接受概率来决定是否接受这个新解。初始时,算法设置一个较高的温度,随着迭代进行,温度会逐渐降低,使得接受较差...
本文将详细讲解如何在PHP中实现一个类,该类能够模拟C#中ArrayList的常见操作方法。 首先,我们要知道C#的ArrayList是一个基于数组的集合,它能够动态地存储任意类型的对象。ArrayList可以自动扩展以容纳更多元素,...
4、设计一个测试类WeatherTest,模拟生成和读取数据的过程,要求实现生成一次,紧接着进行读取,不能出现不同步的情况。 详细设计: 1、 天气类Weather,包含int类型的温度(temperature)和湿度(humidity)...
在进行上述算法实现时,Java的集合框架(如ArrayList、LinkedList)和数据结构(如堆、优先队列)将发挥重要作用。同时,需要注意的是,模拟过程中应考虑进程的创建、唤醒、阻塞和结束等状态转换,以及可能的进程...
在Java编程语言中,模拟实现一个跑步比赛是一个典型的对象导向编程问题,涉及到类的设计、对象的创建以及事件的处理。这个项目可能包括参赛者(Runner)类、比赛(Race)类以及比赛结果(Result)类等核心组件。下面...
总的来说,通过使用JavaScript来模拟ArrayList,我们可以更加深入地理解数据结构的工作原理,并在实际应用中灵活运用。学习如何实现这样的功能有助于提高编程能力,并为解决更复杂的问题打下坚实的基础。