android知识巩固(一.线性数据结构)

数据结构(data structure):是计算机中存储,组织数据的方式

1.前言

数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下,数据结构往往同高效的检索算法和索引技术有关,精心选择的数据结构可以带来更高的运行或者存储效率

2.目录

目录.png

3.数据结构

3.1.数组

3.1.1.描述

数组(Array)是一种复合型数据类型,由一系列相同的元素(Element)组成

3.1.2.特性

  • 数组分为基本类型数据和引用类型数组
  • 由连续的内存空间存储,查找可直接通过索引定位,效率高,增删会涉及到数组的复制,效率较低

3.1.3.示例代码

//创建数组的三种方式(可存储基本数据类型和对象类型)
//静态方式创建1
int[] array1 = {1,2,3};
//静态方式创建2
int[] array2 = new int[]{1,2,3};
//动态创建
int[] arrayValue3 = new int[5];
Integer[] arrayObject3 = new Integer[5];
System.out.println("基本数据类型数组arrayValue3:" + Arrays.toString(arrayValue3));
System.out.println("对象类型数组arrayObject3:" + Arrays.toString(arrayObject3));
System.out.println("原始的数组array1:" + Arrays.toString(array1));

//优势
//修改,赋值
array1[1] = 4;
//取值 超出长度时会报数组下标越界异常
int a1 = array1[1];
System.out.println("修改后的数组array1:" + Arrays.toString(array1));

//劣势:删除时需数组的copy,且易产生碎片
//删除(删除索引为1的数据)
//创建新数组存储数据
int[] array4 = new int[array1.length - 1];
for (int i = 0; i < array4.length; i++) {
    if (i < 1) {
        array4[i] = array1[I];
    } else {
        array4[i] = array1[i + 1];
    }
}
array1 = array4;
System.out.println("删除索引为1的数据后的数组array1:" + Arrays.toString(array1));
//插入(在索引1处插入数据5) 扩容时需数组复制
//数组容量固定的话需创建新数组扩容接受
int[] array5 = new int[array1.length + 1];
for (int i = 0; i < array5.length; i++) {
    if (i < 1) {
        array5[i] = array1[I];
    } else if (i == 1) {
        array5[i] = 5;
    } else {
        array5[i] = array1[i - 1];
    }
}
array1 = array5;
System.out.println("在索引为1的数据后的数组array1:" + Arrays.toString(array1));

3.1.4.运行结果

基本数据类型数组arrayValue3:[0, 0, 0, 0, 0]
对象类型数组arrayObject3:[null, null, null, null, null]
原始的数组array1:[1, 2, 3]
修改后的数组array1:[1, 4, 3]
删除索引为1的数据后的数组array1:[1, 3]
在索引为1的数据后的数组array1:[1, 5, 3]

3.1.5.可变数组集合(ArrayList)

封装了数组插入和删除 在扩容和复制进行了优化

//可变数组的集合(具体底层原理在后续分析)
//创建 只能存储对象内类
ArrayList<Integer> arrayList = new ArrayList();
//添加基本数据类型时会自动装箱(Integer i= 1)
//手动装箱(Integer i = Integer.valueOf(1))
//add时会涉及到数组的扩容 复制
arrayList.add(1);
arrayList.add(1);
//索引删除(删除是也会涉及数组的复制)
arrayList.remove(1);
Integer integer = 1;
//对应值删除(删除可能存在歧义,不知删除对应值还是索引位置)
//删除时会对应类型的equals方法
arrayList.remove(integer);
//超出长度时会报数组下标越界异常
Integer integer1 = arrayList.get(0);
3.2.栈

3.2.1.描述

栈(stack):只能在栈顶进行插入移除的线性表

3.2.2.特性

  • 按照先进后出的原则存储数据
  • 存取速度快,但缺乏灵活性

3.2.3.示例代码

//创建栈 先进后出
Stack<Integer> stack = new Stack<>();
//判断栈是否为空
boolean empty = stack.empty();
//往栈中插入数据(插入的新数据位于栈顶部)
Integer push = stack.push(1);
//获取栈顶部元素 为empty报EmptyStackException
Integer peek = stack.peek();
//获取栈顶部元素 且从堆栈中移除 为empty报EmptyStackException
Integer pop = stack.pop();
System.out.println(stack);
//获取元素在栈中的位置 不同于其它索引 需从1开始 没有返回-1
int search = stack.search(1);
3.3.队列

3.3.1.描述

队列(Queue):只能在队尾添加,队头删除的线性表

3.3.2.特性

  • 遵循先进先出的原则存储数据
  • 可有数组和链表实现,数组实现时,队满可以选择丢弃或者等待策略

3.3.3.示例代码

//创建队列(LinkedList实现了Queue,拥有queue的特性)
//特性:先进先出
Queue<Integer> queue = new LinkedList<>();
//进队 往队尾插入
queue.offer(1);
//获取队头元素 不可为empty(empty NoSuchElementException)
Integer element = queue.element();
//获取队头元素 可以empty(empty返回null)
Integer peek = queue.peek();
//获取队头元素 并删除(empty返回null)
Integer poll = queue.poll();
//获取队头元素 并删除(empty NoSuchElementException)
Integer remove = queue.remove();
3.4.链表

3.4.1.描述

链表(LikedList):由结点和指针引用组成的递归数据结构

3.4.2.特性

  • 可由不连续的内存空间存储,创建时无需指定长度
  • 元素由数据和指针组成,指针指向下一个数据的地址,形成链表
  • 增删可操作指针效率较高,查询需遍历遍历效率较低

3.4.3.示例代码

//创建链表(通过指针连接实现,原理后面分析)
LinkedList<Integer> linkedList = new LinkedList<>();
//在链表尾部插入数据 成功插入返回true
boolean add = linkedList.add(1);
//获取位置0处的节点值 越界IndexOutOfBoundsException
//查找时会根据下标判断是从头结点还是尾结点遍历
Integer integer = linkedList.get(0);
//获取头结点的值 empty则NoSuchElementException
Integer first = linkedList.getFirst();
//获取尾结点的值 empty则NoSuchElementException
Integer last = linkedList.getLast();
//移除第一个结点 越界IndexOutOfBoundsException 返回结点值
Integer remove = linkedList.remove(0);
//对应值的结点删除(删除可能存在歧义,不知删除对应值还是索引位置)
//删除时会对应类型的equals方法 不存在返回false
boolean remove1 = linkedList.remove(new Integer(1));

4.总结

本节主要讲述了android中基本数据结构,涉及一些基本的概念,特性和简单的使用;下节我们将继续学习一些非线性的数据结构,包括树,图,映射表,后续也会讲述常用数据结构的底层实现,方便我们学习和工作中使用自如,得心应手


代码地址:github
下一章:android知识巩固(二.非线性数据结构)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值