android知识巩固(一.线性数据结构)
2020-05-12 本文已影响0人
只会敲代码的键盘手
数据结构(data structure):是计算机中存储,组织数据的方式
1.前言
数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下,数据结构往往同高效的检索算法和索引技术有关,精心选择的数据结构可以带来更高的运行或者存储效率
2.目录
目录.png3.数据结构
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
视频地址:(链接:https://pan.baidu.com/s/1Tci754eI52uFtt1_5s3keA 密码:4vgf)
下一章:android知识巩固(二.非线性数据结构)