资讯专栏INFORMATION COLUMN

从零开始学 Kotlin 之「2」数据类型

Awbeci / 3174人阅读

摘要:前言大家好,这里是从零开始学之数据类型,本文首发于公众号,欢迎前往大家关注。输出布尔类型中的布尔类型用表示,它的值有和。若需要可空引用时,布尔类型的值会被装箱。此时程序会抛出异常最后从零开始学之数据类型到这里就结束了。

前言

大家好,这里是「从零开始学 Kotlin 之『2 』数据类型」,本文首发于公众号「Binguner」,欢迎前往大家关注。我会每周分享一些关于 Android 和其他方向的技术干货或一些关于认知的文章。学习一门技术最好的方式就是去教会别人,所以,开始今天的学习吧!

Kotlin 中的数据类型有基本数据类型应用类型

基本数据类型值直接存在了变量

应用类型的变量存储的是类型所指对象的存储地址

并且对于基本的数据类型(类似于 int,float 等),Kotlin 不会区分其是数据类型还是包装类型,在运行的时候,数据会用最高效的方式显示。

01 数字

Kotlin 提供了与 Java 类似的数字类型

类型 位宽度
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
01 - 1 转换函数

但是要注意:Kotlin 中没有隐式转换(就像 Java 中可以把 Int 转换为 Long),想要进行数字转换,需要使用转换函数

val a:Byte = 1
val b:Int = a  // 错误,编译器会提示所需类型为 Int,而提供的类型为 Byte
val c:Int = a.toInt()  // 成功

每种数字类型都支持以下的数字转换方法:

toByte(): Byte

toShort(): Short

toInt(): Int

toLong(): Long

toFloat(): Float

toDouble(): Double

toChar(): Char

01 - 2 装箱和拆箱

装箱是指将基本数据类型转换为其对应的包装器类型,
拆箱就是将包转器类型转换为基本数据类型。

在 Java 中:

Integer x = 123;  // 是一个装箱操作
int y = x;   // 是一个拆箱操作

而 Kotlin 中如何装箱拆箱呢?

val i1 = 123  // 拆箱
val i2:Int? = 123 // 装箱

想要了解其背后具体原理,可以自己动手将 Kotlin 代码编译成 Java 字节码一探究竟。

02 字面常量

为基本数据类型赋值的值称为字面常量。

Kotlin 中的字面常量有以下三种:

十进制

类似:123,Long 类型的用大写 L 标记:123L

十六进制

类似:0x0F

二进制

类似:0b00001011

另外,Kotlin 并不支持八进制。但却默认支持 Double 和 Float。
例如:123.5,123.4e10,123f,123F 这些在 Kotlin 中都是支持的。

在声明字面常量时,Kotlin 支持下划线的声明方式,使数字更加的易读:

val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
03 字符

Kotlin 中的字符使用 Char 表示,字符不能直接被当作数字来处理,必须通过 toInt() 方法被字符转换为数字类型

fun charToInt(c:Char):Int{
    return c.toInt()
}

Char 类的字面量用「" "」括起来,支持如下的转义序列:

t

b

n

"

"

$

04 字符串

Kotlin 中的字符串和 Java 一样用 String 申明,且不可变的。但是 Kotlin 中的字符串有一些新的特性。

04 - 1 新特性

通过下标访问字符串中的单个字符

val str = "Hello world!"
for (i in 0..str.length-1){
    print("${str[i]}_")
}  // 输出 H_e_l_l_o_ _w_o_r_l_d_!_

直接通过「+」操作符连接字符串

val s = "Hello" + "_"
println(s + "World")
// 输出 Hello_World
04 - 2 字符串处理

用 split() 分割字符串(split 函数的参数是一个 Regex 对象,写好正则表达式后用 toRegex() 方法即可)

println("123_456_789".split("_".toRegex()))
// 输出 [123, 456, 789]

用其它方法分割字符串

substring() 从指定位置开始分割字符串,或者提取指定范围的字符串

substringBefore() 分割掉指定位置之后的字符串

substringAfter() 分割掉指定位置之前的字符串

substringBeforeLast() 分割最后一个指定字符之后的字符串

substringAfterLast() 分割最后一个指定字符之前的字符串

val str = "Hello world!"
println("substring1: ${str.substring(5)}")
println("substring2: ${str.substring(0..4)}")
println("substring3: ${str.substring(6,12)}")
println("substringBefore: ${str.substringBefore(" ")}")
println("substringAfter: ${str.substringAfter(" ")}")
println("substringAfter: ${str.substringBeforeLast(" ")}")
println("substringAfterLast: ${str.substringAfterLast(" ")}")

