Kotlin和Java區別

哈哈哈,前段時間,面試的時候,突然問到我Kotlin和Java的區別,一下子把我問懵逼了,確實沒遇到問這個的,想了下,說了下Kotlin的編譯時空檢查機制,代碼更簡潔,很多封裝好的API可以直接調用,Kotlin有Jetpack全家桶,有協程,有lateinit和by lazy懶加載機制等等,后面著重問我協程去了,但是我知道我也有很多沒有答上。

今天自己做個總結:

1. 語法簡潔性

🔹 Kotlin 代碼通常比 Java 更簡潔,減少了模板代碼(boilerplate)。

🔸 Java 示例(獲取 List 的大小并遍歷):

List<String> list = Arrays.asList("A", "B", "C");
for (String item : list) {System.out.println(item);
}

Kotlin

val list = listOf("A", "B", "C")
list.forEach { println(it) }

2. Null 安全

🔹 Java 中 NullPointerException (NPE) 是常見錯誤

String name = null; 
System.out.println(name.length()); // 運行時崩潰:NullPointerException

🔹 Kotlin 通過可空類型和安全調用避免 NPE:

var name: String? = null
println(name?.length) // 安全調用,避免 NPE
  • ? 允許 null
  • ?. 安全訪問,避免 NPE
  • !! 強制非空,可能引發異常,盡量少用。

3. 數據類 (Data Class)

🔹 Java 需要大量代碼來定義 POJO(數據類):

public class User {private String name;private int age;public User(String name, int age) { this.name = name; this.age = age; }public String getName() { return name; }public int getAge() { return age; }public void setName(String name) { this.name = name; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() { return "User{name='" + name + "', age=" + age + "}"; }
}

🔹 Kotlin 只需一行代碼:

data class User(val name: String, val age: Int)
  • 自動生成 getter/settertoString()equals()hashCode()

data class的詳細介紹和區別:Serializable,Parcelable和data class的區別_data class parcelable-CSDN博客文章瀏覽閱讀992次,點贊24次,收藏26次。序列化是將對象的狀態(屬性數據)轉換為字節流或其他可存儲或傳輸的格式的過程。主要作用存儲:將對象保存到文件或數據庫中。傳輸:在網絡中傳輸對象,比如在客戶端與服務器之間傳遞數據。緩存:將對象轉化為可恢復的格式,便于后續恢復使用。序列化后7. 什么是反序列化(Deserialization)?反序列化是將序列化后的字節流(或存儲格式)重新轉換回原始對象的過程。主要作用從存儲或傳輸的格式中重建對象。恢復數據到應用中,便于程序繼續使用。8.序列化與反序列化的用途網絡傳輸。_data class parcelable https://blog.csdn.net/LoveFHM/article/details/143875848?spm=1001.2014.3001.5502

4. 擴展函數 (Extension Functions)

🔹 Java 需要創建工具類來擴展已有類的功能

public class StringUtils {public static String capitalize(String str) {return str.substring(0, 1).toUpperCase() + str.substring(1);}
}
String result = StringUtils.capitalize("hello");

🔹 Kotlin 直接擴展類的方法

fun String.capitalizeFirst(): String = this.replaceFirstChar { it.uppercaseChar() }
val result = "hello".capitalizeFirst()

5. 函數式編程

Kotlin 支持 高階函數Lambda 表達式,讓代碼更優雅。

🔹 Java 的匿名內部類:

button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("Clicked");}
});

🔹 Kotlin 的 Lambda 表達式:

button.setOnClickListener { println("Clicked") }

6. 協程 vs. Java 線程

🔹 Java 使用線程管理并發,代碼較復雜:

new Thread(new Runnable() {@Overridepublic void run() {System.out.println("線程運行中...");}
}).start();

🔹 Kotlin 協程更高效,且不會阻塞線程

GlobalScope.launch {println("協程運行中...")
}
  • 協程比 Java 線程更輕量,可以高效處理并發任務。管理起來也很輕松,可以和生命周期綁定

