Kotlin基础类型

83 阅读3分钟

一、基础类型体系差异

Java设计

  • 采用基本类型(Primitive Types)与包装类型(Wrapper Types)双轨制
  • 基本类型(如int、boolean)直接存储数值,栈内存分配,默认值固定(如int默认0)
  • 包装类型(如Integer、Boolean)为堆内存对象,支持null值,用于集合存储和面向对象场景
  • 存在自动装箱/拆箱机制(JDK5+),但可能引发NullPointerException风险

Kotlin优化

  • 统一类型体系,所有类型均为对象(如Int、Boolean)
  • 编译时智能识别底层存储:数值型变量在JVM层面仍以基本类型存储优化性能
  • 消除双轨制复杂性,开发者无需手动选择类型,默认支持null安全机制

示例对比:

// Java
int num = 10;                  // 基本类型
Integer numObj = Integer(10);  // 包装类型

// Kotlin
val num: Int = 10              // 统一为对象类型

二、变量声明机制

Java特点

  • 类型前置声明(Type variableName
  • final关键字修饰不可变变量
  • 无类型推导,需显式声明类型

Kotlin革新

  1. 声明语法

    • val(value)声明只读变量(对应Java final变量)
    • var(variable)声明可变变量
    val immutable = "Hello"  // 不可重新赋值
    var mutable = 42         // 可修改值
    
  2. 类型推导

    • 支持右侧表达式自动推断类型
    • 复杂场景可显式声明类型
    val inferredInt = 123       // 自动推断为Int
    val explicitDouble: Double = 3.14
    
  3. 安全优势

    • 默认推荐使用val,减少意外修改风险
    • 编译器强制检查变量修改权限

三、数值类型增强特性

  1. 类型安全转换

    • 禁止隐式扩大转换(如Int→Long需显式toLong())
    val intValue = 10
    val longValue: Long = intValue.toLong()  // 必须显式转换
    
  2. 字面量优化

    • 长整型后缀统一用L(禁用小写l避免歧义)
    • 浮点型默认Double,Float需显式f/F后缀
    val longNum = 100L        // 明确的Long类型
    val floatNum = 3.14f      // Float类型
    
  3. 无符号类型

    • 实验性特性(kotlin.experimental)
    • 扩展数值范围:UInt、ULong等
    val uintValue: UInt = 255u
    

四、字符串处理升级

  1. 模板表达式

    • 支持${expression}嵌入变量/表达式
    • 简化字符串拼接操作
    val name = "Kotlin"
    println("Hello, $name! 1+2=${1+2}")  // 输出:Hello, Kotlin! 1+2=3
    
  2. 原生字符串

    • 三引号"""定义保留格式的文本块
    • 配合trimIndent()消除缩进
    val json = """
        {
            "language": "Kotlin",
            "version": 1.9
        }
    """.trimIndent()
    
  3. 类型安全比较

    • ==进行内容比较(等价Java的equals)
    • ===进行对象引用比较
    val str1 = "Text"
    val str2 = String("Text".toCharArray())
    
    println(str1 == str2)   // true(内容相同)
    println(str1 === str2)  // false(不同对象)
    

五、最佳实践建议

  1. 变量声明原则

    • 优先使用val,仅在需要修改时使用var
    • 复杂表达式建议显式声明类型,增强可读性
  2. 数值处理规范

    • 涉及不同精度计算时,主动进行显式类型转换
    • 金融计算场景推荐使用BigDecimal替代浮点类型
  3. 字符串使用技巧

    • 多行文本优先使用原生字符串
    • 模板表达式避免嵌套复杂逻辑

此设计使Kotlin在保持JVM高性能的同时,通过类型系统统一、空安全机制、智能推导等特性,显著降低编码复杂度,提升工程可靠性。开发者无需记忆基本/包装类型差异,代码简洁度与安全性同步提升。