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

Android学习总结之Java和kotlin区别

一、空安全机制

真题 1:Kotlin 如何解决 Java 的 NullPointerException?对比两者在空安全上的设计差异

解析
核心考点:Kotlin 可空类型系统(?)、安全操作符(?./?:)、非空断言(!!)及编译期检查。
答案

  1. Kotlin 的空安全设计

    • 显式声明可空性:通过String?声明可空类型,String为非空类型,编译期禁止非空类型赋值为null
    • 安全调用符?.:链式调用时若对象为null则直接返回null,避免崩溃(如user?.address?.city)。
    • ** Elvis 操作符?:**:提供默认值(如val name = user?.name ?: "Guest")。
    • 非空断言!!:强制解包,若为null则抛NullPointerException,需谨慎使用。
    • 编译期检查:Kotlin 编译器会静态分析空指针风险,未处理的可空类型操作会报错(如未检查null直接调用方法)。
  2. 与 Java 的差异

    • Java 依赖开发者手动null检查,运行时崩溃风险高;Kotlin 通过类型系统将空安全问题提前到编译阶段,大幅减少 NPE。

真题 2:当 Kotlin 调用 Java 方法返回null时,如何处理可空性?
答案
Kotlin 默认将 Java 无空安全声明的方法返回值视为可空类型(如String?),需显式处理:

// Java方法(可能返回null)
public static String getNullableString() { return null; }// Kotlin调用时需声明为可空类型
val result: String? = JavaClass.getNullableString()
// 安全调用或判空处理
result?.let { process(it) } ?: handleNull()

二、协程

真题 1:协程与线程的本质区别?为什么协程更适合 Android 异步开发?

解析
核心考点:协程轻量级、挂起机制、非阻塞特性。
答案

  1. 本质区别

    • 线程:操作系统级调度单元,创建和切换开销高(约 1MB 栈空间 / 线程),阻塞会占用系统资源。
    • 协程:用户态轻量级线程(Kotlin 协程基于 JVM 线程,通过Continuation实现挂起),无栈协程仅需几十字节状态机,切换成本极低,支持非阻塞挂起(如delay不会阻塞线程)。
  2. Android 优势

    • 避免回调地狱:通过withContext(Dispatchers.Main)切换线程,代码线性化。
    • 资源高效:千级协程共享少数线程,降低内存占用。
    • 取消机制:协程作用域(CoroutineScope)可统一管理生命周期,避免内存泄漏(如Activity销毁时自动取消协程)。
真题 2:协程的取消是立即停止吗?如何正确处理协程取消?

