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。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79703.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Survey]Remote Sensing Temporal Vision-Language Models: A Comprehensive Survey

BaseInfo TitleRemote Sensing Temporal Vision-Language Models: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2412.02573Journal/Time2024 arxivAuthor北航 上海AI LabCodehttps://github.com/Chen-Yang-Liu/Awesome-RS-Temporal-VLM 1. Introduction 傳統遙感局限…

jmeter讀取CSV文件中文亂碼的解決方案

原因分析? CSV文件出現中文亂碼通常是因為文件編碼與JMeter讀取編碼不一致。常見場景&#xff1a; 文件保存為GBK/GB2312編碼&#xff0c;但JMeter以UTF-8讀取。文件包含BOM頭&#xff08;如Windows記事本保存的UTF-8&#xff09;&#xff0c;但JMeter未正確處理。腳本讀取文…

Webview通信系統學習指南

Webview通信系統學習指南 一、定義與核心概念 1. 什么是Webview&#xff1f; 定義&#xff1a;Webview是移動端&#xff08;Android/iOS&#xff09;內置的輕量級瀏覽器組件&#xff0c;用于在原生應用中嵌入網頁內容。作用&#xff1a;實現H5頁面與原生應用的深度交互&…

【C++】C++中的命名/名字/名稱空間 namespace

C中的命名/名字/名稱空間 namespace 1、問題引入2、概念3、作用4、格式5、使用命名空間中的成員5.1 using編譯指令&#xff08; 引進整個命名空間&#xff09; ---將這個盒子全部打開5.2 using聲明使特定的標識符可用(引進命名空間的某個成員) ---將這個盒子中某個成員的位置打…

Arduino IDE中離線更新esp32 3.2.0版本的辦法

在Arduino IDE中更新esp32-3.2.0版本是個不可能的任務&#xff0c;下載文件速度極慢。網上提供了離線的辦法&#xff0c;提供了安裝文件&#xff0c;但是沒有3.2.0的版本。 下面提供了一種離線安裝方法 一、騰訊元寶查詢解決辦法 通過打開開發板管理地址&#xff1a;通過在騰…

【工具使用-數據可視化工具】Apache Superset

1. 工具介紹 1.1. 簡介 一個輕量級、高性能的數據可視化工具 官網&#xff1a;https://superset.apache.org/GitHub鏈接&#xff1a;https://github.com/apache/superset官方文檔&#xff1a;https://superset.apache.ac.cn/docs/intro/ 1.2. 核心功能 豐富的可視化庫&…

算法每日一題 | 入門-順序結構-三角形面積

三角形面積 題目描述 一個三角形的三邊長分別是 a、b、c&#xff0c;那么它的面積為 p ( p ? a ) ( p ? b ) ( p ? c ) \sqrt{p(p-a)(p-b)(p-c)} p(p?a)(p?b)(p?c) ?&#xff0c;其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21?(abc) 。輸入這三個數字&#xff0c;…

MongoDB入門詳解

文章目錄 MongoDB下載和安裝1.MongoDBCompass字段簡介1.1 Aggregations&#xff08;聚合&#xff09;1.2 Schema&#xff08;模式分析&#xff09;1.3 Indexes&#xff08;索引&#xff09;1.4 Validation&#xff08;數據驗證&#xff09; 2.增刪改查操作2.1創建、刪除數據庫&…

從Oculus到Meta:Facebook實現元宇宙的硬件策略

Oculus的起步 Facebook在2014年收購了Oculus&#xff0c;這標志著其在虛擬現實&#xff08;VR&#xff09;領域的首次重大投資。Oculus Rift作為公司的旗艦產品&#xff0c;是一款高端的VR頭戴設備&#xff0c;它為用戶帶來了沉浸式的體驗。Facebook通過Oculus Rift&#xff0…

安裝與配置Go語言開發環境 -《Go語言實戰指南》

為了開始使用Go語言進行開發&#xff0c;我們首先需要正確安裝并配置Go語言環境。Go的安裝相對簡單&#xff0c;支持多平臺&#xff0c;包括Windows、macOS和Linux。本節將逐一介紹各平臺的安裝流程及環境變量配置方式。 一、Windows系統 1. 下載Go安裝包 前往Go語言官網&…