Kotlin 協程(一)協程的定義及基礎使用_kotlin 協程使用-CSDN博客

7. Smart Cast(智能類型轉換)

🔹 Java 需要顯式類型轉換

Object obj = "Hello";
if (obj instanceof String) {String str = (String) obj; // 需要手動轉換
}

🔹 Kotlin 自動類型轉換

val obj: Any = "Hello"
if (obj is String) {println(obj.length) // Kotlin 自動轉換,無需 `(String) obj`
}
  • 智能類型推斷:Kotlin 可以自動推斷變量類型,無需顯式聲明,如 val name = "Lee" 而不需要 String name = "Lee";

?

8. when 取代 switch

🔹 Java switch-case 語法繁瑣

🔹 Kotlin when 語法更簡潔,when 更直觀,支持范圍判斷表達式返回值

9. 類默認 final

  • Java 類默認是 open 的,可以繼承,除非加 final

  • Kotlin 類默認 final,必須顯式 open 允許繼承

10.總結對比表

特性JavaKotlin
語法冗長簡潔
Null 安全可能導致 NPE避免 NPE
數據類需要手寫 getter/setterdata class 自動生成
擴展函數需要工具類直接擴展
高階函數需要匿名類直接支持 Lambda
并發線程(較重)協程(輕量)
類型轉換需手動轉換自動 Smart Cast
switch 語法switch-casewhen
類默認行為默認可繼承默認 final

其他的:

11. Kotlin的懶加載

在 Kotlin 中,懶加載(Lazy Initialization)主要有兩種方式:

  1. lazy適用于 val 只讀變量
  2. lateinit適用于 var 可變變量

Kotlin by lazy和lateinit的使用及區別_kotlin by lazy 與lateinit-CSDN博客

12.單例模式

傳統的懶漢式(lazy + @Volatile + synchronized)

class Singleton private constructor() {companion object {@Volatileprivate var instance: Singleton? = nullfun getInstance(): Singleton {return instance ?: synchronized(this) {//第一次空檢查instance ?: Singleton().also { instance = it }//第二次空檢查}}}
}

這里的雙重檢查:

  1. 第一次檢查 (instance ?:)

    • 避免不必要的同步開銷。
    • 如果已經初始化,直接返回,避免進入 synchronized 代碼塊,提高性能。
  2. 同步代碼塊內部的第二次檢查 (instance ?:)

    • 由于多個線程可能同時通過第一次檢查進入 synchronized,所以 需要再次檢查 instance 是否為 null,防止重復創建實例。

為什么要用 @Volatile

  • @Volatile 防止指令重排序(保證可見性)。

  • 如果不加 @Volatile,可能會發生 部分初始化(對象創建未完成,別的線程就拿到不完整的實例)。

  • 避免可能的 NullPointerException(NPE)。

lazy懶加載

class Singleton private constructor() {companion object {val instance: Singleton by lazy { Singleton() }}
}
  • 線程安全(lazy 默認是 LazyThreadSafetyMode.SYNCHRONIZED)。
  • 更簡潔,不需要 synchronized@Volatile

最簡單的單例

object Singleton {fun doSomething() {println("Hello from Singleton!")}
}
  • 線程安全,在 Kotlin 中,object 關鍵字天然是線程安全的,因為它的初始化由 JVM 類加載機制(Class Loading Mechanism) 保證,由于 JVM 類加載過程是線程安全的,所以 object 也是線程安全的!

  • 寫法簡單

