【Kotlin精简】第1章 基础类型

1 Kotlin基础类型

Kotlin中,我们可以调用任何变量的成员函数和属性,从这个角度来说,一切皆对象。某些类型可以有特殊的内部表现。例如:数字字符布尔型在运行时可以表现为基础类型(primitivetypes)

1.1 数值

Kotlin的基本数值类型包括ByteShortIntLongFloatDoubleBoolean等。不同于Java的是,字符不属于数值类型,是一个独立的数据类型

1.1.1 字面常量

Long类型:用L​做标记,​​123L​​

float 类型:用f或者F标记:​​123.5f​​

1.1.2 数值字面值中的下划线

下划线可以使数值常量更具可读性:

kotlin 复制代码
val oneMillion = 1_000_000

1.1.3 表现形式

== 值对比

=== 地址对比

1.1.4 显式转换

小类型不会隐式转换成大类型。不通过显示转换,我们无法把一个Byte​赋值给​Int

kotlin 复制代码
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR

val i: Int = b.toInt()  // OK: explicitly widened

val l = 1L + 3 // Long + Int => Long

每个数值类型都支持如下转换:

​​toByte(): Byte​​

​​toShort(): Short​​

​​toInt(): Int​​

​​toLong(): Long​​

​​toFloat(): Float​​

​​toDouble(): Double​​

​​toChar(): Char​​

1.1.5 运算

如下是位运算操作符的完整列表(只用于​​Int​​​和​​Long​​):

shl(bits)​​​ - 有符号左移(Java 的 ​​<<​​)

​​shr(bits)​​​ - 有符号右移(Java 的 ​​>>​​)

​​ushr(bits)​​​ - 无符号右移(Java 的 ​​>>>​​)

​​and(bits)​​ - 位的与运算

​​or(bits)​​ - 位的或运算

​​xor(bits)​​ - 位的异或运算

1.1.6 浮点数比较

相等检查:​​a == b​​​和​​a != b​​

比较操作符:​​a < b​​​,​​a > b​​​,​​a <= b​​​,​​a >= b​​

范围初始化和范围检查:​​a...b​​​,​​xina...b​​​,​​x!ina...b​​

当操作数​​a​​​和​​b​​​静态已知为类型​​Float​​​或​​Double​​​,以及它们对应的可空类型。但是为了支持通用的使用场景以及提供完整的排序,当操作数不是浮点数的静态类型(如​​Any​​​、​​Comparable<...>​​​,类型参数)时,运算操作会使用​​Float​​​和​​Double​​​​​equals​​​和​​compareTo​​实现,这会导致异与标准,因此:

​​NaN​​等于它自己

​​NaN​​​大与所有其他元素,包括​​POSITIVE_INFINITY​​

-0.0​​​小于​​0.0​​

1.2 字符

​​Char​​表示字符,不能直接用作数值:

字符用单引号来表示:​​'1'​​。特殊字符可以使用反斜杠转义

特殊字符可以用反斜杠转义。支持的转义序列有:​​\t​​​、​​\b​​​​​\n​​​​​\r​​​、​​\'​​​、​​\"​​​​​\\​​​​​\$​​​。如果要编译其他字符,可以使用 Unicode转义序列语法:​​\uFF00​​

我们可以显示地把一个字符转换成一个Int数值:

kotlin 复制代码
fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}

就像数值那样,字符的空引用也会自动装箱。装箱操作不会保留字符的身份(identity)。

1.3 字符串

字符串由 ​​String​​​ 表示。字符串是不可变的。字符串的元素可通过下标访问:​​s[i]​​​。字符串可通过 ​​for​​ 循环遍历。

纯字符串通过三个引号(​​"""​​)来界定,它不会包含转义而且能够包含换行和任意字符:

kotlin 复制代码
val text = """
    for (c in "foo")
        print(c)
"""

可以通过 ​​trimMargin()​​ 去除开头的空字符:

kotlin 复制代码
// 默认情况下,`​​|​​​` 用作 `margin` 前缀,
// 但是也可以使用其他字符作为参数传给 `​​trimMargin​​​`,例如 ​​`trimMargin(">")`​​。
val text = """
    |Tell me and I forget
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

字符串可以包含模板表达式:

kotlin 复制代码
// 模板表达式以美元符号($)或大括号内的任意表达式
val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"

// 在纯字符串(不支持转义)中展示 ​​$​​ 符号
val price = """
${'$'}9.99
"""

1.4 布尔型

与Java一致。
​​Boolean​​​表示布尔型,有两个值:​​true​​​ 和 ​​false​​。

布尔的可空引用会自动装箱。

内置操作符包括:

​​||​​ - lazy disjunction

​​&&​​ - lazy conjunction

​​!​​ - negation

相关推荐
音视频牛哥7 分钟前
Android音视频开发:基于 Camera2 API 实现RTMP推流、RTSP服务与录像一体化方案
android·音视频·安卓camera2推流·安卓camera2推送rtmp·安卓camera2 rtsp·安卓camera2录制mp4·安卓实现ipc摄像头
2501_937145418 分钟前
2025 IPTV 源码优化版:稳定兼容 + 智能升级
android·源码·电视盒子·源代码管理·机顶盒
JIngJaneIL14 分钟前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
吃西瓜的年年39 分钟前
1. 初识C语言
c语言·开发语言
CHANG_THE_WORLD1 小时前
Python 字符串全面解析
开发语言·python
不会c嘎嘎1 小时前
深入理解 C++ 异常机制:从原理到工程实践
开发语言·c++
永远都不秃头的程序员(互关)2 小时前
C语言 基本语法
c语言·开发语言
永远都不秃头的程序员(互关)2 小时前
Java核心技术精要:高效实践指南
java·开发语言·性能优化
是Dream呀2 小时前
Python圣诞特辑:打造一棵会唱歌、会下雪的魔法圣诞树
开发语言·python·pygame
未来之窗软件服务2 小时前
幽冥大陆(四十一)美萍V10酒店门锁SDK C#语言仙盟插件——东方仙盟筑基期
开发语言·c#·仙盟创梦ide·东方仙盟·东方仙盟sdk·酒店智能门锁·东方仙盟 vos 智能浏览器