当前位置: 首页 > news >正文

Android学习总结之设计场景题

设计图片请求框架的缓存模块

核心目标是通过分层缓存策略(内存缓存 + 磁盘缓存)提升图片加载效率,同时兼顾内存占用和存储性能。以下是针对 Android 面试官的回答思路,结合代码注释说明关键设计点:

一、缓存架构设计:分层缓存策略

采用内存缓存(LRU)+ 磁盘缓存(持久化)+ 网络兜底的三级架构,优先从内存快速获取,其次从磁盘读取,最后网络加载,减少重复请求和资源消耗。

二、内存缓存设计(LruCache)

核心作用:利用内存快速访问特性,缓存近期使用的图片,避免重复解码 Bitmap。
实现要点

  1. 使用 Android 内置的LruCache(或 Kotlin 的LinkedHashMap手动实现 LRU),根据内存大小动态设置缓存上限(通常为应用可用内存的 1/8)。
  2. 以图片 URL 的 MD5 值作为 Key,确保唯一性;Value 存储解码后的Bitmap
  3. 结合onTrimMemory()回调,在系统内存紧张时主动释放内存缓存。
代码示例(带注释)
public class MemoryCache {private LruCache<String, Bitmap> lruCache;public MemoryCache(Context context) {// 计算内存缓存上限:取应用可用内存的1/8(避免OOM)int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);int cacheSize = maxMemory / 8;lruCache = new LruCache<String, Bitmap>(cacheSize) {// 重写尺寸计算(Bitmap的内存占用以像素数衡量:width * height * bytePerPixel)@Overrideprotected int sizeOf(String key, Bitmap value) {return value.getByteCount() / 1024; // 单位KB}};}// 存入内存缓存(主线程调用需注意同步,但LruCache本身线程安全)public void put(String url, Bitmap bitmap) {if (get(url) == null) { // 避免重复存储lruCache.put(hashKeyForUrl(url), bitmap);}}// 获取内存缓存public Bitmap get(String url) {return lruCache.get(hashKeyForUrl(url));}// 清理缓存(在Activity/Fragment销毁时调用,避免内存泄漏)public void clear() {if (!lruCache.isEmpty()) {lruCache.evictAll(); // 清空所有缓存}}// URL转MD5,确保Key唯一且合法(避免特殊字符导致的问题)private String hashKeyForUrl(String url) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] hashBytes = md.digest(url.getBytes());// 转换为16进制字符串StringBuilder hexString = new StringBuilder();for (byte b : hashBytes) {String hex = String.format("%02X", b);hexString.append(hex.toLowerCase());}return hexString.toString();} catch (Exception e) {return String.valueOf(url.hashCode()); // 异常时用hashCode兜底}}
}

三、磁盘缓存设计(DiskLruCache)

核心作用:持久化存储图片文件,避免重复下载,同时减轻内存压力。
实现要点

