Android学习总结之数据结构篇

news2025/4/18 17:25:48

Java 的集合体系

Java 的集合框架主要分为两大接口体系:Collection 和 Map。以下是对这两大体系下常见集合类的介绍:

Collection 体系

Collection 是单列集合的根接口,它有三个主要的子接口:ListSet 和 Queue

  • List 接口:有序、可重复的集合。
    • ArrayList:基于动态数组实现,支持随机访问,查找速度快,但插入和删除操作效率较低。
    • LinkedList:基于双向链表实现,插入和删除操作效率高,但随机访问速度较慢。
    • Vector:线程安全的动态数组,与 ArrayList 类似,但由于使用了同步机制,性能相对较低。
  • Set 接口:无序、不可重复的集合。
    • HashSet:基于哈希表实现,不保证元素的顺序,插入、删除和查找操作的时间复杂度为 O (1)。
    • TreeSet:基于红黑树实现,元素按照自然顺序或指定的比较器顺序排序,插入、删除和查找操作的时间复杂度为 O (log n)。
    • LinkedHashSet:继承自 HashSet,同时使用链表维护元素的插入顺序。
  • Queue 接口:用于模拟队列数据结构,遵循先进先出(FIFO)原则。
    • LinkedList:除了实现 List 接口外,还实现了 Queue 接口,可以作为队列使用。
    • PriorityQueue:基于堆实现的优先队列,元素按照优先级排序,出队操作返回优先级最高的元素。
Map 体系

Map 是双列集合的根接口,用于存储键值对。

  • HashMap:基于哈希表实现,不保证键的顺序,插入、删除和查找操作的时间复杂度为 O (1)。
  • TreeMap:基于红黑树实现,键按照自然顺序或指定的比较器顺序排序,插入、删除和查找操作的时间复杂度为 O (log n)。
  • LinkedHashMap:继承自 HashMap,同时使用链表维护键的插入顺序。
  • Hashtable:线程安全的哈希表,与 HashMap 类似,但由于使用了同步机制,性能相对较低。

ArrayList 和 LinkedList 的区别

对比项ArrayListLinkedList
数据结构基于动态数组实现,数组是连续的内存空间。基于双向链表实现,链表由节点组成,每个节点包含数据和指向前一个节点和后一个节点的引用。
随机访问性能支持随机访问,通过索引可以直接访问数组中的元素,时间复杂度为 O (1)。不支持随机访问,需要从头节点或尾节点开始遍历链表,直到找到指定位置的元素,时间复杂度为 O (n)。
插入和删除性能在数组末尾插入和删除元素的效率较高,时间复杂度为 O (1);但在数组中间或开头插入和删除元素时,需要移动大量元素,时间复杂度为 O (n)。插入和删除元素的效率较高,只需要修改相邻节点的引用,时间复杂度为 O (1);但在指定位置插入和删除元素时,需要先遍历链表找到指定位置,时间复杂度为 O (n)。
内存占用由于数组是连续的内存空间,可能会存在一定的内存浪费,尤其是在数组扩容时。每个节点需要额外的引用字段来指向前一个节点和后一个节点,会占用更多的内存空间。
线程安全性都不是线程安全的集合类。如果需要在多线程环境下使用,可以使用 Collections.synchronizedList() 方法将它们转换为线程安全的集合。
适用场景适用于需要频繁随机访问元素,而插入和删除操作较少的场景。适用于需要频繁插入和删除元素,而随机访问操作较少的场景。

 

数组

数组是一种固定大小的数据结构,用来存储相同类型的元素。

// 创建数组
int[] arr = new int[5];
// 赋值
arr[0] = 1;
// 获取元素
int element = arr[0];
// 获取数组长度
int length = arr.length;

集合框架

1. List

List 是一个有序的集合,允许重复元素。常见的实现类有 ArrayList 和 LinkedList

import java.util.ArrayList;
import java.util.List;

// 创建 List
List<String> list = new ArrayList<>();
// 添加元素
list.add("apple");
// 在指定位置添加元素
list.add(1, "banana");
// 获取元素
String fruit = list.get(0);
// 获取元素位置
int index = list.indexOf("apple");
// 删除元素
list.remove(0);
// 获取列表大小
int size = list.size();
2. Set

Set 是一个不允许重复元素的集合。常见的实现类有 HashSetTreeSet

import java.util.HashSet;
import java.util.Set;

