`
廖明华
  • 浏览: 7960 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ArrayList数据结构的分析

    博客分类:
  • Java
 
阅读更多
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数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    ArrayList数据批量添加数据

    ### ArrayList数据批量添加数据 #### 知识点概述 在.NET框架中,`ArrayList`类是一种动态数组,用于存储不同类型的数据。本篇文章将详细介绍如何利用`ArrayList`进行数据的批量添加,并通过一个示例来展示如何在一...

    数据结构与算法分析(java语言描述)中文第二版以及习题答案

    在Java中,可以使用内置的数据结构如ArrayList、LinkedList、HashMap等,同时也可以自定义数据结构以满足特定需求。《数据结构与算法分析》将深入讲解这些概念,如何选择合适的数据结构,以及它们的实现和操作。 2....

    从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低.docx

    本文对比了 LinkedList 和 ArrayList 的查询效率,从底层数据结构和 CPU 缓存两个方面进行了分析。首先,从底层数据结构方面,ArrayList 的查询效率高于 LinkedList,因为 ArrayList 底层数据结构是动态数组,可以...

    数据结构与算法分析Java3rd英文_数据结构与算法分析_

    数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储和处理数据,以及设计和评估解决问题的计算过程。在Java环境下,理解和掌握这些概念对于任何IT专业人士来说都是至关重要的。以下是对标题和描述中...

    数据结构与算法之美

    大O复杂度分析是学习数据结构与算法的重要工具,它能够帮助开发者预估算法在执行过程中的时间和空间消耗,是评估算法优劣的关键。 总结来说,数据结构与算法并不仅仅是脱离实际工作的理论知识,它们是日常工作中不...

    免费:数据结构(c与c++与java三本书高清晰版).rar

    JAVA版的《数据结构》则可能强调Java平台特有的数据结构实现,如集合框架(Collection Framework),其中包括接口(如List、Set和Queue)和实现(如ArrayList、LinkedList、HashSet、TreeSet等)。Java的这些数据...

    ArrayList源码分析

    ### ArrayList源码分析 #### 一、概述 `ArrayList` 是 Java 集合框架中的一个重要的类,它实现了 `List` 接口,并且内部使用动态数组来存储元素。由于其灵活的特性(比如可以方便地增加或删除元素),`ArrayList` ...

    Java 常用数据结构分析

    以下是对这些数据结构及其在Java中的具体实现的详细分析: 1. **线性表**: - **ArrayList**: 作为线性表的一种实现,ArrayList是一个动态数组,它允许快速的随机访问(O(1)时间复杂度)。通过索引可以快速获取...

    数据结构(java版本)

    图数据结构则用于表示对象之间的复杂关系,如邻接矩阵和邻接表,它们在路径查找、网络流问题和社交网络分析等领域大显身手。 此外,哈希表(HashMap)和集合(Set)也是书中重要的章节。哈希表通过哈希函数快速定位...

    数据结构与算法分析_Java语言及示例.rar

    Java提供了丰富的类库支持,如ArrayList、LinkedList、Stack、Queue等,可以直接用来实现各种数据结构,同时,Java的面向对象特性使得算法的封装和复用变得简单。 “数据结构与算法分析_Java语言及示例”不仅会讲解...

    邓俊辉版java 数据结构源码

    在学习过程中,建议结合教材的理论部分,逐步分析和调试源码,加深对数据结构和算法的理解。同时,实践是检验理解的最佳途径,可以尝试修改和扩展源码,实现自己的数据结构,以此提升编程技能。

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...

    数据结构java版(第2版)

    在Java中,`java.util`包提供了许多内置数据结构类,如ArrayList、LinkedList、Stack、Queue等,这些可以直接使用,但理解它们的底层实现原理对于优化代码性能至关重要。例如,ArrayList基于动态数组实现,适合随机...

    数据结构(java版) 刘小晶

    在学习过程中,学生还需要掌握Java集合框架,这是Java标准库提供的用于创建和管理各种数据结构的工具,包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、TreeSet、ArrayDeque、PriorityQueue和...

    Java算法题,数据结构分析和实现.zip

    在本压缩包“Java算法题,数据结构分析和实现.zip”中,主要涵盖了与数据结构、算法以及编程语言(如Java、C/C++、Python)相关的学习资源,特别适合大学生和编程初学者深入理解这些核心概念。以下是这些知识点的...

    Java数据结构课件

    此外,课件可能还会涵盖数据结构在Java集合框架中的应用,如ArrayList、LinkedList、HashSet、HashMap等的内部实现原理,以及如何根据实际需求选择合适的数据结构。理解并熟练掌握这些内容对于提升编程能力、解决...

Global site tag (gtag.js) - Google Analytics