  1. 使用 Android 推荐的DiskLruCache(需处理 Android 10 + 的分区存储适配),按文件大小或时间实现 LRU 淘汰。
  2. 缓存路径建议放在应用私有目录(如Context.getCacheDir()),避免用户删除或权限问题。
  3. 异步处理磁盘 IO(如使用ExecutorService),避免阻塞主线程。
  4. 支持缓存有效期(如 7 天),定期清理过期文件。
代码示例(带注释)
public class DiskCache {private static final int MAX_DISK_CACHE_SIZE = 50 * 1024 * 1024; // 50MBprivate static final int APP_VERSION = 1; // 版本号变更时清空缓存private static final String DISK_CACHE_SUBDIR = "image_cache"; // 子目录名称private DiskLruCache diskLruCache;private ExecutorService diskExecutor;public DiskCache(Context context) {diskExecutor = Executors.newSingleThreadExecutor(); // 单线程保证磁盘操作有序File cacheDir = new File(context.getCacheDir(), DISK_CACHE_SUBDIR);try {diskLruCache = DiskLruCache.open(cacheDir, APP_VERSION, 1, MAX_DISK_CACHE_SIZE);} catch (IOException e) {e.printStackTrace();}}// 异步写入磁盘缓存(在子线程调用)public void asyncPut(String url, byte[] data) {diskExecutor.execute(() -> {String key = hashKeyForUrl(url);try (DiskLruCache.Editor editor = diskLruCache.edit(key)) {if (editor != null) {OutputStream outputStream = editor.newOutputStream(0);outputStream.write(data);editor.commit(); // 提交写入}} catch (IOException e) {e.printStackTrace();try {if (editor != null) {editor.abort(); // 失败时回滚}} catch (IOException ex) {ex.printStackTrace();}}});}// 同步读取磁盘缓存(建议在子线程调用,避免ANR)public byte[] get(String url) {String key = hashKeyForUrl(url);try (DiskLruCache.Snapshot snapshot = diskLruCache.get(key)) {if (snapshot != null) {InputStream inputStream = snapshot.getInputStream(0);return inputStreamToByteArray(inputStream); // 转换为字节数组}} catch (IOException e) {e.printStackTrace();}return null;}// 清理过期缓存(可结合定时任务或开机广播触发)public void cleanExpiredCache(long expirationMillis) {diskExecutor.execute(() -> {File cacheDir = diskLruCache.getDirectory();for (File file : cacheDir.listFiles()) {if (System.currentTimeMillis() - file.lastModified() > expirationMillis) {file.delete(); // 删除超过有效期的文件}}try {diskLruCache.trimToSize(MAX_DISK_CACHE_SIZE); // 按大小LRU淘汰} catch (IOException e) {e.printStackTrace();}});}// 输入流转字节数组(工具方法)private byte[] inputStreamToByteArray(InputStream is) throws IOException {ByteArrayOutputStream os = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}return os.toByteArray();}
}

四、缓存协同逻辑

  1. 获取图片流程

    • 先查内存缓存,存在则直接使用(无需解码,最快)。
    • 内存无缓存则查磁盘缓存,存在则解码为 Bitmap 并存入内存(下次直接读内存)。
    • 磁盘无缓存则发起网络请求,下载后同时写入磁盘和内存。
  2. 内存与磁盘的一致性

    • 磁盘缓存写入完成后,再更新内存缓存,避免内存与磁盘数据不一致。
    • 图片尺寸适配:根据 ImageView 的目标尺寸(width/height)缓存对应尺寸的图片,避免内存浪费(如存储 1080p 图片到仅需 200x200 的 View)。

五、面试官高频问题补充

  1. 为什么选择 LruCache 而不是 HashMap?
    LruCache 内置 LRU 淘汰算法,自动管理内存释放,避免 OOM;HashMap 需手动实现淘汰逻辑,容易导致内存泄漏。

  2. 磁盘缓存为什么用 DiskLruCache 而不是直接写文件?
    DiskLruCache 封装了文件 IO 的原子性操作(如写入失败时回滚)、LRU 淘汰策略、版本管理(版本号变更时清空缓存),比手动管理文件更可靠。

  3. 如何处理缓存穿透和缓存击穿?

