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

Android学习总结之kotlin篇(一)

1. open 关键字的用法和作用深入源码分析

  • 类的 open 修饰:在 Kotlin 字节码层面,对于一个open类,编译器会在生成的字节码中添加ACC_SUPERACC_OPEN标志。例如,定义一个open class TestOpenClass,反编译其字节码可以看到类似如下信息:
public class TestOpenClass {// 类的成员
}
// 字节码中会包含这些标志
ACC_PUBLIC, ACC_SUPER, ACC_OPEN

这表明该类是可继承的,ACC_OPEN标志告知虚拟机这个类可以被其他类继承。当有类继承这个open类时,如class SubTestOpenClass : TestOpenClass(),在生成的SubTestOpenClass字节码中会体现出对TestOpenClass的继承关系。

  • 成员函数的 open 修饰:当一个函数被open修饰,在字节码层面,函数会带有ACC_OPEN标志。例如:
open class OpenFunctionClass {open fun openFunction() {// 函数体}
}

反编译字节码,openFunction函数的字节码会有ACC_PUBLIC, ACC_VIRTUAL, ACC_OPEN标志。ACC_VIRTUAL表示这是一个虚方法,支持多态调用,ACC_OPEN则表示该方法可以在子类中被重写。子类重写该方法时,会在字节码中体现重写关系,并遵循 Java 虚拟机规范中的方法重写规则。

  • 属性的 open 修饰:对于open修饰的属性,以open var openProperty: String为例,在字节码层面,属性的gettersetter方法(如果是可变属性)会带有ACC_OPEN标志。例如反编译字节码后,getOpenProperty方法会有ACC_PUBLIC, ACC_OPEN标志,这意味着子类可以重写该属性的访问器方法来改变属性的获取或设置行为。

2. 为什么 Kotlin 要用 open 关键字来标志当前类可以继承深入源码分析

  • 默认 final 类的实现:Kotlin 默认类是final的,这在字节码层面体现为类的字节码标志只有ACC_PUBLIC, ACC_SUPER(没有ACC_OPEN)。例如:
class FinalClass {// 类成员
}

反编译字节码,不会出现ACC_OPEN标志,这使得该类不能被继承。这种设计的好处是,从字节码角度保证了类的稳定性和安全性,防止在运行时被意外继承而破坏原有逻辑。

  • open 关键字改变继承性原理:当使用open关键字修饰类时,如前所述,字节码中会添加ACC_OPEN标志。这是 Kotlin 编译器在编译过程中根据open关键字做出的处理,告知虚拟机该类可被继承。这种设计使得开发者可以在需要时,通过添加open关键字,有针对性地开放类的继承,符合 Kotlin 对代码安全性和可维护性的追求。从语言设计角度看,Kotlin 编译器在处理继承关系时,会根据类和成员的open修饰情况,生成符合 Java 虚拟机规范的字节码,保证继承关系的正确实现。

3. by lazy 和 lateinit 深入源码分析(回答 Android 面试官问题)

  • by lazyby lazy的实现依赖于kotlin.Lazy接口及其实现类kotlin.LazyKt__LazyJVMKt.LazyImplby lazy本质上是通过委托给Lazy对象来实现延迟初始化。例如:
val lazyValue: String by lazy { "Hello" }

这里lazy是一个函数,其定义如下:

public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

SynchronizedLazyImplLazy接口的一个实现类,它会在getValue方法被调用时(即第一次访问属性时),调用initializer函数进行初始化,并将结果缓存起来,后续访问直接返回缓存值。在 Android 开发中,这种机制利用了对象的延迟初始化特性,减少了不必要的资源消耗,提升了应用性能。

