一、ListMe接口:

import java.util.ArrayList;

//实现线性表(顺序表和链表)的接口:
//提供add get isEmpty size 功能
public interface ListMe<E> {
//返回线性表大小:线性表元素个数,非底层数组长度
public int size();

//添加元素,追加在线性表最后
public void add(E e);

//(方法重载)添加元素,追加在线性表的index下标位置(插入)
public void add(E e, int index);

//返回线性表index位置的元素
public E get(int index);

//判断线性表是否为空;(非数组长度而是线性表元素个数是否为0)
public boolean isEmpty();

//窥视底层数组长度变化
public void getElementData();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
二、ArrayLisMe实现:

import java.util.Arrays;

//线性顺序表的实现
public class ArrayListMe<E> implements ListMe<E>{
//创建存储线性表的数组
E[] elementData;

//创建线性顺序表的大小(元素个数初始化)
private int size;

//空参构造器,调用下面的构造器,默认设置5个初始化数组长度
public ArrayListMe(){
this(5);
}

//在构造器中创建数组对象,并根据给定值分配初始空间
public ArrayListMe(int length) {
this.elementData=(E[])new Object[length];
}

@Override
public int size() {
//返回元素个数
return size;
}
//动态更新线性表储存容量,即底层数组大小(增加原来数组长度的一半大小)
public void grow(){
if(size==elementData.length)
elementData=Arrays.copyOf(elementData,elementData.length+(elementData.length>>1));
}
@Override
public void add(E e) {
//判断是否需要动态增加长度
grow();
//添加在顺序线性表最后面
elementData[size++]=e;
}

@Override
public void add(E e, int index) {
//判断是否需要动态增加长度
grow();

//移动元素
for(int i=size;i>index;i--){
elementData[i]=elementData[i-1];
}

//添加元素
elementData[index]=e;
}

//判断是否指定index位置会造成下标越界(抛异常)
public void indexException(int index){
if(index<0 || index>=size)
throw new RuntimeException("顺序表越界");
}

@Override
public E get(int index) {

indexException(index);

return elementData[index];
}

@Override
public boolean isEmpty() {
//判断线性顺序表是否为空(无元素)
return size==0;
}

//显示线性顺序表所有元素
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");

for(int i=0;i<size;i++){
if(i!=size-1)
sb.append(elementData[i]+",");
else
sb.append(elementData[i]+"]");
}
return sb.toString();
}

public void getElementData(){
//窥视底层数组长度变化
System.out.println("底层数组长度:"+elementData.length);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
三、测试类:

public class TestArrayListMe {
//测试
public static void main(String s[]){
ListMe<Integer> listMe=new ArrayListMe<Integer>();

System.out.println(listMe.isEmpty());

listMe.add(0);
listMe.add(1);
listMe.add(2);
listMe.add(3);
listMe.add(4);

System.out.println(listMe.isEmpty());

listMe.get(4);

System.out.println("顺序表元素个数:"+listMe.size());

listMe.getElementData();

System.out.println(listMe.toString());

// listMe.get(5);

listMe.add(5);

System.out.println("顺序表元素个数:"+listMe.size());

listMe.getElementData(http://www.my516.com);

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

---------------------

数据结构之线性顺序表ArrayList(Java实现)的更多相关文章

  1. 【C语言--数据结构】线性顺序表

    线性表的本质: 1.线性表(List)是零个或者多个数据元素的集合: 2.线性表中的数据元素之间是有顺序的: 3.线性表中的数据元素个数是有限的: 4.线性表中的数据元素的类型必须相同: 定义: 线性 ...

  2. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  3. Java数据结构-线性表之顺序表ArrayList

    线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...

  4. (java实现)顺序表-ArrayList

    什么是顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 在使用顺序表存储数据前,会先申请一段连续的内存空间(即数组),然后把数组依次存入 ...

  5. 五种编程语言解释数据结构与算法——顺序表2(java与C++语言实现)

    5.java实现方式: 5.1.顺序表的抽象结构 package com.xgp.顺序表; public interface MyList<T> { //1. initList(& ...

  6. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  7. 三 模拟实现顺序表ArrayList

    /** * 顺序表,重点是数组动态扩容,插入 * 底层采用数组,长度可以动态变化,此处采用增长一倍 *  java.util.ArrayList每次增长50% *  int newCapacity = ...

  8. C++ 数据结构学习一(顺序表)

    //SequentialList.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; us ...

  9. C++数据结构学习之顺序表

    顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...

随机推荐

  1. 认识虚拟化(virtualization)

    0. 基本定义 虚拟化的本质是将现有的计算机资源通过虚拟化的技术分割成若干个计算机资源,这些计算机资源互相独立:其最终目标是提高计算机的利用效率以最大化计算机的灵活性: 虚拟化为数据.计算能力.存储资 ...

  2. 869C

    dp 我好像很zz... 想了好长好长时间,然后没想出来,怒掉rating... 其实我们可以吧三种颜色两两计算,因为这样加入第三种颜色不会影响之前的方案,那么我们跑一个dp,计算数量分别为a,b的方 ...

  3. SDK介绍

    软件开发工具包(外语首字母缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. ...

  4. 让padding不影响容器总长度

    增加CSS属性: box-sizing:border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box;

  5. 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记

    设计思路: (1)       一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2)       “10ms延迟模块”检测到H2L_Sig高电平, ...

  6. 5 分钟掌握 JS 实用窍门技巧,帮你快速撸码--- 删除数组尾部元素、E6对象解构、async/await、 操作平铺嵌套多维数组等

    1. 删除数组尾部元素 一个简单方法就是改变数组的length值: const arr = [11, 22, 33, 44, 55, 66]; arr.length = 3; console.log( ...

  7. python列表和元组的常用操作

    一.列表 需要安利一下:列表和字符串数是不一样的.进行操作时列表可以发生改变,而字符串不可以,所以直接在原来的对象上操作. 1.列表的增加 def append(self, p_object): # ...

  8. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  9. 转-iOS开发系列--地图与定位

    来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功 ...

  10. UML 用例图(转载)

    UML是系统架构设计师考试的一个重要考点,需要考生掌握.但是有些考生,在学习的过程中会有这样的疑问,在敏捷开发时代,UML还有没有必要去学习? UML还是有用的,主要用在设计和分析阶段,但是UML不适 ...