安阳市网站建设的公司,国内金融行业网站开发,wordpress插件手动升级,兰州互联网公司的排名哈哈哈#xff0c;前段时间#xff0c;面试的时候#xff0c;突然问到我Kotlin和Java的区别#xff0c;一下子把我问懵逼了#xff0c;确实没遇到问这个的#xff0c;想了下#xff0c;说了下Kotlin的编译时空检查机制#xff0c;代码更简洁#xff0c;很多封装好的AP…哈哈哈前段时间面试的时候突然问到我Kotlin和Java的区别一下子把我问懵逼了确实没遇到问这个的想了下说了下Kotlin的编译时空检查机制代码更简洁很多封装好的API可以直接调用Kotlin有Jetpack全家桶有协程有lateinit和by lazy懒加载机制等等后面着重问我协程去了但是我知道我也有很多没有答上。
今天自己做个总结
1. 语法简洁性 Kotlin 代码通常比 Java 更简洁减少了模板代码boilerplate。 Java 示例获取 List 的大小并遍历
ListString 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()); // 运行时崩溃NullPointerExceptionKotlin 通过可空类型和安全调用避免 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/setter、toString()、equals() 和 hashCode()。
data class的详细介绍和区别SerializableParcelable和data class的区别_data class parcelable-CSDN博客文章浏览阅读992次点赞24次收藏26次。序列化是将对象的状态属性数据转换为字节流或其他可存储或传输的格式的过程。主要作用存储将对象保存到文件或数据库中。传输在网络中传输对象比如在客户端与服务器之间传递数据。缓存将对象转化为可恢复的格式便于后续恢复使用。序列化后7. 什么是反序列化Deserialization反序列化是将序列化后的字节流或存储格式重新转换回原始对象的过程。主要作用从存储或传输的格式中重建对象。恢复数据到应用中便于程序继续使用。8.序列化与反序列化的用途网络传输。_data class parcelablehttps://blog.csdn.net/LoveFHM/article/details/143875848?spm1001.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 Castswitch 语法switch-casewhen类默认行为默认可继承默认 final
其他的
11. Kotlin的懒加载
在 Kotlin 中懒加载Lazy Initialization主要有两种方式
lazy适用于 val 只读变量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 }//第二次空检查}}}
}这里的双重检查 第一次检查 (instance ?:) 避免不必要的同步开销。如果已经初始化直接返回避免进入 synchronized 代码块提高性能。 同步代码块内部的第二次检查 (instance ?:) 由于多个线程可能同时通过第一次检查进入 synchronized所以 需要再次检查 instance 是否为 null防止重复创建实例。
为什么要用 Volatile Volatile 防止指令重排序保证可见性。 如果不加 Volatile可能会发生 部分初始化对象创建未完成别的线程就拿到不完整的实例。 避免可能的 NullPointerExceptionNPE。
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;}
}