網絡的搭建

1、rpm rpm -ivh 2、yum倉庫&#xff08;rpm包&#xff09;&#xff1a;網絡源 ----》網站 本地源 ----》/dev/sr0 光盤映像文件 3、源碼安裝 源碼安裝&#xff08;編譯&#xff09; 1、獲取源碼 2、檢測環境生成Ma…

多元隨機變量協方差矩陣

主要記錄多元隨機變量數字特征相關內容。 關鍵詞&#xff1a;多元統計分析 一元隨機變量 總體 隨機變量Y 總體均值 μ E ( Y ) ∫ y f ( y ) d y \mu E(Y) \int y f(y) \, dy μE(Y)∫yf(y)dy 總體方差 σ 2 V a r ( Y ) E ( Y ? μ ) 2 \sigma^2 Var(Y) E(Y - \…

Ros工作空間

工作空間其實放到嵌入式里就是相關的編程包 ------------------------------------- d第一個Init 就是類型的初始化 然后正常一個catkin_make 后 就會產生如devil之類的文件&#xff0c; 你需要再自己 終端 一個catkin_make install 一下 。這樣對應install也會產生&#xf…

qt國際化翻譯功能用法

文章目錄 [toc]1 概述2 設置待翻譯文本3 生成ts翻譯源文件4 編輯ts翻譯源文件5 生成qm翻譯二進制文件6 加載qm翻譯文件進行翻譯 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發經驗 &#x1f448; 1 概述 在 Qt 中&#xff0c;ts 文件和 qm 文件是用于國…

PyTorch 與 TensorFlow 中基于自定義層的 DNN 實現對比

深度學習雙雄對決&#xff1a;PyTorch vs TensorFlow 自定義層大比拼 目錄 深度學習雙雄對決&#xff1a;PyTorch vs TensorFlow 自定義層大比拼一、TensorFlow 實現 DNN1. 核心邏輯 二、PyTorch 實現自定義層1. 核心邏輯 三、關鍵差異對比四、總結 一、TensorFlow 實現 DNN 1…

1ms城市算網穩步啟航,引領數字領域的“1小時經濟圈”效應

文 | 智能相對論 作者 | 陳選濱 為什么近年來國產動畫、國產3A大作迎來了井噴式爆發&#xff1f;拋開制作水平以及市場需求的升級不談&#xff0c;還有一個重要原因往往被大多數人所忽視&#xff0c;那就是新型信息的完善與成熟。 譬如&#xff0c;現階段驚艷用戶的云游戲以及…

【計算機視覺】語義分割:Segment Anything (SAM):通用圖像分割的范式革命

Segment Anything&#xff1a;通用圖像分割的范式革命 技術突破與架構創新核心設計理念關鍵技術組件 環境配置與快速開始硬件要求安裝步驟基礎使用示例 深度功能解析1. 多模態提示融合2. 全圖分割生成3. 高分辨率處理 模型微調與定制1. 自定義數據集準備2. 微調訓練配置 常見問…

機器學習例題——預測facebook簽到位置(K近鄰算法)和葡萄酒質量預測(線性回歸)

一、預測facebook簽到位置 代碼展示&#xff1a; import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import…

對ubuntu的簡單介紹

目錄 1. 簡介 2. 核心特點 3. 系統架構與技術亮點 4. 適用場景 5. 優缺點分析 6. 安裝與配置建議 7. 未來發展方向 總結 1. 簡介 Ubuntu 是基于 Debian 的開源 Linux 操作系統&#xff0c;由 Canonical 公司&#xff08;創始人 Mark Shuttleworth&#xff09;提供商業支…

多商戶電商系統整套源碼開源,支持二次開發,構建多店鋪高效聯動運營方案

在數字化浪潮席卷全球的今天&#xff0c;電商行業競爭愈發激烈&#xff0c;多商戶電商平臺憑借其獨特的生態優勢&#xff0c;成為眾多企業和創業者的熱門選擇。一套優質的多商戶電商系統不僅能為商家提供穩定的銷售渠道&#xff0c;還能為平臺運營者創造巨大的商業價值。分享一…