  • 類加載時就初始化(餓漢式)

🔹 雙重檢查鎖的 Java 代碼

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {  // 第一次檢查(避免不必要的同步)synchronized (Singleton.class) {  // 線程同步if (instance == null) {  // 第二次檢查(確保只創建一次)instance = new Singleton();}}}return instance;}
}

?

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

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

相關文章

【大模型】大模型分類

大模型&#xff08;Large Models&#xff09;通常指參數量巨大、計算能力強大的機器學習模型&#xff0c;尤其在自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;等領域表現突出。以下是大模型的常見分類方式&#xff1a; 1. 按應用領域分類 …

centos中使用svn整理

centos中使用svn整理 1. 安裝 SVN 客戶端2. 常見 SVN 用法及示例2.1 創建 SVN 倉庫2.2 檢出&#xff08;Checkout&#xff09;項目2.3 添加文件到版本控制2.4 提交&#xff08;Commit&#xff09;更改2.5 更新&#xff08;Update&#xff09;本地工作副本2.6 查看文件狀態2.7 查…

游戲元宇宙崛起:AI代理IP驅動虛擬世界“無限可能”?

在科技飛速發展的當下&#xff0c;游戲元宇宙正以一種前所未有的姿態崛起&#xff0c;它猶如一顆璀璨的新星&#xff0c;吸引著無數人的目光。而AI代理IP&#xff0c;正成為驅動這個虛擬世界展現“無限可能”的關鍵力量。 「快代理&#xff5c;11年專注企業級代理IP云服務 —…

基于Servlet + JSP 的物業管理系統

Javaweb物業管理系統&#xff5c;Java&#xff5c;Servlet | JavaWeb&#xff5c;web網站&#xff5c; 分管理員登錄&#xff0c;用戶登錄。 一、內容 項目源碼 配套文檔 環境部署教程 項目運行教程 二、技術介紹 技術應用&#xff1a; Servlet JavaBean CSS JSP 開發環…

Billing的patient balance的2個例子

Billing的patient balance的2個例子 第一個例子 下面是 0852醫院的00005641的計算&#xff1a; 主保險 Allowable: 78.81 Applied:61.79 CoInsurance:17.02 第二保險 Allowable: 15.76 Applied:15.76 我們在計算時是用主保險的Allowable: 78.81&#xff…

哪些培訓課程適合學習PostgreSQL中級認證知識?

PostgreSQL 中級工程師 PGCP 認證培訓&#xff1a;由重慶思 莊經驗豐富的講師鄭全老師授課。課程內容系統全面&#xff0c;涵蓋了 PostgreSQL 數據庫從基礎到高級的知識&#xff0c;包括數據庫的安裝、建庫、用戶與角色管理等基礎內容&#xff0c;也有性能調優、索引原理與應用…

計算機二級MS之PPT

聲明&#xff1a;跟著大貓和小黑學習隨便記下一些筆記供大家參考&#xff0c;二級考試之前將持續更新&#xff0c;希望大家二級都能輕輕松松過啦&#xff0c;過了二級的大神也可以在評論區留言給點建議&#xff0c;感謝大家&#xff01;&#xff01; 文章目錄 考題難點1cm25px…

第5章 使用OSSEC進行監控(網絡安全防御實戰--藍軍武器庫)

網絡安全防御實戰--藍軍武器庫是2020年出版的&#xff0c;已經過去3年時間了&#xff0c;最近利用閑暇時間&#xff0c;抓緊吸收&#xff0c;總的來說&#xff0c;第5章開始進入主機安全&#xff08;HIDS&#xff09;領域了&#xff0c;2022年的時候有幸做過終端安全一段時間&a…

Android 低功率藍牙之BluetoothGattCallback回調方法詳解

BluetoothGattCallback 是 Android 中用于處理藍牙低功耗&#xff08;BLE&#xff09;設備通信的核心回調類。它負責處理與 BLE 設備的連接、服務發現、數據讀寫等操作的結果。以下是對 BluetoothGattCallback 的詳細解析&#xff1a; 1. onConnectionStateChange 觸發時機&am…

DeepSeek group-limited expert routing和負載均衡

Ref https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/model.py GitHub - deepseek-ai/EPLB: Expert Parallelism Load Balancer DeepSeek-V3 Technical Report DeepSeek的路由方法 class Gate(nn.Module):def __init__(self, args: ModelArgs):super().__…

Python的Pandas和matplotlib庫:讓數據可視化賊簡單

在數據爆炸的時代&#xff0c;數據可視化已成為數據分析的關鍵環節。Python 作為強大的編程語言&#xff0c;擁有眾多用于數據可視化的庫&#xff0c;而 pandas 庫在其中扮演著重要角色。它不僅能高效處理和分析數據&#xff0c;還具備強大的數據可視化功能&#xff0c;讓我們輕…

【代碼分享】基于IRM和RRT*的無人機路徑規劃方法詳解與Matlab實現

基于IRM和RRT*的無人機路徑規劃方法詳解與Matlab實現 1. IRM與RRT*的概述及優勢 IRM&#xff08;Influence Region Map&#xff09;通過建模障礙物的影響區域&#xff0c;量化環境中的安全風險&#xff0c;為RRT算法提供啟發式引導。RRT&#xff08;Rapidly-exploring Random…

ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包

用linuxdeployqt打包太麻煩&#xff0c;每次程序編譯都要用linuxdeployqt打包一次&#xff0c;而且每次都要很長時間&#xff0c;通過研究得出一個新的打包方法 1.用用linuxdeployqt得出依賴的庫文件&#xff08;只要沒有增加新模塊&#xff0c;只要用一次就可以&#xff09; …

Github 2025-03-06 Go開源項目日報 Top10

根據Github Trendings的統計,今日(2025-03-06統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10Terraform:基礎設施即代碼的開源工具 創建周期:3626 天開發語言:Go協議類型:OtherStar數量:40393 個Fork數量:9397 次關注人數:…

redis 與 DB 的一致性 7 種策略

為什么要使用 redis 做緩存?封底估算為什么是單行數據的QPS,而不是總的? 什么時候使用DB,Redis,本地緩存 數據的分類一致性的方案1. 先清除Redis,再更新 DB2. 先更新DB,再清除 Redis使用場景: 3. 延遲刪除與延遲雙刪使用場景 4. 監聽 binlog 清除5. 雙寫使用場景: 6. 監聽bin…

使用 Elasticsearch 進行集成測試初始化??數據時的注意事項

作者&#xff1a;來自 Elastic piotrprz 在創建應該使用 Elasticsearch 進行搜索、數據聚合或 BM25/vector/search 的軟件時&#xff0c;創建至少少量的集成測試至關重要。雖然 “模擬索引” 看起來很誘人&#xff0c;因為測試甚至可以在幾分之一秒內運行&#xff0c;但它們實際…

【selenium工具操作web頁面中的下拉框元素 】

使用F12定位下拉框中的元素 使用F12定位下拉框中的元素 1、有一類元素不是直接顯示的頁面上的&#xff0c;而是需要點擊某些其他元素后才會顯示在頁面上&#xff0c;比如這里的下拉框。 2、這類元素會有一個特點&#xff1a;鼠標如果移開(沒在元素上)&#xff0c;這些元素就會…

C++ set map 詳解

文章目錄 1. 容器2. set和multiset2.1 set2.1.1 構造函數2.1.2 insert和erase2.1.2.1 insert2.1.2.2 erase 2.1.3 查找和訪問2.1.3.1 set迭代器相關2.1.3.2 find && count2.1.3.3 范圍查找 2.2 multiset2.2.1 insert和erase2.2.2 find和count 2.3 set和multiset的在算法…

Unity網絡開發基礎 (2) 網絡協議基礎

本文章不作任何商業用途 僅作學習與交流 部分圖片來自Unity唐老師 目錄 1.虛擬模型 2.實際模型 TCP/IP 3.傳輸層協議 TCP/UDP TCP 協議詳解 1. 核心機制 2. 頭部格式&#xff08;20 字節最小&#xff09; UDP 協議詳解 1. 核心特點 2. 頭部格式&#xff08;固定 8 字節…

HTML label 標簽使用

點擊 <label> 標簽通常會使與之關聯的表單控件獲得焦點或被激活。 通過正確使用 <label> 標簽&#xff0c;可以使表單更加友好和易于使用&#xff0c;同時提高整體的可訪問性。 基本用法 <label> 標簽通過 for 屬性與 id 為 username 的 <input> 元素…