    • 缓存穿透(请求不存在的 Key):对无效 Key 进行短期内存缓存(如缓存空结果 1 分钟)。
    • 缓存击穿(热点 Key 失效):加分布式锁(或本地锁),确保同一 Key 的网络请求仅发起一次。
  4. Android 10 + 分区存储对磁盘缓存的影响?
    缓存路径必须使用应用私有目录(如getCacheDir()),避免使用外部存储公共目录(需申请权限且可能被用户清理)。

ScrollView里面嵌套两个高度都为两个屏幕RecycleView

整体思路阐述

当 ScrollView 嵌套两个高度为两个屏幕的 RecyclerView 时,要实现特定的 ACTION_MOVE 事件处理逻辑,也就是让 MOVE 事件先由 RecyclerView1 处理,等 RecyclerView1 滚动到底部后将事件交给 ScrollView 处理,待 RecyclerView2 完全展示在屏幕上时再把事件交给 RecyclerView2 处理,关键在于重写 ScrollView 的 onInterceptTouchEvent 方法来精确控制事件的拦截与分发。同时,需要编写方法来判断 RecyclerView 是否滚动到底部以及是否完全显示在屏幕上。

代码实现:

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
import androidx.recyclerview.widget.RecyclerView;// 自定义 ScrollView 类,用于处理嵌套 RecyclerView 的触摸事件
public class CustomScrollView extends ScrollView {// 声明两个 RecyclerView 成员变量private RecyclerView recyclerView1;private RecyclerView recyclerView2;// 构造函数,用于在代码中创建 CustomScrollView 实例public CustomScrollView(Context context) {super(context);}// 构造函数,用于在 XML 布局中使用 CustomScrollViewpublic CustomScrollView(Context context, AttributeSet attrs) {super(context, attrs);}// 构造函数,带有默认样式属性public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}// 设置关联的两个 RecyclerViewpublic void setRecyclerViews(RecyclerView recyclerView1, RecyclerView recyclerView2) {this.recyclerView1 = recyclerView1;this.recyclerView2 = recyclerView2;}// 重写 onInterceptTouchEvent 方法,用于拦截触摸事件@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// 确保两个 RecyclerView 已经被正确设置if (recyclerView1 != null && recyclerView2 != null) {// 根据触摸事件的动作类型进行处理switch (ev.getAction()) {case MotionEvent.ACTION_MOVE:// 判断 RecyclerView1 是否滚动到底部if (!isRecyclerViewAtBottom(recyclerView1)) {// 如果 RecyclerView1 未滚动到底部,不拦截事件,让 RecyclerView1 处理return false;}// 判断 RecyclerView2 是否完全显示在屏幕上if (!isRecyclerViewFullyVisible(recyclerView2)) {// 如果 RecyclerView2 未完全显示,拦截事件,由 ScrollView 处理return true;}break;}}// 其他情况,调用父类的 onInterceptTouchEvent 方法return super.onInterceptTouchEvent(ev);}// 判断 RecyclerView 是否滚动到底部的方法private boolean isRecyclerViewAtBottom(RecyclerView recyclerView) {// 检查 RecyclerView 的适配器是否为空if (recyclerView.getAdapter() == null) {return false;}// 获取 RecyclerView 的 LayoutManagerRecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();// 检查 LayoutManager 是否为空if (layoutManager == null) {return false;}// 获取最后一个可见项的位置int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();// 判断最后一个可见项是否是列表中的最后一项return lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1;}// 判断 RecyclerView 是否完全显示在屏幕上的方法private boolean isRecyclerViewFullyVisible(RecyclerView recyclerView) {// 检查 RecyclerView 的适配器是否为空if (recyclerView.getAdapter() == null) {return false;}// 获取 RecyclerView 的 LayoutManagerRecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();// 检查 LayoutManager 是否为空if (layoutManager == null) {return false;}// 获取第一个可见项的位置int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();// 获取最后一个可见项的位置int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();// 判断第一个可见项是否是列表中的第一项,且最后一个可见项是否是列表中的最后一项return firstVisibleItemPosition == 0 && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1;}
}    
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;// 主 Activity 类
public class MainActivity extends AppCompatActivity {// 声明 CustomScrollView 和两个 RecyclerView 成员变量private CustomScrollView customScrollView;private RecyclerView recyclerView1;private RecyclerView recyclerView2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置布局文件setContentView(R.layout.activity_main);// 从布局文件中获取 CustomScrollView 和两个 RecyclerView 的实例customScrollView = findViewById(R.id.customScrollView);recyclerView1 = findViewById(R.id.recyclerView1);recyclerView2 = findViewById(R.id.recyclerView2);// 为 RecyclerView1 设置线性布局管理器recyclerView1.setLayoutManager(new LinearLayoutManager(this));// 为 RecyclerView2 设置线性布局管理器recyclerView2.setLayoutManager(new LinearLayoutManager(this));// 为 RecyclerView1 设置适配器,并传入模拟数据recyclerView1.setAdapter(new MyAdapter(createDummyData()));// 为 RecyclerView2 设置适配器,并传入模拟数据recyclerView2.setAdapter(new MyAdapter(createDummyData()));// 将两个 RecyclerView 关联到 CustomScrollView 中customScrollView.setRecyclerViews(recyclerView1, recyclerView2);}// 创建模拟数据的方法private List<String> createDummyData() {// 创建一个字符串列表来存储模拟数据List<String> data = new ArrayList<>();// 循环添加 50 条模拟数据for (int i = 0; i < 50; i++) {data.add("Item " + i);}return data;}
}    

 

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;// RecyclerView 的适配器类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {// 存储要显示的数据列表private List<String> data;// 构造函数,传入数据列表public MyAdapter(List<String> data) {this.data = data;}// 创建 ViewHolder 实例@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 从布局文件中加载单个列表项的视图View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);// 创建 ViewHolder 实例并传入视图return new ViewHolder(view);}// 绑定数据到 ViewHolder@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {// 将指定位置的数据设置到 TextView 中holder.textView.setText(data.get(position));}// 获取数据列表的大小@Overridepublic int getItemCount() {return data.size();}// ViewHolder 类,用于缓存视图组件public static class ViewHolder extends RecyclerView.ViewHolder {// 声明 TextView 成员变量TextView textView;// 构造函数,传入视图public ViewHolder(@NonNull View itemView) {super(itemView);// 从视图中获取 TextView 实例textView = itemView.findViewById(android.R.id.text1);}}
}    

