package com.list;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class Array_List<E>
{
/**
* 存储数据的大小,大小有ArrayList的初始值决定
*/
private Object[] elementData = null;
/**
* ArrayList的大小
*/
private int size = 0;
/**
* 构造一个指定初始值大小的ArrayList
*
* @param initialCapacity
* ArrayList的初始值
*/
public Array_List(int initialCapacity)
{
if (initialCapacity < 0)
{
// 如果参数不合法或者不正确,就会抛出IllegalArgumentException.
throw new IllegalArgumentException("Illegal capacity:"
+ initialCapacity);
}
this.elementData = new Object[initialCapacity];
}
/**
* 构造一个空的List,初始值大小为10
*/
public Array_List()
{
this(10);
}
/**
* 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
*
* @param c
* 其元素将放置在此列表中的 collection
*/
public Array_List(Collection<? extends E> c)
{
// 包含此 collection 中所有元素的数组
elementData = c.toArray();
size = c.size();
if (elementData.getClass() != Object[].class)
{
// 如果elementData里面数据类型不是Object[]类型,需要通过copyOf方式转成Object[]类型
Arrays.copyOf(elementData, size, Object[].class);
}
}
/**
* 增加ArrayList容量
*
* @param minCapacity
* 新容量的大小
*/
public void ensureCapacity(int minCapacity)
{
int oldCapacity = elementData.length;
if (oldCapacity < minCapacity)
{
Object oldData[] = elementData;
// 如果ArrayList现在的大小<minCapacity;(将原来的大小*3)/2+1扩大,
// 如果扩大后的值还是<minCapacity;那么就让最新的大小等于传入的值。并复制对象。
int newCapacity = (oldCapacity * 3) / 2 + 1;
System.out.println(newCapacity);
if (newCapacity < minCapacity)
{
newCapacity = minCapacity;
System.out.println(newCapacity);
}
elementData = Arrays.copyOf(elementData, minCapacity);
}
}
/**
* 返回ArrayList的大小
*
* @return 大小
*/
public int size()
{
return size;
}
/**
* 判断是否为null
*
* @return size==0?true:false
*/
public boolean isEmpty()
{
return size == 0 ? true : false;
}
/**
* 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1
*
* @param o
* 要搜索的元素
* @return 此列表中第一次出现的指定元素的索引,如果列表不包含该元素,则返回 -1
*/
public int indexOf(Object o)
{
if (null == o)
{
for (int i = size - 1; i >= 0; i--)
{
if (elementData[i] == null)
{
return i;
}
}
}
else
{
for (int i = size - 1; i >= 0; i--)
{
if (elementData[i].equals(o))
{
return i;
}
}
}
return -1;
}
/**
* 检查数组是否下标越界
*
* @param index
* 需要检查的下标
*/
private void RangeCheck(int index)
{
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
}
/**
* 根据index查询某个值
*
* @param index
* 索引
* @return 索引对应的值
*/
@SuppressWarnings("unchecked")
public E get(int index)
{
RangeCheck(index);
return (E) elementData[index];
}
/**
* 用指定的元素替代此列表中指定位置上的元素。
*
* @param index
* 索引
* @param element
* 元素
* @return 以前位于该指定位置上的元素
*/
public E set(int index, E element)
{
RangeCheck(index);
E oldElement = (E) elementData[index];
elementData[index] = element;
return oldElement;
}
/**
* 添加一个Element,首先要判断ArrayList的大小是否已经用完, 重新申请新的空间,然后在size++,赋值。
*
* @param e
* 新添加的元素
* @return 添加成功
*/
public boolean add(E e)
{
ensureCapacity(size + 1);
elementData[size++] = e;
return true;
}
public void add(int index, E element)
{
if (index > size || index < 0)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
ensureCapacity(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1, size
- index);
elementData[index] = element;
size++;
}
/**
* 根据索引移除数据,是先将需要移除的数据的索引计算(size - index - 1), 然后把索引其他数据向前移动,最后把最后的一个数据清除即可。
*
* @param index
* 索引
* @return index对应的数据
*/
public E remove(int index)
{
RangeCheck(index);
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
System.out.println(numMoved);
if (numMoved > 0)
{
System.out.println(Arrays.toString(elementData));
System.arraycopy(elementData, index + 1, elementData, index,
numMoved);
System.out.println(Arrays.toString(elementData));
}
elementData[--size] = 0;
System.out.println(Arrays.toString(elementData));
return oldValue;
}
public static void main(String[] args)
{
Array_List<String> s = new Array_List<String>(5);
for (int i = 0; i < 15; i++)
{
s.add("" + (i + 1));
}
// s.remove(2);
s.add("33");
}
}
分享到:
相关推荐
比较分析Vector、ArrayList和hashtable hashmap数据结构
### ArrayList数据批量添加数据 #### 知识点概述 在.NET框架中,`ArrayList`类是一种动态数组,用于存储不同类型的数据。本篇文章将详细介绍如何利用`ArrayList`进行数据的批量添加,并通过一个示例来展示如何在一...
Java编程语言在实现这些数据结构和算法时,提供了丰富的类库支持,如ArrayList和LinkedList实现了线性结构,HashSet和HashMap实现了集合和映射,而TreeSet和TreeMap则实现了有序集合和映射。同时,Java的泛型特性...
在Java中,我们可以通过内置类如ArrayList、LinkedList、Stack、Queue、HashSet、HashMap等实现基本数据结构。同时,Java提供丰富的工具类和接口,如Collections和Comparator,帮助我们操作和比较数据结构中的元素。...
本文对比了 LinkedList 和 ArrayList 的查询效率,从底层数据结构和 CPU 缓存两个方面进行了分析。首先,从底层数据结构方面,ArrayList 的查询效率高于 LinkedList,因为 ArrayList 底层数据结构是动态数组,可以...
Java提供了丰富的类库支持,如ArrayList、LinkedList、TreeSet等,这些都可以作为数据结构的基础,而其面向对象的特性使得实现复杂的算法结构更为简洁。 课后习题答案部分是学习过程中的重要参考资料,它可以帮助...
在实际编程中,Java提供了丰富的类库来支持数据结构的实现,如ArrayList、LinkedList、Stack、Queue等,这些都是基于内部的数据结构设计的。同时,对于高级数据结构如树和图,开发者可以通过自定义类或者使用已有的...
Java的集合框架(如ArrayList、LinkedList、HashMap等)为实现数据结构提供了便利。同时,Java的泛型、接口、封装等特性使得代码更加灵活和模块化。 4. **例题源代码**:压缩包中的源代码提供了实际操作的例子,...
数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储和处理数据,以及设计和评估解决问题的计算过程。在Java环境下,理解和掌握这些概念对于任何IT专业人士来说都是至关重要的。以下是对标题和描述中...
在Java中,这些数据结构可以通过内置类(如ArrayList、LinkedList、Stack、Queue等)或自定义类来实现。了解并熟练运用各种数据结构,可以帮助我们有效地解决复杂问题,优化程序性能。 算法则是解决问题的步骤描述...
大O复杂度分析是学习数据结构与算法的重要工具,它能够帮助开发者预估算法在执行过程中的时间和空间消耗,是评估算法优劣的关键。 总结来说,数据结构与算法并不仅仅是脱离实际工作的理论知识,它们是日常工作中不...
JAVA版的《数据结构》则可能强调Java平台特有的数据结构实现,如集合框架(Collection Framework),其中包括接口(如List、Set和Queue)和实现(如ArrayList、LinkedList、HashSet、TreeSet等)。Java的这些数据...
在Java实现部分,本书可能涵盖了如何在Java中创建和操作这些数据结构,包括类和接口的设计,如ArrayList、LinkedList、HashMap等内置数据结构的使用,以及如何自定义更复杂的数据结构。此外,可能还会涉及到Java的...
以下是基于标题“数据结构与算法-java”及描述中提到的“数据结构与算法分析_Java语言描述高清版(第2版)1.pdf”所涵盖的一些关键知识点: 1. **数据结构**: - **数组**:最基础的数据结构,存储固定大小的同类型...
在编程领域,数据结构与算法是核心基础,对于任何编程语言,包括Java,理解并熟练掌握它们至关重要。本文将深入探讨Java中的数据结构与算法,旨在帮助开发者提升问题解决能力和程序设计技巧。 首先,我们来看数据...
在Java中,集合框架提供了丰富的数据结构实现,如ArrayList和LinkedList对应数组和链表,Stack和Queue实现了栈和队列,TreeSet和HashMap实现了树和哈希表。理解这些类的内部工作原理对于优化代码至关重要。 总之,...