// 运行结果:
substring1:  world!
substring2: Hello
substring3: world!
substringBefore: Hello
substringAfter: world!
substringAfter: Hello
substringAfterLast: world!
04 - 3 原始字符串

原始字符串用前后 3 个引号包围

val rawStr =
        """
        The first line,
        the second line,
        the third line.
        """.trimIndent()  // 注意:如果「"""」所在行只有空格,这个方法会省略这些空白
    println(rawStr)
// 输出:
The first line,
the second line,
the third line.

原始字符串通常还用 trimMargin() 处理,trimMargin() 的参数是一个边界前缀字符串,默认的参数是「|」,例如下面的例子,每一行的开头是「|」,那么就会以每一行的「|」为输出的开头进行字符输出。

val rawStr = 
            """
            |   The first line,
        |the second line,
        |the third line.
    """.trimMargin("|")
// 输出:
   The first line,
the second line,
the third line.
05 布尔类型

Kotlin 中的布尔类型用 Boolean 表示,它的值有 true 和 false。
若需要可空引用时,布尔类型的值会被装箱。

它支持的运算有:

|| 短路逻辑或

&& 短路逻辑与

! 逻辑非

06 可空的基本数据类型

Kotlin 致力于消除 NullPointerException 带来的影响。在 Java 中如果我们尝试引用一个空的对象,就会导致空指针异常,但是在 Kotlin 中则不会。下面,我们来看看 Kotlin 是怎么做到的。

Kotlin 对可空类型和非空类型做了区分,例如:「Int」不可空,「Int?」可空

var str :String? = null
println(str?.length)
// 输出 null,而不是报空指针异常

在引用可空类型的时候,为了避免空指针异常,Kotlin 要求必须进行非空检查:

var str :String? = "Hellp"
// val length1 = str.length 这样直接引用的时候,编译器会报错
//  Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
// 必须在可空类型上使用可空和非空断言。
val length = str?.length  // 此时如果 str 为空,运行返回 null
val length2 = str!!.length  // 此时如果 str 为空,运行会抛出异常
// 或者进行类型检查
val length3 = if(str != null) str.length else 0
07 Kotlin 中的一些其它类型 07 - 1 Any、Any?

Any 是 Kotlin 中所有非空类型的超类,相当于 Java 中的 Object。
可空类型的超类是 Any?

07 - 2 Unit

Unit 可以作为函数的返回类型,表示没有返回值或者返回值可以忽略。
注意 Unit 是一个类,并且继承自 Any。

这是定义它的源代码:

public object Unit {
    override fun toString() = "kotlin.Unit"
}

可以看到 Unit 是用 object 定义的单例类型,调用它的 toString() 方法,只会返回 「Kotlin.Unit」。

并且 Unit 的返回类型会返回 Unit 类型!!!

fun test(){}
val t = test()
println(t::class.java)
// 输出 class kotlin.Unit
07 - 3 Nothing

Kotlin 中函数返回类型如果用 Nothing 表示,则这个函数永远不会返回任何类型。

一些测试函数不会返回任何类型,就需要声明返回类型为 Nothing,它们通常抛出异常来结束运行。

fun test(msg:String):Nothing{
    throw IllegalStateException(msg)
}

test("test")
// 此时程序会抛出异常:Exception in thread "main" java.lang.IllegalStateException: test
最后

「从零开始学 Kotlin 之『2』数据类型」到这里就结束了。

一下记住这么多知识点有些困难,所以为了方便大家的记忆与复习,我做了一张思维导图放到下面,大家可以把图片保存下来,有时间便去回顾学到的东西。

推荐阅读:

从零开始学 Kotlin 之「1」基础篇

欢迎关注本文作者,这个系列的文章会首发在这里:

扫码关注 + 回复「kotlin」,获取我整理的最新版 Kotlin 学习视频。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71707.html

相关文章

  • 从零开始 Java 基础语法(中)

    摘要:下面开始今天的知识,先看下基础语法的总纲今天我们接着学习变量使用变量的注意事项数据类型和类型转换。推荐阅读从零开始学之基础语法上从零开始学之基础概述本文原创发布于微信公众号,编程思维成长正能量,关注并回复编程阅读等关键字获取免费学习资料 showImg(https://segmentfault.com/img/remote/1460000016134163); Java 基础断更一周了...

    chinafgj 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<