JAVA采用数组结构实现一个线性表,可以增删改查,类似于ArrayList
2014-08-12 17:32
513 查看
工作中我们经常使用到集合框架,其中使用最多应该是ArrayList这个类,ArrayList采用的数据结构是数组,存储的元素有序但不唯一,查找效率高,但是增删没有LinkedList的效率高。
ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全
LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高
Vector: 底层用数组实现List接口的另一个类 特点:重量级,占据更多的系统开销 线程安全
下面写采用数组结构自定义一个类似于ArrayList的一个线性表,功能上实现增删改查。
package com.yes.list; import java.util.Arrays; /** * * @author yesong * @since2014-8-6 * * 采用数组结构实现一个线性表,可以增删改查 * */ public class SequenceList<T> { // 数组的默认长度 private int DEFAULT_SIZE = 16; // 记录数组的长度 private int capacity; // 记录元素个数 private int size; // 保存元素的数组 private Object[] elementData; public SequenceList() { capacity = DEFAULT_SIZE; elementData = new Object[capacity]; } public SequenceList(int initSize, T element) { capacity = 1; while (capacity < initSize) { capacity <<= 1; } elementData = new Object[capacity]; elementData[0] = element; size++; } public SequenceList(T element) { this(); elementData[0] = element; size++; } /** * 获取线性表元素个数 * * @return */ public int length() { return size; } /** * 向指定位置插入元素 * * @param position * @param element */ public void insert(int position, T element) { if (position < 0 || position > size) { throw new IndexOutOfBoundsException( "Index Out Of Bounds Exception..."); } ensureCapacity(size + 1); System.arraycopy(elementData, position, elementData, position + 1, size - position); elementData[position] = element; size++; } /** * 确保数组长度 * * @param minCapacity */ private void ensureCapacity(int minCapacity) { if (minCapacity > capacity) { while (capacity < minCapacity) { capacity <<= 1; } elementData = Arrays.copyOf(elementData, capacity); } } /** * 添加元素 在线性表的末尾 * * @param element */ public void add(T element) { insert(size, element); } /** * 删除指定位置的元素。 * * @param index */ public void deleteElement(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException( "Index Out Of Bounds Exception..."); } int removedCount = size - index - 1; if (removedCount > 0) { System.arraycopy(elementData, index + 1, elementData, index, size - index); } elementData[--size] = null; size--; } /** * 删除第一个元素 */ public void remove() { deleteElement(size - 1); } /** * 判断线性表是否为空 * * @return */ public boolean isEmpty() { return size == 0; } /** * 清除线性表 */ public void clear() { Arrays.fill(elementData, null); size = 0; } @Override public String toString() { if (size == 0) { return "[ ]"; } StringBuilder sb = new StringBuilder("["); for (int i = 0; i < size; i++) { sb.append(elementData[i].toString() + ","); } sb.append("]"); sb.deleteCharAt(sb.length() - 2); return sb.toString(); } public T getValue(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index Out Of Bounds Exception"); } return (T) elementData[index]; } }
这个SequenceList类可以当成一个工具类使用。下面我们来测试这个工具类
<pre name="code" class="java">package com.yes.list; public class TestSequenceList { /** * @param args */ public static void main(String[] args) { SequenceList<String> sequenceList = new SequenceList<String>(); sequenceList.add("test001"); sequenceList.add("test002"); sequenceList.add("test003"); sequenceList.add("test004"); System.out.println(sequenceList); sequenceList.insert(2, "yesongsong007"); System.out.println(sequenceList); //sequenceList.clear(); System.out.println(sequenceList.getValue(sequenceList.length() - 1)); } }
相关文章推荐
- 自己用C语言结构体实现一个数组结构(增删查改)
- 数据结构之数组的增删改查-java实现
- 用C语言写一个数组,实现类似JAVA语言中ArrayList的功能
- 自行实现ArrayList(底层结构数组)--Java版
- JAVA里实现一个数组全排列的方法
- Java-MyArrayList(数组线性表实现)
- Java之美[从菜鸟到高手演变]之数据结构基础、线性表、栈和队列、数组和字符串
- XP中java swing 在中文输入的时候总有一个输入窗口,非常难看,可以采用此种方法处理
- Java 有几程方法可以实现一个线程?用什么关键字修饰同步?stop()和suspend()为什么不推荐使用?
- 实现一个"可变二维数组",这个二维数组的行数要求用户从键盘输入,每行的元素个数仍由用户从键盘输入. //数组元素值用户可以自定义.最后把二维数组打印出来.不要忘记释放数组内存. /*void main
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 实现二叉树的层序遍历,说说Java中的队列结构(实现一个Java的队列)
- 【每天算法1】:用java 语言实现,输入一个数,就相应地输出的几维数组
- 编程实现一个栈结构,用数组来实现,具有入栈、出栈操作。
- java 实现重定义数组类似于VB的ReDim
- JAVA实现:给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里
- java基础问题----java中有几种方法可以实现一个线
- 马士兵 Java 第5章(1) 分别使用面向对象和面向结构(数组)的设计方法来实现“数三退一”
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 自己实现的一个寻径算法的框架,具体算法采用动态库模式,可以非常方便灵活地尝试多种寻径算法