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
视频地址:(链接:https://pan.baidu.com/s/1Tci754eI52uFtt1_5s3keA 密码:4vgf)
下一章:android知识巩固(二.非线性数据结构)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352