答案

  1. 取消非立即性
    调用coroutine.cancel()后,协程不会立即停止,而是标记为isActive = false,需在代码中检查取消状态或通过挂起函数(如withContext)响应取消。

  2. 正确处理方式

    • 检查isActive:在循环中使用while (isActive),取消时自动退出。
      • 使用ensureActive():在非挂起函数中手动抛CancellationException
      • 子协程联动:通过CoroutineScope创建的子协程,父协程取消时会级联取消(默认SupervisorJob除外)。
    launch {var i = 0while (isActive) { // 关键检查点doWork(i++)delay(100) // 挂起函数自动检查取消}
    }
    

三、语法特性对比

真题 1:Kotlin 数据类(data class)相比 Java Bean 的优势?编译后生成了哪些方法?

答案

  1. 优势

    • 一行代码自动生成equals()hashCode()toString()copy()及全参构造器,避免样板代码。
    • 支持解构声明(如val (name, age) = user),方便数据解析。
  2. 生成方法

    data class User(val name: String, val age: Int)
    
     

    编译后生成:

    • User(String, Int)构造器
    • getName()getAge()(Kotlin 中直接通过属性访问,无需显式调用)
    • equals()hashCode()(基于所有主构造参数)
    • toString()(格式为User(name=..., age=...)
    • copy()(复制对象,支持部分参数修改:user.copy(age=25)
真题 2:Kotlin 扩展函数的本质是什么?是否能访问类的私有成员?

答案

  1. 本质
    扩展函数是静态方法,通过第一个参数(this: Class)模拟类的成员方法调用。

    // 扩展函数
    fun String?.safeLength(): Int = this?.length ?: 0// 编译后等价于Java静态方法
    public static final int safeLength(@Nullable String $this) {return $this != null ? $this.length() : 0;
    }
    
  2. 访问权限
    无法访问类的private成员(因本质是外部静态方法),只能访问publicinternal成员。

四、性能与优化

真题 1:Kotlin 的inline函数如何优化性能?使用时需要注意什么?

解析
核心考点:内联避免函数调用开销,适用于高阶函数场景。
答案

  1. 原理
    inline修饰的函数会在编译时将函数体直接替换到调用处,避免普通函数的栈帧创建和参数压栈开销,尤其对高阶函数(如forEach)效果显著。

  2. 注意事项

    • 代码膨胀:过度内联可能导致生成的字节码体积增大(如循环内联)。
    • noinline参数:若高阶函数参数不需要内联,用noinline避免冗余代码(如回调函数仅部分需要内联)。
    • reified泛型:配合reified保留泛型类型信息(普通泛型会类型擦除):
      inline fun <reified T> fromJson(json: String): T { ... } // 可获取T的实际类型
      
真题 2:对比 Java 的双重检查锁定,Kotlin 的by lazy有何优势?实现原理是什么?

答案

  1. 优势
    by lazy默认线程安全(基于LazyThreadSafetyMode.SYNCHRONIZED),无需手动处理锁,且支持延迟初始化和缓存,代码更简洁。

  2. 实现原理

    • 创建Lazy对象,首次访问时通过synchronized同步块执行初始化函数,结果存入value字段,后续直接返回缓存值。
    • 支持不同线程安全模式(如NONE/PUBLICATION,需根据场景选择)。

五、兼容性与跨平台

真题 1:Kotlin 如何与 Java 互操作?如果 Java 类名与 Kotlin 关键字冲突怎么办?

答案

  1. 互操作

    • Kotlin 可直接调用 Java 代码,Java 可通过Kt后缀类名调用 Kotlin 顶层函数(如KotlinFileKt.functionName())。
    • Kotlin 的@JvmField/@JvmStatic注解可控制成员在 Java 中的可见性(如暴露类字段为 public)。
  2. 关键字冲突
    使用@JvmName("javaFriendlyName")重命名,例如:

    // Kotlin代码
    @JvmName("getResult") // Java中调用时使用getResult()而非原生的result()
    val result: String get() = "data"
    
真题 2:Kotlin 跨平台(如 iOS/Android)的实现原理是什么?公共代码如何与平台特定代码交互?

答案

  1. 原理

    • Kotlin 通过多目标编译(JVM/JS/Native)生成不同平台代码,公共逻辑用纯 Kotlin 编写,平台差异通过接口抽象。
    • 例如,Android 用AndroidViewModel,iOS 用UIKit,公共层定义ViewModel接口,各平台实现具体逻辑。
  2. 交互方式

    • 接口隔离:公共模块定义接口(如NetworkService),平台模块实现(Android 用 Retrofit,iOS 用 URLSession)。
    • 条件编译:通过expect-actual声明平台相关实现:
      // 公共模块
      expect class PlatformLogger() {fun log(message: String)
      }// Android模块
      actual class PlatformLogger() {actual fun log(message: String) = Log.d("ANDROID", message)
      }
      

一、APK 打包核心流程对比(Java vs Kotlin)

1. 源码编译阶段(决定字节码生成差异)
环节Java 流程Kotlin 流程面试考点:Kotlin 编译特殊性
源码类型.java文件直接通过javac编译为.class字节码(符合 JVM 规范)。.kt文件通过 Kotlin 编译器(kotlinc)编译为.class字节码,需依赖kotlin-stdlib等运行时库。问:Kotlin 项目为何需要引入kotlin-android-extensions插件?
答:该插件支持 XML 资源绑定(如findViewById自动生成),编译时会生成额外的扩展函数字节码。
语法特性处理无特殊处理,遵循 Java 语法规则(如 getter/setter 需手动编写)。自动处理语法糖:
数据类:生成equals/hashCode/copy等方法字节码;
空安全:生成null检查逻辑(如invokevirtual指令前插入ifnull);
扩展函数:转为静态方法(如StringExtKt.extFunction(String))。
问:Kotlin 的var name: String编译后与 Java 的private String name+getter/setter有何区别?
答:Kotlin 直接生成public final String getName()public final void setName(String),但字节码中字段仍为private,通过合成方法访问(与 Java 等价)。
混合编译支持纯 Java 项目无需额外配置。需在build.gradle中添加apply plugin: 'kotlin-android',Kotlin 编译器会同时处理.kt.java文件,生成统一的.class字节码(Kotlin 代码最终都会转为 JVM 字节码)。问:如何排查 Kotlin 与 Java 混合编译时的符号冲突?
答:Kotlin 顶层函数会生成XXXKt.class(如utils.ktUtilsKt.class),可通过@JvmName("JavaFriendlyName")显式重命名避免冲突。
2. 字节码优化与处理(影响 APK 体积和性能)
环节Java 通用处理Kotlin 特有处理面试考点:Kotlin 字节码优化
优化工具依赖ProGuard/R8进行代码混淆、压缩、优化(如去除未使用的类 / 方法)。除上述工具外,Kotlin 编译器自带内联优化inline函数直接展开)和类型推断优化(减少冗余类型声明的字节码)。问:为什么 Kotlin 的inline函数能提升性能但可能增大 APK 体积?
答:内联会将函数体复制到调用处,避免函数调用开销,但过多内联会导致字节码膨胀(如循环内联 100 次会生成 100 份代码)。
空安全字节码无,需手动添加null检查(如if (obj != null)),生成astore/aload等指令。自动生成null检查指令:
- 安全调用obj?.method()编译为ifnull skip+ 正常调用;
- 非空断言obj!!.method()编译为ifnull throw NPE
问:Kotlin 的String?编译后在字节码中如何表示?
答:与 Java 的String无区别(JVM 无原生可空类型),空安全由编译器静态检查保证,运行时通过额外指令实现防御性检查。
协程字节码无,异步逻辑依赖线程池 + 回调(如ExecutorService),生成new Thread()/run()等指令。协程编译为状态机(Continuation接口实现类),挂起函数通过invokeSuspend方法恢复执行,需依赖kotlin-coroutines-core库的Dispatcher/Job等类。问:协程的轻量级在字节码层面如何体现?
答:协程不生成新线程,而是通过Continuation对象保存执行状态(仅包含局部变量和 PC 指针),切换成本远低于线程上下文切换(无需操作 CPU 寄存器)。
3. DEX 文件生成(Android 独有阶段)
环节Java/ Kotlin 共性Kotlin 潜在影响面试考点:DEX 文件限制
.class→.dex 转换均通过dx工具(或 R8)将多个.class文件合并为.dex,解决 Java 方法数限制(单个 DEX 最多 65536 个方法)。Kotlin 标准库(如kotlin-stdlib-jdk8)会引入额外类(如LazyImpl/CoroutineContext),可能增加方法数,需配置multiDexEnabled true开启多 DEX。问:Kotlin 项目更容易触发 65536 方法数限制吗?
答:是的,因 Kotlin 标准库和扩展功能(如协程、数据类)会增加类 / 方法数量,需通过android.enableR8=true和多 DEX 配置解决。
字节码优化差异均会进行方法内联、常量折叠等优化,但 Kotlin 的inline函数可能导致更多代码膨胀(需 R8 进一步优化)。协程的withContext等挂起函数会生成额外的状态机类(如BlockKt$withContext$1),需注意 ProGuard 规则(避免混淆协程相关类导致崩溃)。问:如何配置 ProGuard 保留 Kotlin 协程的元数据?
答:添加规则-keep class kotlinx.coroutines.** { *; },防止混淆CoroutineDispatcher/Job等关键类。
4. 资源与签名(流程一致,Kotlin 需额外配置)
环节共性Kotlin 特殊配置面试考点:资源绑定
资源合并均通过aapt工具编译.xml/ 图片等资源为resources.arsc,生成 R 类(资源索引)。使用kotlin-android-extensions插件时,会生成kotlinx.android.synthetic包下的扩展属性(如textView直接映射R.id.textView),需确保插件版本与 Gradle 兼容(避免资源 ID 映射失败)。问:Kotlin 的findViewById简化写法(如button代替findViewById(R.id.button))如何实现?
答:插件在编译期生成ViewBinding或合成扩展函数,本质是静态方法调用,与 Java 反射无关,性能无损耗。
签名与对齐均需通过apksigner签名(V1/V2/V3 签名),zipalign优化 APK 磁盘布局。无特殊处理,但需注意 Kotlin 运行时库(如kotlin-stdlib)的版本兼容性(低版本 Android 可能缺失某些 JVM 特性,需通过minifyEnabled开启混淆或使用AndroidX库)。问:Kotlin 项目的 APK 体积为何通常比 Java 大 5-10KB?
答:因引入 Kotlin 标准库(约 100+KB,但通过 ProGuard 可剥离未使用部分),且语法糖生成的额外字节码(如数据类的copy方法)增加了类文件数量。

二、大厂面试真题:APK 打包深度问题解析

真题 1:Kotlin 代码编译为 Java 字节码时,如何处理扩展函数和属性?举例说明底层实现

解析
核心考点:扩展函数的静态方法本质,反编译工具(如 JD-GUI)查看字节码。
答案

  1. 扩展函数编译规则

    // Kotlin代码
    fun String.firstChar(): Char = this[0]// 编译后Java字节码(对应StringExtKt.class)
    public final class StringExtKt {public static final char firstChar(@NotNull String $this) {Intrinsics.checkNotNullParameter($this, "$this$firstChar");return $this.charAt(0);}
    }
    
     
    • 扩展函数被转为静态方法,第一个参数为被扩展的类实例(命名为$this)。
    • 非空校验(如Intrinsics.checkNotNullParameter)由 Kotlin 编译器自动添加,对应@NotNull注解的处理。
  2. 扩展属性编译规则

    // Kotlin代码
    var String.lastChar: Charget() = this[this.length - 1]set(value) = this.setCharAt(this.length - 1, value) // 需String可变(实际不可变,此处仅示例)// 编译后生成getLastChar/setLastChar静态方法
    public static final char getLastChar(@NotNull String $this) { ... }
    public static final void setLastChar(@NotNull String $this, char value) { ... }
    

面试陷阱:问 “扩展函数能否重写类的成员函数?”,需答 “不能,本质是静态方法,调用时依赖静态解析,与类的虚方法表无关”。

真题 2:Kotlin 协程相关代码如何影响 APK 打包?需要注意哪些混淆规则?

解析
核心考点:协程库依赖、状态机类保留、线程调度器混淆。
答案

  1. 依赖引入

    • 协程需添加implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'(JVM)或kotlinx-coroutines-android(Android),这些库会引入CoroutineDispatcher/Job/Continuation等类,增加 APK 体积(约 50KB,可通过 R8 压缩)。
  2. 混淆注意事项

    • 禁止混淆协程上下文类:需添加 ProGuard 规则:
      -keep class kotlinx.coroutines.** { *; }
      -keep interface kotlinx.coroutines.** { *; }
      

      否则可能导致协程调度(如Dispatchers.Main)失效或取消异常。
    • 状态机类保留:协程挂起函数生成的匿名内部类(如lambda$launch$0)可能被混淆,需通过-keep class * implements kotlinx.coroutines.Continuation保留Continuation接口实现类。
  3. 多 DEX 影响
    协程库方法数较多(如CoroutineScope有多个重载构造器),可能触发 65536 限制,需在build.gradle中开启:

    android {defaultConfig {multiDexEnabled true}
    }
    
真题 3:对比 Java 和 Kotlin 在 APK 打包时的编译速度,Kotlin 为何通常更慢?如何优化?

解析
核心考点:Kotlin 编译器复杂度、增量编译配置。
答案

  1. 编译速度差异原因

    • 语法糖处理:Kotlin 需额外解析数据类、扩展函数、空安全等特性,增加语义分析时间。
    • 类型推断开销:Kotlin 的智能类型推断(如if (obj != null) obj.自动推断非空)需编译器进行数据流分析,比 Java 的显式类型声明更耗时。
    • 混合编译成本:同时处理.kt.java文件时,Kotlin 编译器需兼容 Java 字节码,增加中间处理步骤。
  2. 优化手段

    • 启用增量编译:在gradle.properties中添加:
      kotlin.incremental=true
      android.enableIncrementalCompilation=true
      

      仅重新编译变更的文件,减少重复工作。
    • 升级编译器版本:新版 Kotlin 编译器(如 1.8+)优化了类型推断算法,编译速度提升 30% 以上。
    • 分离公共模块:将纯 Kotlin 逻辑(如数据类、工具类)与平台相关代码分离,减少每次编译的文件扫描范围。

三、打包流程核心差异总结(面试必背)

对比维度JavaKotlin核心原理
源码输入.java文件.kt文件(需 Kotlin 编译器转为.class)Kotlin 是 JVM 语言超集,最终均生成 JVM 字节码,依赖kotlin-stdlib运行时库
语法糖处理无(手动编写样板代码)自动生成数据类方法、空安全检查、扩展函数静态方法编译器在语义分析阶段插入额外逻辑,字节码层面与 Java 等价(但开发效率更高)
依赖库Java 标准库 + 框架(如 Spring)额外依赖 Kotlin 标准库 + 协程库 + 扩展插件(如 kotlin-android-extensions)Kotlin 特性需运行时支持,打包时需包含相关库(可通过 ProGuard 剥离未使用部分)
编译插件仅需 Android Gradle 插件额外需kotlin-android插件 + 可能的协程 / 序列化插件插件负责 Kotlin 特有的语法转换,如data classcopy方法生成
APK 体积影响较小(无额外运行时库)略大(包含 Kotlin 标准库,约 100-300KB,可优化)语法糖生成的额外字节码和运行时库是体积增加的主因,通过 R8/ProGuard 可大幅缩减(典型项目增加 < 5%)
多平台兼容性仅限 JVM/Android支持 JVM/Android/JS/Native(需 Kotlin/Native 编译器)Kotlin 跨平台依赖统一的 IR(中间表示),Android 打包仅需 JVM 目标编译,与 Java 流程高度兼容

APK 打包流程(Java/Kotlin 通用):


源码编写(.java/.kt) → 编译(Java: javac;Kotlin: kotlinc) 

→ .class 文件 → 字节码优化(ProGuard/R8) 

→ 资源合并(aapt/aapt2 生成 R.java & resources.arsc) → AIDL 处理(生成 Java 接口文件) 

→ 脱糖(D8/R8 处理 Java 8 特性) → DEX 转换(D8/R8 生成 classes.dex) 

→ 多 DEX 处理(MultiDex) → APK 打包(aapt2 生成未签名 APK) 

→ 签名(apksigner) → 对齐(zipalign) → 最终 APK

关键步骤详解

  1. 源码编译

    • Java:通过javac.java文件编译为.class字节码6。
    • Kotlin:通过kotlinc编译.kt文件,自动处理数据类、空安全等语法糖,生成.class字节码(依赖kotlin-stdlib)45。
  2. 字节码优化

    • ProGuard/R8:压缩代码(移除未使用类)、混淆(重命名类 / 方法)、优化(内联函数、常量折叠)79。
    • Kotlin 特有:协程代码编译为状态机(Continuation接口实现类),需保留kotlinx.coroutines相关类312。
  3. 资源合并

    • aapt/aapt2:编译res目录和AndroidManifest.xml,生成R.java(资源索引)和resources.arsc(资源二进制数据)1816。
    • Kotlin 扩展:若使用kotlin-android-extensions插件,会生成kotlinx.android.synthetic扩展属性8。
  4. AIDL 处理(Java 项目)

    • 编译.aidl文件为 Java 接口,供跨进程通信使用11。
  5. 脱糖(Desugaring)

    • D8/R8:将 Java 8 特性(如 Lambda、Stream)转换为 Android 兼容的字节码912。
  6. DEX 转换

    • D8/R8:将.class文件转为.dex格式(Dalvik 字节码),支持多 DEX(解决 65536 方法数限制)8916。
    • Kotlin 协程:依赖kotlinx-coroutines-core库,生成状态机类(如BlockKt$withContext$1)312。
  7. 多 DEX 处理

    • 当方法数超过限制时,启用MultiDex,将代码拆分到多个.dex文件,需在build.gradle中配置multiDexEnabled true31319。
  8. APK 打包

    • aapt2:将classes.dex、资源文件、AndroidManifest.xml等打包为未签名 APK16。
  9. 签名与对齐

    • apksigner:使用keystore签名(V1/V2/V3 签名),生成签名后的 APK1017。
    • zipalign:优化 APK 磁盘布局,减少内存占用(资源文件 4 字节对齐)118。

 

相关文章:

Android学习总结之Java和kotlin区别

一、空安全机制 真题 1&#xff1a;Kotlin 如何解决 Java 的 NullPointerException&#xff1f;对比两者在空安全上的设计差异 解析&#xff1a; 核心考点&#xff1a;Kotlin 可空类型系统&#xff08;?&#xff09;、安全操作符&#xff08;?./?:&#xff09;、非空断言&…...

C++笔记-二叉搜索树(包括key,key/value搜索场景等)

1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 1.若它的左子树不为空&#xff0c;则左子树上所有结点的值都小于等于根结点的值若它的右子树不为空&#xff0c;则2.右子树上所有结点的值都大于等于根结点…...

【从零开始学习RabbitMQ | 第二篇】生成交换机到MQ的可靠性保障

目录 ​编辑前言 交换机 Direct交换机与Fanout交换机的差异 Topic交换机 Topic交换机相比Direct交换机的差异 生成我们的交换机&#xff0c;队列&#xff0c;以及绑定关系 基于代码去生成交换机和队列 基于注解去声明队列和交换机 消息转换器 消息队列的高可靠性 发送…...

在 Sheel 中运行 Spark:开启高效数据处理之旅

在大数据处理领域&#xff0c;Apache Spark 凭借其强大的分布式计算能力&#xff0c;成为了众多开发者和企业处理海量数据的首选工具之一。而 Sheel 作为一种便捷的运行环境&#xff0c;在其中运行 Spark 可以充分发挥两者优势&#xff0c;实现高效的数据处理与分析。本文将详细…...

前端、XSS(跨站脚本攻击,Cross-Site Scripting)

XSS 攻击的三种主要类型 存储型 XSS&#xff08;持久型&#xff09; 原理&#xff1a;恶意脚本被永久存储在服务器&#xff08;如数据库、评论内容&#xff09;&#xff0c;用户访问包含恶意脚本的页面时触发示例&#xff1a;攻击者在论坛的评论区提交 &#xff0c;其他用户查…...

第六节:图像基本操作-像素级操作

一、数字图像处理基础 1.1 图像数字化原理 数字图像本质上是二维离散信号&#xff0c;由按矩阵排列的像素点构成。每个像素点的数值代表特定位置的亮度或色彩信息... 1.2 OpenCV核心数据结构 import cv2 import numpy as np# 读取图像文件 img cv2.imread(image.jpg)# 获取…...

【东枫科技】代理销售 NVIDIA DGX Spark 您的桌上有一台 Grace Blackwell AI 超级计算机。

NVIDIA GB10 Grace Blackwell超级芯片 FP4 AI 性能达到 1,000 AI TOPS 128GB 一致、统一的系统内存 ConnectX-7 智能网卡 高达 4TB 存储空间 150毫米长 x 150毫米宽 x 50.5毫米高 NVIDIA DGX™ Spark 搭载 NVIDIA GB10 Grace Blackwell 超级芯片&#xff0c;以节能紧凑的外形提…...

即插即用!长安汽车复旦提出LMPOcc:长期记忆先验实现占用预测任务新SOTA

导读 在基于视觉的自动驾驶感知算法当中&#xff0c;3D语义占用预测任务可以出色的对静态场景和动态目标同时进行建模&#xff0c;实现细粒度的场景理解&#xff0c;目前受到了来自学术界和工业界的广泛关注。 ©️【深蓝AI】编译 论文题目&#xff1a;ConRFT: A Reinfo…...

Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷

&#x1f680; Kubernetes弹性伸缩&#xff1a;让应用自动应对流量洪峰与低谷 &#x1f30d; 什么是弹性伸缩&#xff1f; 弹性伸缩&#xff08;Auto Scaling&#xff09;是指系统能够根据实时负载自动调整计算资源&#xff0c;以优化性能并降低成本。在 Kubernetes&#xff0…...

深入解析 Linux/Unix 通信机制:从原理到观测实践

深入解析 Linux/Unix 通信机制&#xff1a;从原理到观测实践 配图建议&#xff1a;Linux系统架构与通信机制全景示意图 一、开篇&#xff1a;理解“一切皆文件”的哲学 Unix/Linux 操作系统的核心灵魂在于其独特的设计哲学。当 Dennis Ritchie 和 Ken Thompson 在贝尔实验室开…...

Vue 2.0 详解全教程(含 Axios 封装 + 路由守卫 + 实战进阶)

目录 一、Vue 2.0 简介1.1 什么是 Vue&#xff1f;1.2 Vue 2.x 的主要特性 二、快速上手2.1 引入 Vue2.2 创建第一个 Vue 实例 三、核心概念详解3.1 模板语法3.2 数据绑定3.3 事件绑定3.4 计算属性 & 侦听器 四、组件系统4.1 定义全局组件4.2 单文件组件&#xff08;*.vue …...

《Python星球日记》 第36天:线性代数基础

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、标量、…...

使用 Spring Boot 构建 REST API

使用 Spring Boot 构建 REST API 使用 Spring Boot 构建 REST API1. Spring Initializr构建springboot2. API 合同 & JSONAPI 协定什么是 JSON&#xff1f; 3.先测试什么是测试驱动开发&#xff1f;测试金字塔Red&#xff0c; Green&#xff0c; Refactor 循环 4. 实施 GET…...

PHP分页显示数据,在phpMyadmin中添加数据

<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //设置字符集为utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //记录总条数$count。 $pagesize10;//每…...

Spring Boot操作MongoDB的完整示例大全

以下是基于Spring Boot操作MongoDB的完整示例大全&#xff0c;涵盖增删改查、聚合查询、索引、事务等核心功能&#xff1a; 一、基础CRUD操作 1. 环境配置 依赖配置&#xff08;pom.xml&#xff09; <dependency><groupId>org.springframework.boot</groupId…...

SpringCloud入门教程合集(1)-SpringCloud简介与Eureka+Feign实现服务注册中心、服务提供与服务消费

场景 SpringCloud 总体架构与核心子项目 SpringCloud 总体架构 1. 基础设施层 服务注册与发现&#xff1a;Eureka/Nacos 配置中心&#xff1a;Spring Cloud Config/Nacos 消息总线&#xff1a;Spring Cloud Bus 2. 服务通信层 负载均衡&#xff1a;Ribbon/LoadBalancer…...

【Linuc】深入理解 Linux 文件权限

文章目录 一、权限基础解析1. 权限三元组2. 权限类型与数字映射二、查看文件权限三、修改权限实战1. chmod 命令符号模式数字模式(推荐)2. chown 修改归属四、特殊权限机制1. SetUID (Set User ID)2. SetGID (Set Group ID)3. Sticky Bit五、高级权限管理1. 默认权限控制2. A…...

ExtraMAME:复古游戏的快乐“时光机”

嘿&#xff0c;小伙伴们&#xff01;今天电脑天空要给大家安利一款超有趣的软件——ExtraMAME&#xff01;如果你对复古街机游戏念念不忘&#xff0c;那它绝对能成为你的快乐源泉&#xff0c;带你瞬间穿越回那个充满游戏机的黄金时代。 ExtraMAME是一款基于MAME&#xff08;Mu…...

没有 Mac,如何把 iOS App 成功上架?

开发者的 iOS 上架折腾记&#xff1a;没有 Mac&#xff0c;也能搞定&#xff1f; 最近在帮朋友把一个跨平台 Flutter 项目上架到 App Store&#xff0c;结果被 iOS 上架的那套流程卡得头都大了。其实这也不是第一次碰壁了——每次到“申请证书 打包 上传”的时候&#xff0c…...

使用VMware Workstation pro 17.5.1在Windows上安装Ubuntu 24.04.2的 详细步骤

一、准备工作 1. 下载Ubuntu 24.04.2 ISO镜像 官方下载地址&#xff1a;Ubuntu 24.04.2 (Noble Numbat) 选择 ubuntu-24.04.2-desktop-amd64.iso&#xff08;桌面版&#xff09;或 ubuntu-24.04.2-live-server-amd64.iso&#xff08;服务器版&#xff09;。 2. 确认系统要求…...

栈与队列详解及模拟实现

目录 ​​一、栈&#xff08;Stack&#xff09;&#xff1a;后进先出​ ​​1.1 什么是栈​ ​​1.2 栈的使用​​ ​​1.3 栈的模拟实现​ ​​1.4 栈的经典应用​​ ​​二、队列&#xff08;Queue&#xff09;&#xff1a;先进先出​ ​​2.1 什么是队列 2.2 队列的使…...

Cursor无法SSH远程连接服务器免密登录问题

在本地机器和Ubuntu服务器之间实现SSH远程免密连接&#xff0c;可按如下步骤操作&#xff1a; 1. 生成SSH密钥对 在本地机器上开启终端&#xff0c;使用以下命令生成SSH密钥对&#xff1a; ssh-keygen -t rsa按提示操作&#xff0c;一般直接回车&#xff0c;这样密钥会生成在…...

【Vue】全局事件总线 TodoList 事件总线

目录 一、 实现所有组件看到x事件 二、 实现$on $off 以及 $emit 总结不易~ 本章节对我有很大的收获&#xff0c; 希望对你也是&#xff01;&#xff01;&#xff01; 本节素材已上传至Gitee&#xff1a;yihaohhh/我爱Vue - Gitee.com 全局事件总线图&#xff1a; 本节素材…...

动态规划背包问题

一、0-1背包问题 0-1背包问题就是给定n个物品和一个容量为C的背包&#xff0c;物品i的重量是Wi,其价值是Vi。问&#xff1a;应该如何选择装入背包的物品&#xff0c;使总价值最大且总重量不超过C&#xff1f; 1.确定状态表示 dp[i][j] 表示在背包容量为j时&#xff0c;从下标…...

ctfshow web入门 web49

信息收集 此%非彼%&#xff0c;%0a中的%不会被识别&#xff0c;因为识别之前就已经自动转化为了换行符 所以和之前一样的解法&#xff0c;没什么好说的 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|…...

AI+浏览器自动化:Nanobrowser Chrome 扩展的使用「详细教程」

AI+浏览器自动化:Nanobrowser Chrome 扩展的使用「详细教程」 一、前言二、Nanobrowser简介2.1 项目背景2.2 核心特性三、安装与配置3.1 安装方式3.1.1 Chrome Web Store安装3.1.2 手动安装最新版3.2 基本配置3.2.1 添加API Key3.2.2 选择模型3.2.3 其他设置四、核心功能详解4…...

【表设计】外键的取舍-分布式中逐渐消失的外键

在分布式大行其道的今天&#xff0c;为什么外键约束越来越少&#xff1f; 外键-数据链接带来强制完整性 在关系型数据库中&#xff0c;外键&#xff08;Foreign Key&#xff09;可以用于建立和强制两个表之间的数据链接。 在层次数据结构一篇的闭包表简单设计中&#xff0c;…...

HarmonyOS 5.0 分布式数据协同与跨设备同步​​

大家好&#xff0c;我是 V 哥。 使用 Mate 70有一段时间了&#xff0c;系统的丝滑使用起来那是爽得不要不要的&#xff0c;随着越来越多的应用适配&#xff0c;目前使用起来已经和4.3的兼容版本功能差异无碍了&#xff0c;还有些纯血鸿蒙独特的能力很是好用&#xff0c;比如&am…...

多行文本省略

方式1 兼容性不好 height: 100px; line-height: 25px; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4;方式2 利用浮动环绕、空白元素站位margin-top调整位置 <div class"wrap"><div class"more"…...

Adobe卸载清理工具Creative Cloud Cleaner Tool下载

Adobe Creative Cloud Cleaner Tool 是 Adobe 公司官方推出的一款卸载清理工具&#xff0c;主要用于清理 Creative Cloud 应用程序在安装、更新或卸载过程中可能遗留下来的错误配置文件、缓存、注册表项或其他系统级残留内容。相比一般的卸载程序&#xff0c;它更深入地处理系统…...

分布式、高并发-Day03

以下是 Day 3 详细学习内容&#xff08;线程池拒绝策略实战&#xff1a;DiscardOldestPolicy与CallerRunsPolicy&#xff0c;30 分钟完整计划&#xff09;&#xff0c;包含策略原理、分步代码实战和场景解析&#xff1a; &#x1f4d6; 今日学习目标 掌握DiscardOldestPolicy…...

高等数学第四章---不定积分(4.4有理函数的不定积分2)

&4.4有理函数的不定积分2 篇幅有限制&#xff0c;例题的解答会占大量字符&#xff0c;html限制字符为22000个左右。这里继续探讨上文的有理函数的不定积分。 一、三角函数有理式的不定积分 由 sin ⁡ x \sin x sinx, cos ⁡ x \cos x cosx 以及常数经过有限次加、减、…...

C++中指针使用详解(4)指针的高级应用汇总

C 中指针的高级应用非常丰富&#xff0c;掌握这些内容能让你写出更高性能、更底层控制力强的代码。下面是应用模块梳理和例子讲解。 目录预览 函数指针与回调机制指针数组 vs 数组指针指针与类成员函数&#xff08;成员函数指针&#xff09;智能指针&#xff08;unique_ptr, s…...

Java 8 非对称加密代码示例

以下是使用Java 8实现RSA非对称加密的完整代码示例&#xff0c;包括密钥生成、加密和解密过程。 1. 生成RSA密钥对 import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; impor…...

Linux环境基础与开发工具使用

1. Linux编译器vim 1.1 vim的基本概念讲解 vim有很多种模式&#xff0c;我们初学者常用的就是命令模式&#xff08;command mode&#xff09;、插入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08;last line mode&#xff09;。 命令/正常模式(Normal mode) …...

【BUG】‘DetDataSample‘ object has no attribute ‘_gt_sem_seg‘

问题&#xff1a; 使用mmdetection框架使用COCO格式训练自定义数据集时&#xff0c;其中模型使用HTC模型时出现如下问题&#xff1a; AttributeError: ‘DetDataSample’ object has no attribute ‘_gt_sem_seg’. Did you mean: ‘gt_sem_seg’? results self(**data, mode…...

C# Winforms 本地化 多语言支持 字符串资源

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

ts bug 找不到模块或相应类型的声明,@符有红色波浪线

解决方法&#xff1a;在env.d.ts文件中添加以下代码&#xff0c;这段代码是一个 TypeScript 的声明文件&#xff0c;用于让 TypeScript 知道如何处理 Vue 单文件组件&#xff08;.vue 文件&#xff09;的导入。 /// <reference types"vite/client" /> // 声明…...

赛灵思 XCZU11EG-2FFVC1760I XilinxFPGAZynq UltraScale+ MPSoC EG

XCZU11EG-2FFVC1760I 是 Zynq UltraScale MPSoC EG 系列中性能最强的器件之一&#xff0c;集成了四核 ARM Cortex-A53 应用处理器、双核 Cortex-R5 实时处理器与 Mali-400 MP2 GPU&#xff0c;并结合了 653,100 个逻辑单元与丰富的片上存储资源&#xff0c;可满足高性能计算、A…...

VSCode|IDEA|PyCharm无缝接入DeepSeek R1实现AI编程

文章目录 前言一、流程简介1. 获取DeepSeek R1的API密钥2. 在编程软件中下载安装 Continue 插件**IDEA**PyCharm 3. 配置Continue文件 二、使用体验利用 DeepSeek R1进行 AI 编程 前言 本文将介绍如何在 VSCode|IDEA|PyCharm 软件中接入 DeepSeek R1 实现 AI 编程&#xff0c;…...

深入浅出 PostgreSQL:从历史演进到高阶优化技术

引言 PostgreSQL 是一个免费开源的对象关系型数据库&#xff0c;既支持传统的 SQL 查询&#xff0c;也支持 JSON 等非关系数据类型&#xff0c;因其高度可扩展性和社区活跃度&#xff0c;已成为众多互联网、金融和企业级应用的首选数据库 (Introduction to PostgreSQL - W3Sch…...

塔能水泵节能方案:精准驱动工厂能耗优化

在工厂的能源消耗体系中&#xff0c;水泵作为关键的动力设备&#xff0c;其运行效率直接关系到整体能耗水平。传统水泵在长期运行中&#xff0c;受设计局限、工艺成本约束等因素影响&#xff0c;普遍存在效率低下、能源浪费严重的问题。塔能科技针对这一痛点&#xff0c;推出了…...

SSCLMD模型代码实现详解

SSCLMD模型代码实现详解 1. 项目源码结构 SSCLMD项目的源码结构如下&#xff1a; SSCLMD-main/ ├── README.md ├── ST4.xlsx ├── Supplementary File.docx ├── code/ │ ├── calculating_similarity.py │ ├── data_preparation.py │ ├── data_…...

【coze】故事卡片(图片、音频、文字)

【coze】故事卡片&#xff08;图片、音频、文字&#xff09; 1、创建智能体2、添加人设与回复逻辑3、添加工作流&#xff08;1&#xff09;创建工作流&#xff08;2&#xff09;添加大模型节点&#xff08;3&#xff09;添加提示词优化节点&#xff08;4&#xff09;添加豆包图…...

限免开关实施版本保护措施,保证项目灰度发布安全

迭代用户限免权限校验业务 新增限免开关实现普通用户权益更新&#xff0c;实施版本保护措施&#xff0c;保证项目灰度发布安全&#xff1b; // 是否展示限免标识 func (t *BasePrivilegeService) IsPromotionFree(p consumParams) bool {// 限免开关isFreeUseOpen : p.cfg.Vip…...

C#中从本地(两个路径文件夹)中实时拿图显示到窗口中并接收(两个tcp发送的信号)转为字符串显示在窗体中实现检测可视化

多窗口源码 C#中从本地&#xff08;两个路径文件夹&#xff09;中实时拿图显示到窗口中并接收&#xff08;两个tcp发送的信号&#xff09;转为字符串显示在窗体中实现检测可视化资源-CSDN文库 读图结果展示 字符串结果展示 利用TCP调试工具创建两个tcp 再次启动程序 就链接…...

了解一下OceanBase中的表分区

OceanBase 是一个高性能的分布式关系型数据库&#xff0c;它支持 SQL 标准的大部分功能&#xff0c;包括分区表。分区表可以帮助管理大量数据&#xff0c;提高查询效率&#xff0c;通过将数据分散到不同的物理段中&#xff0c;可以减少查询时的数据扫描量。 在 OceanBase 中操…...

生成了一个AI算法

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 1. 数据预处理 transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # MNIST单通道归一化 ]) train_da…...

C# 使用SunnyUI控件 (VS 2019)

前言&#xff1a;建议下载源码&#xff0c;源码中包含了各种控件的用法案例。 下载 帮助文档: 文档预览 - Gitee.comGitee: SunnyUI: SunnyUI.NET 是基于.NET Framework 4.0、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。GitHub: h…...

在 Win11 下安装 Wireshark 的详细步骤

目录 一、了解 Wireshark1. 作用和功能2. 使用步骤 二、下载安装包三、运行安装包四、使用 Wireshark1. 抓包2. 窗口介绍3. 过滤器&#xff08;显示 / 捕获过滤器&#xff09;4. 保存过滤后的报文1&#xff09;显示过滤器表达式2&#xff09;过滤表达式的规则 5. 封包列表6. 封…...