  • lateinitlateinit主要是 Kotlin 编译器层面的一种处理机制。当使用lateinit声明属性时,编译器会进行特殊处理。例如lateinit var myProperty: MyType,编译器会在字节码中标记该属性为延迟初始化属性。在使用该属性时,编译器会生成代码检查属性是否已经初始化,如果未初始化则抛出UninitializedPropertyAccessException异常。在 Android 开发中,这种机制方便了视图绑定等场景,让开发者可以先声明属性,在合适时机进行初始化,同时通过编译器的检查保证了代码的健壮性。

kotlin的扩展函数使用

1. View 相关扩展

1.1 设置 View 透明度动画
import android.animation.ObjectAnimator
import android.view.View/*** 为 View 设置透明度动画* @param targetAlpha 目标透明度,取值范围 0f 到 1f* @param duration 动画持续时间,单位为毫秒*/
fun View.fadeTo(targetAlpha: Float, duration: Long = 300L) {// 创建透明度动画,从当前透明度过渡到目标透明度val animator = ObjectAnimator.ofFloat(this, "alpha", alpha, targetAlpha)// 设置动画持续时间animator.duration = duration// 启动动画animator.start()
}// 示例调用
val myView: View = findViewById(R.id.my_view)
myView.fadeTo(0.5f)

1.2 测量 View 的尺寸
import android.view.View/*** 测量 View 的尺寸* @return 包含 View 测量宽度和高度的 Pair*/
fun View.measureSize(): Pair<Int, Int> {// 获取 View 的布局参数val layoutParams = layoutParams// 计算测量规格val widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(layoutParams.width,if (layoutParams.width == ViewGroup.LayoutParams.WRAP_CONTENT) {View.MeasureSpec.AT_MOST} else {View.MeasureSpec.EXACTLY})val heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(layoutParams.height,if (layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT) {View.MeasureSpec.AT_MOST} else {View.MeasureSpec.EXACTLY})// 进行测量measure(widthMeasureSpec, heightMeasureSpec)// 返回测量结果return measuredWidth to measuredHeight
}// 示例调用
val myView: View = findViewById(R.id.my_view)
val (width, height) = myView.measureSize()

2. Context 相关扩展

2.1 获取屏幕宽度和高度
import android.content.Context
import android.util.DisplayMetrics/*** 获取屏幕宽度* @return 屏幕宽度,单位为像素*/
fun Context.screenWidth(): Int {// 获取屏幕显示指标val displayMetrics = resources.displayMetricsreturn displayMetrics.widthPixels
}/*** 获取屏幕高度* @return 屏幕高度,单位为像素*/
fun Context.screenHeight(): Int {// 获取屏幕显示指标val displayMetrics = resources.displayMetricsreturn displayMetrics.heightPixels
}// 示例调用
val context: Context = this
val screenWidth = context.screenWidth()
val screenHeight = context.screenHeight()
2.2 从 Context 启动 Service
import android.content.Context
import android.content.Intent/*** 从 Context 启动 Service* @param T 要启动的 Service 类* @param init 用于配置 Intent 的 Lambda 表达式*/
inline fun <reified T : Service> Context.startServiceEx(noinline init: Intent.() -> Unit = {}) {// 创建启动 Service 的 Intentval intent = Intent(this, T::class.java)// 配置 Intentintent.init()// 启动 ServicestartService(intent)
}// 示例调用
class MyService : Service() {// Service 实现代码
}val context: Context = this
context.startServiceEx<MyService> {putExtra("key", "value")
}
2.3 获取 Drawable 资源
import android.content.Context
import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompatfun Context.getDrawableCompat(resId: Int): Drawable? {return ContextCompat.getDrawable(this, resId)
}// 示例调用
val context: Context = this
val drawable = context.getDrawableCompat(R.drawable.my_drawable)
2.4 获取颜色资源
import android.content.Context
import androidx.core.content.ContextCompatfun Context.getColorCompat(resId: Int): Int {return ContextCompat.getColor(this, resId)
}// 示例调用
val context: Context = this
val color = context.getColorCompat(R.color.my_color)

3. Activity 相关扩展

3.1 关闭当前 Activity 并返回结果
import android.app.Activity
import android.content.Intent/*** 关闭当前 Activity 并返回结果* @param resultCode 结果码* @param data 要返回的数据*/
fun Activity.finishWithResult(resultCode: Int, data: Intent? = null) {// 设置返回结果setResult(resultCode, data)// 关闭 Activityfinish()
}// 示例调用
val activity: Activity = this
val resultIntent = Intent()
resultIntent.putExtra("result", "success")
activity.finishWithResult(Activity.RESULT_OK, resultIntent)
3.2 隐藏软键盘
import android.app.Activity
import android.view.inputmethod.InputMethodManager/*** 隐藏当前 Activity 的软键盘*/
fun Activity.hideSoftKeyboard() {// 获取当前焦点 Viewval view = currentFocusif (view != null) {// 获取输入法管理器val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager// 隐藏软键盘imm.hideSoftInputFromWindow(view.windowToken, 0)}
}// 示例调用
val activity: Activity = this
activity.hideSoftKeyboard()

4. Fragment 相关扩展

4.1 获取 Fragment 的父 Activity 并进行类型转换
import androidx.fragment.app.Fragment/*** 获取 Fragment 的父 Activity 并进行类型转换* @param T 要转换的 Activity 类型* @return 转换后的 Activity 实例,如果转换失败则返回 null*/
inline fun <reified T : Activity> Fragment.getParentActivity(): T? {return activity as? T
}// 示例调用
class MyFragment : Fragment() {fun doSomething() {val parentActivity = getParentActivity<MainActivity>()parentActivity?.let {// 使用父 Activity 进行操作}}
}
4.2 为 Fragment 添加回退栈
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction/*** 将 Fragment 添加到指定容器并添加到回退栈* @param containerId 容器 ID* @param tag Fragment 的标签*/
fun Fragment.addToBackStack(containerId: Int, tag: String? = null) {// 获取 FragmentManagerval fragmentManager = requireActivity().supportFragmentManager// 开始事务fragmentManager.beginTransaction().add(containerId, this, tag).addToBackStack(tag).commit()
}// 示例调用
val myFragment = MyFragment()
myFragment.addToBackStack(R.id.fragment_container, "MyFragment")
4.3 替换 Fragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransactionfun FragmentManager.replaceFragment(containerId: Int, fragment: Fragment) {beginTransaction().replace(containerId, fragment).commit()
}// 示例调用
val fragmentManager = supportFragmentManager
val newFragment = MyFragment()
fragmentManager.replaceFragment(R.id.fragment_container, newFragment)
4.4 获取 Activity 的视图绑定
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBindinginline fun <reified T : ViewBinding> Fragment.viewBinding() =FragmentViewBindingDelegate(T::class.java, this)// 自定义委托类
class FragmentViewBindingDelegate<T : ViewBinding>(private val bindingClass: Class<T>,fragment: Fragment
) : ReadOnlyProperty<Fragment, T> {private var binding: T? = nullinit {fragment.lifecycle.addObserver(object : LifecycleEventObserver {override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {if (event == Lifecycle.Event.ON_DESTROY) {binding = null}}})}override fun getValue(thisRef: Fragment, property: KProperty<*>): T {binding?.let { return it }val inflateMethod = bindingClass.getMethod("inflate", LayoutInflater::class.java)val invokeLayout = inflateMethod.invoke(null, thisRef.layoutInflater) as TthisRef.view = invokeLayout.rootreturn invokeLayout.also { binding = it }}
}// 在 Fragment 中使用
class MyFragment : Fragment(R.layout.fragment_my) {private val binding by viewBinding<FragmentMyBinding>()override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 使用 bindingbinding.textView.text = "Hello, World!"}
}

5. RecyclerView 相关扩展

5.1 为 RecyclerView 设置空视图
import androidx.recyclerview.widget.RecyclerView
import android.view.View/*** 为 RecyclerView 设置空视图* @param emptyView 空视图*/
fun RecyclerView.setEmptyView(emptyView: View) {// 监听 RecyclerView 的数据变化adapter?.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {override fun onChanged() {super.onChanged()// 根据数据数量显示或隐藏空视图和 RecyclerViewshowHideEmptyView()}override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {super.onItemRangeInserted(positionStart, itemCount)showHideEmptyView()}override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {super.onItemRangeRemoved(positionStart, itemCount)showHideEmptyView()}private fun showHideEmptyView() {if (adapter?.itemCount == 0) {emptyView.visibility = View.VISIBLEthis@setEmptyView.visibility = View.GONE} else {emptyView.visibility = View.GONEthis@setEmptyView.visibility = View.VISIBLE}}})// 初始时显示或隐藏空视图和 RecyclerViewshowHideEmptyView()
}// 示例调用
val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
val emptyView: View = findViewById(R.id.empty_view)
recyclerView.setEmptyView(emptyView)
5.2 滚动到 RecyclerView 的顶部
import androidx.recyclerview.widget.RecyclerView/*** 滚动 RecyclerView 到顶部*/
fun RecyclerView.scrollToTop() {// 平滑滚动到顶部smoothScrollToPosition(0)
}// 示例调用
val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
recyclerView.scrollToTop()
5.3 快速设置 RecyclerView
import androidx.recyclerview.widget.RecyclerViewfun RecyclerView.setup(layoutManager: RecyclerView.LayoutManager,adapter: RecyclerView.Adapter<*>,hasFixedSize: Boolean = true
) {this.layoutManager = layoutManagerthis.adapter = adapterthis.setHasFixedSize(hasFixedSize)
}// 示例调用
val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
val layoutManager = LinearLayoutManager(this)
val adapter = MyAdapter()
recyclerView.setup(layoutManager, adapter)
5.2 添加分割线
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerViewfun RecyclerView.addDivider() {val divider = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)addItemDecoration(divider)
}// 示例调用
val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
recyclerView.addDivider()

扩展函数在 Android 开发中能够显著提高代码的复用性和可维护性,让开发过程更加高效。

相关文章:

Android学习总结之kotlin篇(一)

1. open 关键字的用法和作用深入源码分析 类的 open 修饰&#xff1a;在 Kotlin 字节码层面&#xff0c;对于一个open类&#xff0c;编译器会在生成的字节码中添加ACC_SUPER和ACC_OPEN标志。例如&#xff0c;定义一个open class TestOpenClass&#xff0c;反编译其字节码可以看…...

arcgis空间分析理论研究

arcgis的空间分析功能有&#xff08;1&#xff09;地形与地表分析&#xff1b;&#xff08;2&#xff09;距离与成本分析&#xff1b;&#xff08;3&#xff09;密度分析&#xff1b;&#xff08;4&#xff09;水文分析&#xff1b;&#xff08;5&#xff09;统计分析&#xff…...

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬到楼顶。…...

Eigen核心矩阵/向量类 (Matrix, Vector, Array)

1. Matrix 类&#xff08;稠密矩阵&#xff09; 模板参数 cpp Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> Scalar: 元素类型&#xff08;如 float, double, int&#xff09;。 Rows/Cols: 行数和列数&#xff08;Dynamic 表示动态大小&#xff09;。 O…...

立创EDA

空格键&#xff1a;旋转 alt w : 布线 alt v : 放置过孔 shift x &#xff1a;先在原理图中框选&#xff0c;按下shiftx&#xff0c;批量选中pcd中的对应元件 shift h : 选中的网络持续高亮/取消高亮 更改位号&#xff1a;举例 框选要更改的电阻 右侧栏属性 --> 位号…...

计算机网络笔记(十二)——2.5数字传输系统

数字传输系统是光纤通信中实现高速数据传输的核心技术&#xff0c;解决了传统模拟传输的速率不统一、同步性差等问题。 一、早期数字传输的问题 速率标准不统一&#xff1a;北美&#xff08;T1: 1.544Mbps&#xff09;和欧洲&#xff08;E1: 2.048Mbps&#xff09;采用不同的…...

[FPGA Video IP] Video Processing Subsystem

Xilinx Video Processing Subsystem IP (PG231) 详细介绍 概述 Xilinx LogiCORE™ IP Video Processing Subsystem (VPSS)&#xff08;PG231&#xff09;是一个高度可配置的视频处理模块&#xff0c;设计用于在单一 IP 核中集成多种视频处理功能&#xff0c;包括缩放&#xf…...

java基础之枚举和注解

枚举 简介 枚举&#xff1a;enumeration&#xff0c;jdk1.5中引入的新特性&#xff0c;用于管理和使用常量 入门案例 第一步&#xff1a;定义枚举&#xff0c;这里定义一个动物类&#xff0c;里面枚举了多种动物 public enum AnimalEnum {CAT, // 猫DOG, // 狗PIG // …...

前端开发本地配置 HTTPS 全面详细教程

分为两步&#xff1a;生成证书、本地服务配置使用证书一、HTTPS 的基本概念 HTTPS 是一种安全的 HTTP 协议&#xff0c;它通过 SSL/TLS 对数据进行加密&#xff0c;确保数据在传输过程中不被窃取或篡改。在前端开发中&#xff0c;某些功能&#xff08;如 Geolocation API、Web…...

C语言中宏的高级应用

一、宏的核心高级特性 1. 变参宏&#xff08;Variadic Macros&#xff09; 支持不定数量参数&#xff0c;用于灵活处理格式化字符串、日志输出等场景。 #include <stdio.h>// 定义支持可变参数的调试宏 #define DEBUG_LOG(format, ...) \printf("[DEBUG] %s:%d |…...

Simulink 数据字典(Data Dictionary)详解:使用场景、存储内容与调用方法

1. 引言 在 Simulink 建模中&#xff0c;随着模型复杂度增加&#xff0c;参数管理变得尤为重要。传统方法&#xff08;如 MATLAB 工作区变量或脚本&#xff09;在团队协作或大型项目中容易导致数据分散、版本混乱。数据字典&#xff08;Data Dictionary&#xff09; 提供了一种…...

部署yolo到k230教程

训练&#xff1a;K230 借助 AICube部署AI 视觉模型 YOLO等教程_嘉楠 ai cube多标签分类-CSDN博客K230模型训练ai cube报错生成部署文件异常_aicube部署模型显示生成部署文件异常-CSDN博客 部署&#xff1a; # 导入必要的库和模块 import os import ujson # 超快的JS…...

【高频考点精讲】第三方库安全审计:如何避免引入带漏洞的npm包

大家好,我是全栈老李。今天咱们聊一个前端工程师必须掌握的生存技能——如何避免把带漏洞的npm包引入项目。这可不是危言耸听,去年某大厂就因为在生产环境用了有漏洞的lodash版本,被黑客利用原型污染漏洞直接攻破后台系统。 为什么npm包会变成"定时炸弹"? npm生…...

【后端】主从单体数据库故障自动切换,容灾与高可用

在现代企业级应用中,数据库的高可用性和容灾能力是保障业务连续性的关键。尤其是在一些对稳定性要求较高的业务场景中,当主数据库发生故障时,如何快速切换到备用数据库并确保业务不受影响,成为了一个重要课题。本文将介绍一种基于 SpringBoot 和 Druid 数据源的解决方案,通…...

AI编程案例拆解|基于机器学习XX评分系统-后端篇

文章目录 5. 数据集生成使用KIMI生成数据集 6. 后端部分设计使用DeepSeek生成神经网络算法设计初始化项目在Cursor中生成并提问前后端交互运行后端命令 注意事项 关注不迷路&#xff0c;励志拆解100个AI编程、AI智能体的落地应用案例为了用户的隐私性&#xff0c;关键信息会全部…...

数据库设置外键的作用

数据库外键&#xff08;Foreign Key&#xff09;是关系型数据库中用于建立表与表之间关联关系的重要约束&#xff0c;其核心作用是确保数据的一致性、完整性和关联性。以下是外键的主要作用及相关说明&#xff1a; 1. 建立表间关联关系 外键通过引用另一张表的主键&#xff0…...

从基础到实战的量化交易全流程学习:1.1 量化交易本质与行业生态

从基础到实战的量化交易全流程学习&#xff1a;1.1 量化交易本质与行业生态 在金融市场数字化转型的浪潮中&#xff0c;量化交易凭借数据驱动的科学性与自动化执行的高效性&#xff0c;成为连接金融理论与技术实践的核心领域。本文作为系列开篇&#xff0c;将从本质解析、行业生…...

路由交换网络专题 | 第八章 | GVRP配置 | 端口安全 | 端口隔离 | Mux-VLAN | Hybrid

拓扑图 &#xff08;1&#xff09;通过 LSW1 交换机配置 GVRP 协议同步 VLAN 信息到所有接入层设备。 基于 GARP 机制&#xff1a;GVRP 是通用属性注册协议 GARP&#xff08;Generic Attribute Registration Protocol&#xff09;的一种应用&#xff0c;用于注册和注销 VLAN 属…...

重定向和语言级缓冲区【Linux操作系统】

文章目录 重定向重定向的原理重定向系统调用接口进程替换不会影响重定向bash命令行中输入&#xff0c;输出&#xff0c;追加重定向的区别输出重定向输入重定向追加重定向命令行中只支持向文件描述符为0&#xff0c;1&#xff0c;2的标准流进行>&#xff0c;>>&#xf…...

Channel如何安全地尝试发送数据

在 Go 语言中&#xff0c;无法直接检查 channel 是否关闭&#xff08;没有类似 IsClosed(ch) 的方法&#xff09;&#xff0c;但可以通过 非阻塞发送 或 select 语句 安全地尝试发送数据&#xff0c;避免向已关闭的 channel 发送数据导致 panic。以下是具体实现方式&#xff1a…...

MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点

MH21xx和MH22xx内核集成了串行/JTAG调试接口(SWJ-DP)。这是标准的ARM CoreSight调试接 口&#xff0c;包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。 ● JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。 ● 串行调试接口(SW-DP)为AHP-AP模块提供2针(时钟&#xff0…...

Tortoise-ORM级联查询与预加载性能优化

title: Tortoise-ORM级联查询与预加载性能优化 date: 2025/04/26 12:25:42 updated: 2025/04/26 12:25:42 author: cmdragon excerpt: Tortoise-ORM通过异步方式实现级联查询与预加载机制,显著提升API性能。模型关联关系基础中,定义一对多关系如作者与文章。级联查询通过s…...

【C++11】列表初始化

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲C11引入的列表初始化{}&#xff0c;注意这不是构造函数里的初始化列表&#xff01;&#xff01;&#xff01; 在阅读文章之前&#xff0c;请你记住一句重点&#xff1a;万物皆可{}初始化 &#x1f3ac;个人简介&#xff1a;努…...

基于Cherry Studio + DeepSeek 搭建本地私有知识库!

在当今数字化时代&#xff0c;知识管理变得越来越重要。无论是个人还是企业&#xff0c;都希望能够高效地存储、管理和检索知识。而借助 AI 技术&#xff0c;我们可以实现更加智能的知识库系统。本文将详细介绍如何使用 Cherry Studio 和 DeepSeek 搭建本地私有知识库&#xff…...

栈相关算法题解题思路与代码实现分享

目录 前言 一、最小栈&#xff08;LeetCode 155&#xff09; 题目描述 解题思路 代码实现&#xff08;C&#xff09; 代码解释 二、栈的压入、弹出序列&#xff08;剑指 Offer JZ31&#xff09; 题目描述 解题思路 代码实现&#xff08;C&#xff09; 代码解释 总结…...

MongoDB Atlas与MongoDB连接MCP服务器的区别解析

MongoDB Atlas作为全托管的云数据库服务&#xff0c;与本地自建MongoDB实例在连接MCP&#xff08;Model Context Protocol&#xff09;服务器时存在显著差异。以下从配置方式、安全机制、功能特性三个维度对比两者的区别&#xff1a; 连接配置差异 • 本地MongoDB&#xff1a;…...

服务器传输数据存储数据建议 传输慢的原因

一、JSON存储的局限性 1. 性能瓶颈 全量读写&#xff1a;JSON文件通常需要整体加载到内存中才能操作&#xff0c;当数据量大时&#xff08;如几百MB&#xff09;&#xff0c;I/O延迟和内存占用会显著增加。 无索引机制&#xff1a;查找数据需要遍历所有条目&#xff08;时间复…...

【大模型】Coze AI 智能体工作流从配置到使用实战详解

目录 一、前言 二、工作流介绍 2.1 什么是工作流 2.2 工作流与对话流 2.2.1 两者区别 2.3 工作流节点介绍 2.3.1 工作流节点说明 2.3.2 开始节点与结束节点 2.4 工作流入口 2.4.1 自定义智能体入口 2.4.2 从资源库新增工作流 2.5 工作流使用限制 三、工作流配置与使…...

Java后端开发——分层解耦详解

文章目录 一、三层架构1.1 概述1.2 具体实现方法 二、分层解耦2.1 以往问题2.2 概念解释2.3 解耦思路 三、Spring核心&#xff1a;IOC & DI3.1 快速入门3.2 IOC&#xff08;控制反转&#xff09;详解3.3 DI&#xff08;依赖注入&#xff09;详解 注入方式 标签&#xff1a;…...

论文如何降低AIGC?(完整指南版)

最近一段时间&#xff0c;关于论文AIGC率太高怎么办的问题&#xff0c;真的是知乎、小红书、B站到处都是&#xff01; 尤其是今年知网一升级&#xff0c;连纯手写的内容都能给你标疑似AIGC&#xff0c;简直离谱啊兄弟姐妹们&#x1f62d;&#xff01; 那论文到底怎么降低AIGC…...

【LCMM】纵向轨迹模型,组轨迹模型

latent_class_mixed_models 基础知识 增长混合模型&#xff08;GMM&#xff09;和潜在类别增长模型&#xff08;LCGA&#xff09;的核心区别确实主要在于是否允许类别内存在随机效应&#xff0c;但两者的差异还涉及模型灵活性、假设和应用场景等方面。以下是详细对比&#xf…...

Flask + ajax上传文件(三)--图片上传与OCR识别

本教程将详细介绍如何使用Flask框架构建一个图片上传与文字识别(OCR)的Web应用。我们将使用EasyOCR作为OCR引擎,实现一个支持中文和英文识别的完整应用。 环境准备 首先,确保你已经安装了Python 3.7+环境,然后安装必要的依赖库: pip install flask easyocr pillow werkz…...

观察者模式 (Observer Pattern)

观察者模式(Observer Pattern)是一种行为型设计模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己的状态。 一、基础 1. 意图 核心目的:定义对象间的一种一对…...

【Leetcode 每日一题】2444. 统计定界子数组的数目

问题背景 给你一个整数数组 n u m s nums nums 和两个整数 m i n K minK minK 以及 m a x K maxK maxK。 n u m s nums nums的定界子数组是满足下述条件的一个子数组&#xff1a; 子数组中的 最小值 等于 m i n K minK minK。子数组中的 最大值 等于 m a x K maxK maxK…...

LeetCode热题100——70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&#xff1a; …...

黑马Java基础笔记-4

方法 什么是方法 方法是程序中最小的执行单元。 形参和实参 调用 直接调用 getSum(10,20,30);赋值调用 int sum getSum(10,20,30);输出调用 System.out.println(getSum(10,20,30));方法的重载 在同一个类中&#xff0c;定义了多个同名的方法&#xff0c;这些同名的方法…...

【Python】Python中的浅拷贝和深拷贝

在Python中&#xff0c;浅拷贝&#xff08;shallow copy&#xff09;和深拷贝&#xff08;deep copy&#xff09;是两种不同的对象复制方式&#xff0c;它们在复制对象时的行为有所不同&#xff1a; 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是创建一个新对象&…...

使用 LangGraph 和 Elasticsearch 构建强大的 RAG 工作流

作者&#xff1a;来自 Elastic Neha Saini 在这篇博客中&#xff0c;我们将向你展示如何配置和自定义 LangGraph Retrieval Agent 模板与 Elasticsearch&#xff0c;以构建一个强大的 RAG 工作流&#xff0c;实现高效的数据检索和由 AI 驱动的响应。 Elasticsearch 原生集成了…...

云原生--核心组件-容器篇-2-认识下Docker(三大核心之镜像,容器,仓库)

1、Docker基本概念 &#xff08;1&#xff09;、定义 Docker是一种开源的应用容器引擎&#xff0c;是基于操作系统级虚拟化技术。允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;然后发布到任何支持Docker的环境中运行。Docker容器是轻量级、独立且可执…...

智慧园区IOT项目与AI时代下的机遇 - Java架构师面试实战

在互联网大厂的Java求职者面试中&#xff0c;面试官通常会针对实际业务场景提出一系列问题。以下是关于智慧园区IOT项目及AI时代下的机遇的面试模拟对话。 第一轮提问 面试官&#xff1a;马架构&#xff0c;请简要介绍下智慧园区IOT项目的整体架构设计。 马架构&#xff1a;…...

Unity中文件上传以及下载,获取下载文件大小的解决方案

首先现在Unity插件那么的广泛的情况下,很多东西都不需要自己实现,直接使用第三方插件就可以了,但为什么这里需要自己写,接下来说明原因。 在Unity商城中有很多关于关于网络接口调用的插件,其中有一款叫BestHTTP这款使用比较广泛的插件,不知道朋友们是不是都知道,是不是…...

Word/WPS 删除最后一页空白页,且保持前面布局样式不变

如题&#xff0c;试了多种方法&#xff0c;都不行。主要是可能的原因太多了&#xff0c;没有通解&#xff0c;这只是适用于我的情况。 解决方案&#xff1a; 首先光标放在倒数第二页&#xff08;即想保留的最后一页&#xff09;&#xff0c;点击页面右下角这个小箭头&#xff…...

MySQL长事务的隐患:深入剖析与解决方案

MySQL长事务的隐患&#xff1a;深入剖析与解决方案 一、什么是长事务&#xff1f; 在数据库系统中&#xff0c;长事务(Long Transaction)通常指执行时间超过预期或系统设定阈值的事务。对于MySQL而言&#xff0c;虽然没有严格的时间定义&#xff0c;但一般认为执行时间超过数…...

【Tauri】桌面程序exe开发 - Tauri+Vue开发Windows应用 - 比Electron更轻量!8MB!

效果图 Tauri的二进制文件体积显著小于Electron&#xff0c;安装包通常缩小80%以上。应用启动更快&#xff0c;内存占用更低&#xff0c;尤其在老旧设备上体验更流畅。 写在前面 Tauri官网 https://tauri.app/zh-cn/支持语言&#xff1a;js、ts、rust、.net编译出来的exe文件&…...

2025春季NC:3.1TheTrapeziumRule

3.1TheTrapeziumRule 📐 The Idea Instead of finding the exact area under a curve y = f ( x ) y = f(x) y=...

【摩尔定律】

一、摩尔定律的核心定义​​ ​​原始表述&#xff08;1965年&#xff09;​​ “集成电路上可容纳的晶体管数量&#xff0c;每隔约 ​​18-24个月​​ 便会增加一倍&#xff0c;同时性能提升一倍&#xff0c;而成本下降一半。” ​​简化理解​​ 芯片的 ​​晶体管密度​​ 和…...

Maven 依赖冲突调解与版本控制

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

《Python Web部署应知应会》Flask网站隐藏或改变浏览器URL:从Nginx反向代理到URL重写技术

Flask网站隐藏或改变浏览器显示URL地址的实现方案&#xff1a;从Nginx反向代理到URL重写技术 引言 在Web应用开发中&#xff0c;URL路径的安全性往往被忽视&#xff0c;这可能导致网站结构和后端逻辑被攻击者轻易推断。对于Flask框架开发的网站&#xff0c;如何隐藏或改变浏览…...

6.2 内容生成与营销:个性化内容创作与营销策略优化

随着消费者对个性化体验的需求日益增长&#xff0c;传统的内容创作与营销方式已难以满足市场竞争的需要。基于大语言模型&#xff08;LLM&#xff09;与智能代理&#xff08;Agent&#xff09;的技术为企业提供了全新的解决方案&#xff0c;能够实现高效、精准、规模化的内容生…...

平面连杆机构(上)

1、平面四杆机构的类型与演化 1&#xff09;平面四杆机构的类型 a、铰链四杆机构&#xff1a;曲柄摇杆机构、双曲柄机构、双摇杆机构 b、其他四杆机构&#xff1a;曲柄滑块机构、导杆机构、滑块机构、双滑块机构、偏心轮四杆机构...... 2&#xff09;平面四杆机构的演化 a、…...