代码调用逻辑说明

  1. 初始化阶段:在 MainActivity 的 onCreate 方法中,首先通过 setContentView 设置布局文件,然后从布局文件中获取 CustomScrollView 和两个 RecyclerView 的实例。接着为两个 RecyclerView 设置 LinearLayoutManager 和 MyAdapter,并调用 customScrollView.setRecyclerViews 方法将两个 RecyclerView 关联到 CustomScrollView 中。
  2. 触摸事件处理阶段:当用户进行触摸操作时,触摸事件会先传递到 CustomScrollView 的 onInterceptTouchEvent 方法。在该方法中,会根据 RecyclerView1 是否滚动到底部以及 RecyclerView2 是否完全显示在屏幕上的情况来决定是否拦截事件。如果 RecyclerView1 未滚动到底部,不拦截事件,让 RecyclerView1 处理;如果 RecyclerView2 未完全显示,拦截事件,由 CustomScrollView 处理;其他情况则调用父类的 onInterceptTouchEvent 方法。

相关文章:

Android学习总结之设计场景题

设计图片请求框架的缓存模块 核心目标是通过分层缓存策略&#xff08;内存缓存 磁盘缓存&#xff09;提升图片加载效率&#xff0c;同时兼顾内存占用和存储性能。以下是针对 Android 面试官的回答思路&#xff0c;结合代码注释说明关键设计点&#xff1a; 一、缓存架构设计&…...

【数学建模国奖速成系列】优秀论文绘图复现代码(四)

文章目录 引言三维图双轴图三维散点图完整复现代码 引言 数模比赛的绘图是非常重要得&#xff0c;这篇文章给大家分享我自己复现国奖优秀论文的代码&#xff0c;基于Matalab来实现&#xff0c;可以直接运行出图。之前的文章也有分享【折线图、柱状图、箱线图、热图】的绘制&am…...

哪些因素会影响远程视频监控的质量?浅述EasyCVR视频智能诊断技术

在安防领域&#xff0c;无线监控系统凭借其灵活部署、便捷扩展的特性得到广泛应用。然而&#xff0c;实时监控图像清晰度不足、回放调查受限等问题&#xff0c;严重制约了其应用效果。经分析&#xff0c;摄像机性能、线缆质量、无线网桥性能、交换机配置及供电电压等是影响图像…...

Android学习总结之算法篇六(数组和栈)