// 创建 Set
Set<String> set = new HashSet<>();
// 添加元素
set.add("apple");
// 判断元素是否存在
boolean contains = set.contains("apple");
// 删除元素
set.remove("apple");
// 获取集合大小
int size = set.size();
3. Map

Map 存储键值对,键是唯一的。常见的实现类有 HashMapTreeMap

import java.util.HashMap;
import java.util.Map;

// 创建 Map
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 1);
// 获取值
Integer value = map.get("apple");
// 判断键是否存在
boolean containsKey = map.containsKey("apple");
// 删除键值对
map.remove("apple");
// 获取键值对数量
int size = map.size();

栈和队列

1. 栈(Stack

栈是一种后进先出(LIFO)的数据结构。

import java.util.Stack;

// 创建栈
Stack<Integer> stack = new Stack<>();
// 入栈
stack.push(1);
// 出栈
int top = stack.pop();
// 查看栈顶元素
int peek = stack.peek();
// 判断栈是否为空
boolean empty = stack.isEmpty();
2. 队列(Queue

队列是一种先进先出(FIFO)的数据结构。常见的实现类有 LinkedList

import java.util.LinkedList;
import java.util.Queue;

// 创建队列
Queue<Integer> queue = new LinkedList<>();
// 入队
queue.offer(1);
// 出队
int front = queue.poll();
// 查看队首元素
int peek = queue.peek();
// 判断队列是否为空
boolean empty = queue.isEmpty();

优先级队列(PriorityQueue

PriorityQueue 是一个基于优先级堆的无界优先级队列。

import java.util.PriorityQueue;

// 创建优先级队列
PriorityQueue<Integer> pq = new PriorityQueue<>();
// 添加元素
pq.offer(3);
// 获取并移除队首元素
int min = pq.poll();
// 查看队首元素
int peek = pq.peek();
// 判断队列是否为空
boolean empty = pq.isEmpty();

这些就是 Java 中常见数据结构的常用方法,掌握它们能让你在实际编程中更高效地使用不同的数据结构。

MVC 与 MVVM 对比表格

对比项MVCMVVM
架构组成由 Model(处理数据和业务逻辑)、View(负责界面展示与交互)、Controller(连接 Model 和 View)构成。在 Android 里,Activity 常充当 Controller。由 Model(处理数据和业务逻辑)、View(负责界面展示与交互)、ViewModel(核心,解耦 View 和 Model,实现数据绑定)构成。
数据流向数据流向复杂,多向交互。用户操作从 View 到 Controller,Controller 调用 Model 处理数据,再更新 View,View 也可直接从 Model 获取数据。数据流向清晰,存在单向或双向数据流。ViewModel 通过数据绑定更新 View,View 变化反馈给 ViewModel 再到 Model。
耦合度View 和 Controller 耦合度高,Activity 代码臃肿,包含大量视图操作和业务逻辑,View 和 Model 也存在一定耦合。通过 ViewModel 实现 View 和 Model 解耦,View 仅关注展示,Model 专注数据处理,降低代码耦合。
可测试性因 View 和 Controller 耦合高,单元测试 Controller 时需模拟 View 行为,测试难度大,View 中业务逻辑也使测试复杂。ViewModel 与 View 解耦,单元测试 ViewModel 时可方便模拟 Model 数据和行为,不依赖 View,测试效率和准确性高。
适用场景适用于小型项目或对架构要求不高的项目,结构简单,易理解实现,利于项目初期快速搭建框架。适合大型项目或对代码可维护性、可测试性要求高的项目,能提高开发效率,降低维护成本,适合使用数据绑定技术的场景。

总结语句

MVC 和 MVVM 作为两种常见的软件设计模式,都旨在分离视图和业务逻辑。MVC 结构简单但耦合度高、数据流向复杂,在小型项目搭建上有优势;而 MVVM 通过 ViewModel 实现解耦,数据流向清晰,可测试性强,更契合大型项目及对代码质量要求高的开发场景。在实际开发中,需依据项目规模、复杂度和团队技术水平等因素合理选用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

辛格迪客户案例 | 北京舒曼德医药实施电子合约系统(eSign)

01 北京舒曼德医药科技开发有限公司&#xff1a;医药科技的数字化先锋 北京舒曼德医药科技开发有限公司&#xff08;以下简称“舒曼德医药”&#xff09;作为国内医药科技领域的领军企业&#xff0c;致力于创新药物的研发、临床试验和市场推广。公司以“科技兴药、质量为先、服…

Python面向对象-开闭原则(OCP)

1. 什么是开闭原则&#xff1f; 开闭原则(Open-Closed Principle, OCP) 是面向对象设计的五大SOLID原则之一&#xff0c;由Bertrand Meyer提出。其核心定义是&#xff1a; “软件实体(类、模块、函数等)应该对扩展开放&#xff0c;对修改关闭。” 对扩展开放&#xff1a;当需求…

Class 文件和类加载机制

一、Class 文件 与 类加载机制 概述 什么是 Class 文件&#xff1f; Java 源码&#xff08;.java&#xff09;经过 javac 编译器 编译生成的字节码文件&#xff08;.class&#xff09;&#xff1b;由 JVM 识别执行&#xff0c;包含类的完整结构信息&#xff08;如字段、方法、…

Vue3+Vite+TypeScript+Element Plus开发-07.Mockjs引用与Axios封装

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 Header响应式菜单缩展 Mockjs引用与Axios封装 登录设计 登录成功跳转主页 多用户动态加载菜单 Pinia持久化 动态路由-配置 文章目录 目录 系列文档目…

【Redis】背景知识

一、Redis的特性 Redis是一种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis中的值可以是由string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xf…

航电系统的任务载荷集成技术要点概述!

一、任务载荷集成技术难点 1. 接口标准化与兼容性 异构设备协议冲突&#xff1a;不同厂商的载荷设备&#xff08;如光学相机、雷达、电子战模块&#xff09;采用不同的通信协议&#xff08;如1553B、RS422、以太网&#xff09;&#xff0c;需设计统一的总线接口标准以支持即…

OceanBase V4.3.5 上线全文索引功能,让数据检索更高效

近日&#xff0c;OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试&#xff0c;OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…

Qt中的信号与槽及其自定义

信号源&#xff1a;哪个控件发的信号 信号的类型&#xff1a;用户进行不同的操作就会触发不同的信号 如点击按钮&#xff0c;在输入框移动光标&#xff0c;勾选一个复选框&#xff0c;选 择一个下拉框 信号的处理方式&#xff1a;槽(slot)----也就是函数&#xff0c;Qt中用con…

【PFPGA学习】状态机思想编程HDLbitsFPGA练习

目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 &#xff14;. 选型建议 三、HDLbitsFPGA练习记录&#xff08;combinational logic…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

Python从入门到精通全套视频教程免费

概述 &#x1f4e2; 所有想学Python的小伙伴看过来&#xff01;作为深耕编程领域的技术分享者&#xff0c;最新整理了一份Python从0到1的视频教程。 &#x1f4a1;亮点 ✅ 保姆级系统路线&#xff1a;从环境搭建、语法精讲&#xff0c;到爬虫/数据分析/AI/Web全栈开发&#…

蓝桥杯:对字符串处理常用知识笔记

一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码&#xff08;常用&#xff09; #include <iostream> #in…

实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js

文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中&#xff0c;Mark…

帆软fvs文件中某表格新增数据来声提醒

1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件&#xff08;如 mp3 格式&#xff09;&#xff0c;并将其放置在合适的目录。 例如&#xff1a;%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」&#xff0c;输入以下 JavaScript …

从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人

前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…

$_POST 超级全局变量

$_POST 是一个超级全局变量&#xff0c;在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同&#xff0c;$_POST 允许发送大量数据&#xff0c;且数据不会显示在 URL 中&#xff0c;因此更适用于提交敏感信息&#xff0c;如用户登录信息、表单数据等。 使…

开发一个环保回收小程序需要哪些功能?环保回收小程序

废品分类展示与识别 详细分类列表&#xff1a;清晰展示常见废品类型&#xff0c;如废纸&#xff08;报纸、书本纸、包装纸等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金属&#xff08;易拉罐、铁制品、铜制品等&#xff09;、玻璃&#xff0…

Debezium嵌入式连接postgresql封装服务

文章目录 1.项目结构&#xff1a;2.依赖&#xff1a;3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口&#xff08;表处理抽象&#xff09;7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…

Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南

在电商采购和供应链管理中&#xff0c;了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台&#xff0c;提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口&#xff0c;开发者可以获取工厂的详细信息&#xff0c;包括工厂名称、地址、联系方…

Rust所有权详解

文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理&#xff0c;手动申请和释放&#xff0c;即便有了智能指针&#xff0c;对于效率的影…