括号匹配 public static boolean isValid(String s) {// 创建一个栈用于存储左括号Stack<Character> stack new Stack<>();// 遍历字符串中的每个字符for (char c : s.toCharArray()) {if (c ( || c [ || c {) {// 如果是左括号&#xff0c;将其压入栈中stack…...

一套SaaS ERP管理系统源码,支持项目二开商用,SpringBoot+Vue+ElementUI+UniAPP

ERP管理系统源码&#xff0c;一款适用于小微企业的SaaS ERP管理系统源码, 采用最新的技术栈开发(SpringBootVueElementUIUniAPP)&#xff0c;让企业简单上云。 专注于小微企业的应用需求&#xff0c;如企业基本的进销存、询价&#xff0c;报价, 采购、销售、MRP生产制造、品质…...

【Agent】MCP协议 | 用高德MCP Server制作旅游攻略

note MCP (Model Context Protocol) 代表了 AI 与外部工具和数据交互的标准建立。MCP 的本质&#xff1a;它是一个统一的协议标准&#xff0c;使 AI 模型能够以一致的方式连接各种数据源和工具&#xff0c;类似于 AI 世界的"USB-C"接口。 它能够在 LLM/AI Agent 与外…...

ISO 26262认证步骤

一、企业需要做&#xff1f; 从 ISO 26262 标准导入到认证大概需要经历7 个主要的阶段&#xff0c; 分别是策划阶段、 流程建立阶段、 流程试运行阶段、 流程认证阶段、 流程推广阶段、 产品认证阶段和持续运行阶段。 策划阶段&#xff1a;精准布局差距分析&#xff1a;对照 I…...

php+mysql活动报名学生选课产品预定旅游报名系统网站源码

本系统是一个基于PHPMySQL的活动报名管理系统&#xff0c;支持多个活动的发布、报名、审核等功能。系统分为用户端和管理端两个部分&#xff0c;实现了活动报名的完整流程管理。 环境要求 ------- - PHP 7.1 - MySQL 5.6 - 支持mysqli扩展 - 支持session - 支持文件上传 默认账…...

Qt QWebEngine应用和网页的交互

一、QWebEngine简介 1、Qt WebEngine模块提供了一个Web浏览器引擎&#xff0c;可以轻松地将万维网上的内容嵌入到没有本机Web引擎的平台上的Qt应用程序中。 2、Qt WebEngine提供了用于渲染HTML&#xff0c;XHTML和SVG文档的C 类和QML类型&#xff0c;它们使用级联样式表&#…...

【爬虫】deepseek谈爬虫工具

2025 年&#xff0c;随着 Web 技术的演进和反爬机制的升级&#xff0c;工具生态也会进一步优化。以下是 2025 年爬虫 & 自动化测试的前沿工具预测&#xff0c;结合行业趋势和现有技术发展方向&#xff1a; &#x1f680; 2025 年推荐组合&#xff08;预测版&#xff09; 1…...

大数据治理自动化与智能化实践指南:架构、工具与实战方案(含代码)

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从人治到机治,数据治理正在进化 随着数据体量持续膨胀、数据场景复杂化,传统依赖人工规则的大数据治理方式已难以为继。企业在治理过程中面临: 数据质量问题激增,人工检测成本高 元数…...

基于BM1684X+RK3588的智能工业视觉边缘计算盒子解决方案

智能工业视觉边缘计算终端技术方案书‌ ‌1. 产品概述‌ 1.1 产品定位 面向工业自动化场景的高性能AI视觉处理设备集成BM1684X&#xff08;8TOPS INT8&#xff09;AI加速芯片 RK3588&#xff08;6TOPS NPU&#xff09;异构计算支持工业级多相机接入、实时缺陷检测、高精度定…...

dubbo泛化调用时transient字段失效问题

工作中发现dubbo泛化调用时结果类中的某个字段即使已经用transient修饰了&#xff0c;但是前端还是会有该字段展示&#xff0c;探究了原因如下&#xff1a; 如果是走的泛化调用&#xff0c;会通过genericFilter和genericImplFilter两个类来处理序列化和反序列化&#xff0c;会…...

【C++】数据结构 九种排序算法的实现

本篇博客给大家带来的是直接插入、希尔、直接选择、堆、冒泡、快速、归并、计数、排序算法的实现&#xff01; &#x1f41f;&#x1f41f;文章专栏&#xff1a;数据结构 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享…...

【数据结构与算法】跳表实现详解

文章目录 Ⅰ. 前言Ⅱ. 跳表(skiplist)一、什么是跳表二、跳表的发明历程三、跳表的搜索方式Ⅲ. skiplist的算法性能分析一、理论准备二、性能分析(了解即可,主要记结论)Ⅳ. skiplist与平衡树、哈希表的比较Ⅴ. skiplist的实现[ 设计跳表](https://leetcode.cn/problems/de…...

2025年“深圳杯”数学建模挑战赛B题-LED显示屏颜色转换设计与校正

LED显示屏颜色转换设计与校正 小驴数模 问题的背景 走在晚风都市&#xff0c;或春日田野&#xff0c;我们都会看到一个色彩斑斓的世界。色彩是我们对世界一种重要感知。什么是色彩&#xff0c;或颜色&#xff1f;颜色是光作用于人眼引起的视觉感知现象&#xff0c;它与物体的…...

毕业论文 | 基于C#开发的NMEA 0183协议上位机

以下是基于C#开发的NMEA 0183协议上位机完整实现方案,包含串口通信、数据解析与可视化功能: 基于C#开发的NMEA 0183协议上位机 一、项目结构二、核心代码实现1. 数据模型定义2. 串口通信管理3. NMEA协议解析核心4. 主界面实现(Windows Forms)三、界面设计关键元素(需在窗体…...

【Scrapy】简单项目实战--爬取dangdang图书信息

目录 一、基本步骤 1、新建项目 &#xff1a;新建一个新的爬虫项目 2、明确目标 &#xff08;items.py&#xff09;&#xff1a;明确你想要抓取的目标 3、制作爬虫 &#xff08;spiders/xxspider.py&#xff09;&#xff1a;制作爬虫开始爬取网页 4、存储内容 &#xff08;p…...

Linux架构篇、第1章_01架构的介绍HTTP HTTPS 协议全面解析

题目&#xff1a;HTTP/HTTPS 协议全面解析&#xff1a;原理、区别与状态码详解 版本号: 1.0,0 作者: 老王要学习 日期: 2025.04.30 适用环境: 服务器 文档说明 本文围绕 HTTP/HTTPS 协议展开&#xff0c;详细介绍了协议的基本概念、工作原理、两者之间的区别以及常见的状态码…...

Python 刷题记录(持续更新)

Python 刷题记录&#xff08;持续更新&#xff09; 主要是 PythonTip 里的题目 刷题网站 【PythonTip】1.分秒转换 def convert_to_seconds(minutes):second minutes * 60return second# 输入分钟 input_minutes int(input())# 调用函数 print(convert_to_seconds(input…...

核心技能:ArcGIS洪水灾害普查、风险评估及淹没制图

查看原文>>>ArcGIS 在洪水灾害普查、风险评估及淹没制图中的实践技术应用 【内容简述】&#xff1a; 水旱灾害风险普查是全国自然灾害综合风险普查的重要组成部分。其中&#xff0c;我国有超过 60%的国土面积、90%以上的人口均受到不同程度的洪水威胁&#xff0c;重…...

MySQL explain

1 EXPLAIN执行结果下各字段含义 (1) id 含义&#xff1a;标识查询中每个 SELECT 子句的唯一编号。规则&#xff1a;相同 id&#xff1a;按从上到下的顺序执行。不同 id&#xff1a;值越大&#xff0c;优先级越高&#xff08;先执行&#xff09;。NULL&#xff1a;表示该行是 …...

数据结构每日一题day14(链表)★★★★★

题目描述&#xff1a;试编写算法将带头结点的单链表就地逆置&#xff0c;所谓“就地”就是空间复杂度为O&#xff08;1)。 算法思想&#xff1a; 1.初始化&#xff1a; 定义三个指针 prev、curr、next&#xff0c;分别表示前驱节点、当前节点和后继节点。 prev 初始化为 NULL…...

Java继承中super的使用方法

super 关键字在 Java 中用于访问父类的成员&#xff08;包括字段、方法和构造函数&#xff09;。当你在子类中调用父类的方法或访问父类的成员变量时&#xff0c;super 是必不可少的工具。 &#x1f511; super 的基本用法 1. 调用父类的构造方法 在子类的构造方法中&#x…...

2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学

完整内容请看文章最下面的推广群 一、问题一的模型构建与优化&#xff08;RGB颜色空间转换模型&#xff09; 基础模型&#xff08;线性映射模型&#xff09;/高斯过程回归模型&#xff08;GPR&#xff09;&#xff1a; 针对高清视频源&#xff08;BT2020标准&#xff09;与普通…...

K8S - GitOps 入门实战 - 自动发布与秒级回滚

引言 传统运维依赖手动执行 kubectl apply或脚本推送应用&#xff0c;存在环境差异、操作记录缺失、回滚缓慢等痛点。 GitOps以 Git 为唯一可信源&#xff0c;通过声明式配置和版本化回滚&#xff0c;重构 Kubernetes 交付流程&#xff0c;带来以下优势&#xff1a; • 环境…...

第六章 流量特征分析-常见攻击事件 tomcat wp

1、在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式&#xff1a;flag{ip}&#xff0c;如&#xff1a;flag{127.0.0.1} 可看见有大量的IP为&#xff1a;14.0.0.120的ip攻击10.0.0.112。 2、找到攻击者…...

Axure RP 快速上手指南:安装配置与实战技巧

以下是Axure RP的中文安装与使用指南&#xff1a; 1. 下载Axure RP Axure RP提供下载地址&#xff1a;https://pan.quark.cn/s/cc957c429c1c 2. 安装Axure RP Windows系统&#xff1a; 双击下载的 .exe 文件。 按提示完成安装&#xff08;接受协议、选择安装路径等&#xff…...

【Dockerfile】Dockerfile打包Tomcat及TongWeb应用镜像(工作实践踩坑教学)

文章目录 前言准备工作目录结构准备基础镜像准备dockerfile开发&#xff08;TongWeb&#xff09;dockerfile开发&#xff08;Tomcat&#xff09;dockerfile镜像命令&#xff08;排查问题基本够用&#xff09; 更多相关内容可查看 前言 本文仅应用于完成此项工作&#xff0c;后…...

第16届蓝桥STEMA真题剖析-2025年1月12日Scratch初/中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥真题解析系列教程第223讲。 第16届第4次蓝桥STEMA已于2025年1月12日正式落下帷幕&#xff0c;比赛仍然采取线上形式。这是Scratch…...

文件读取操作

如果需要从文件读入数据&#xff0c;并把输出数据保存为文件&#xff0c;需要使用文件读取。 freopen为file reopen&#xff0c;意为文件重新打开&#xff0c;实现重定向标准输入输出第一个参数为文件名可以修改&#xff0c;输入文件为.in&#xff0c;输出文件为.out第二个参数…...

服务容错治理框架resilience4jsentinel基础应用---微服务的限流/熔断/降级解决方案

写在前文&#xff1a;hystrix停止维护&#xff0c;不做总结&#xff1b; 本文主要总结sentinel和resilience4j这两个框架&#xff1b;另外额外补充面试可能会问到的限流算法&#xff1b; 目录 限流算法 漏桶算法 计数器算法 令牌桶算法 resilience4j与sentinel resilie…...

信创系统图形界面开发指南:技术选择与实践详解

信创系统图形界面开发指南&#xff1a;技术选择与实践详解 &#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&…...

六、UI自动化测试06--PO设计模式

目录 一、PO 设计模式1. v1 版本1.1 v1.11.2 v1.2 2. v2 版本3. ⽅法封装套路4. v3 版本4.1 浏览器对象管理类的实现4.2 浏览器对象管理类的优化4.3 浏览器对象管理类的使⽤4.4 获取弹窗信息⽅法的封装 5. PO 设计模式6. v4 版本6.1 PO⻚⾯元素封装步骤6.2 测试⽤例的最终代码样…...

电子病历高质量语料库构建方法与架构项目(智能数据目录篇)

电子病历高质量语料库的构建是医疗人工智能发展的基础性工作,而智能数据目录作为数据治理的核心组件,能够有效管理这些语料资源。本文将系统阐述电子病历高质量语料库的构建方法与架构,特别聚焦于智能数据目录的设计与实现,包括数据目录的功能定位、元数据管理、构建步骤以…...

DeepSeek最新大模型发布-DeepSeek-Prover-V2-671B

2025 年 4 月 30 日&#xff0c;DeepSeek 开源了新模型 DeepSeek-Prover-V2-671B&#xff0c;该模型聚焦数学定理证明任务&#xff0c;基于混合专家架构&#xff0c;使用 Lean 4 框架进行形式化推理训练&#xff0c;参数规模达 6710 亿&#xff0c;结合强化学习与大规模合成数据…...

论文公式根据章节自动编号教程

目录 一、操作前提二、具体操作步骤 插入公式编号添加括号&#xff08;如需&#xff09; 问答 摘要&#xff1a; 在撰写论文等文档时&#xff0c;让公式根据章节自动编号能大幅提升排版效率。 一、操作前提 先将每一章标题设置为多级标题。可点击Word“多级列表” - “定义…...

「Mac畅玩AIGC与多模态10」开发篇06 - 使用自定义翻译插件开发智能体应用

一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的翻译服务接入 Dify 平台,并开发基于实时翻译的智能体应用。本案例培养单提参数 API 调用技巧,实现智能体的实时转换能力。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已成…...

大连理工大学选修课——机器学习笔记(8):Boosting及提升树

Boosting及提升树 Boosting概述 Bootstrap强调的是抽样方法 不同的数据集彼此独立&#xff0c;可并行操作 Boosting注重数据集改造 数据集之间存在强依赖关系&#xff0c;只能串行实现 处理的结果都是带来了训练集改变&#xff0c;从而得到不同的学习模型 Boosting基本思…...

OpenHarmony - 小型系统内核(LiteOS-A)(十七)标准库

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;十七&#xff09; 二十一、标准库 OpenHarmony内核使用musl libc库&#xff0c;支持标准POSIX接口&#xff0c;开发者可基于POSIX标准接口开发内核之上的组件及应用。 标准库接口框架 图1 POSIX接口…...

vscode详细配置Go语言相关插件

文章目录 vscode详细配置Go语言1.插件介绍1.1 BetterCommments1.2GitGraph1.3Go1.4GoComment1.5goctl1.6Lowlight Go Errors1.7Markdown1.8Material Icon Theme1.9Preetier2.0Project Manager其它插件 2.settings.json文件 vscode详细配置Go语言 1.插件介绍 1.1 BetterCommme…...

如何解决服务器文件丢失或损坏的问题

当服务器文件丢失或损坏时&#xff0c;需采取系统化的恢复和预防措施。以下是分步骤解决方案&#xff1a; --- ### **一、紧急恢复措施** #### 1. **检查文件系统完整性** bash # 对未挂载的分区进行检查&#xff08;需先umount&#xff09; fsck -y /dev/sdX # 针对ext4文…...

【C++11】包装器:function 和 bind

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲C11——包装器&#xff1a;function和bind&#xff0c;对于每个包装器主要讲解&#xff1a; 原型基本语法使用示例 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C学习笔记 &#x1f380…...

芯知识|小体积语音芯片方案WTV/WT2003H声音播放ic应用解析

在智能硬件设备趋向微型化的背景下&#xff0c;语音芯片方案厂家针对小体积设备开发了多款超小型语音芯片方案&#xff0c;其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度&#xff0c;成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三…...

第三部分:特征提取与目标检测

像边缘、角点、特定的纹理模式等都是图像的特征。提取这些特征是许多计算机视觉任务的关键第一步&#xff0c;例如图像匹配、对象识别、图像拼接等。目标检测则是在图像中找到特定对象&#xff08;如人脸、汽车等&#xff09;的位置。 本部分将涵盖以下关键主题&#xff1a; …...

MySQL bin目录下的可执行文件

文章目录 MySQL bin目录下的可执行文件1.mysqldump2.mysqladmin3.mysqlcheck4.mysqlimport5.mysqlshow6.mysqlbinlog7.常用可执行文件 MySQL bin目录下的可执行文件 1.mysqldump mysqldump 是 MySQL 的数据库备份工具。对数据备份、迁移或恢复非常重要。 备份整个数据库&…...

第四部分:赋予网页健壮的灵魂 —— TypeScript(中)

目录 4 类与面向对象&#xff1a;构建复杂的组件4.1 类的定义与成员4.2 继承 (Inheritance)4.3 接口实现 (Implements)4.4 抽象类 (Abstract Class)4.5 静态成员 (Static Members) 5 更高级的类型&#xff1a;让类型系统更灵活5.1 联合类型 (|)5.2 交叉类型 (&)5.3 字面量类…...

Learning vtkjs之ImageMarchingCubes

体积 等值面处理 介绍 vtkImageMarchingCubes - 对体积进行等值面处理 给定一个指定的等值&#xff0c;使用Marching Cubes算法生成一个等值面。 效果 新建了一个球&#xff0c;对比一下原始的&#xff08;透明的&#xff09;和ISO的效果 核心代码 参数部分 const updat…...

【“星睿O6”AI PC开发套件评测】+ tensorflow 初探

因为本次我的项目计划使用 tensorflow&#xff0c;所以这篇文章主要想做一个引子&#xff0c;介绍如何在“星睿O6”上搭建 tensorflow 的开发环境和验证测试。本文主要分为几个部分&#xff1a; 在“星睿O6”上编译安装 tensorflow基于 MNIST 数据集的模型训练和评估 tensorf…...

通义灵码全面接入Qwen3:AI编程进入智能体时代,PAI云上部署实战解析

引言&#xff1a;AI编程的范式革命 2025年4月30日&#xff0c;阿里云通义灵码宣布全面支持新一代大模型Qwen3&#xff0c;并同步推出编程智能体功能&#xff0c;标志着AI辅助开发从“工具助手”向“自主决策智能体”的跃迁。与此同时&#xff0c;阿里云PAI平台上线Qwen3全系列…...