Kotlin学习(四): 基本类型(Basic Types)

Versatile

本文是学习Kotlin的基本类型,Kotlin的基本类型与Java有一些不同,例如整数类型,Java是int表示,而Kotlin是Int表示;例如布尔类型,Java是boolean表示,而Kotlin是用Boolean表示。

在 Kotlin 中,所有变量的成员方法和属性都是一个对象,我们可以在任何变量上调用成员函数和属性。
在本文中,将会讲解经常被使用的类型:NumbersCharactersBooleansArraysStrings

Numbers(数值)

Kotlin处理数值的方式与Java类似,单又不完全相同,例如,数值没有隐式扩展转换,在默写情况下文字也略有不同。
Kotlin 提供了如下内建数值类型(与Java类似)

Type Bit width(字宽)
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

注意:字符不是kotlin中的数值类型

字面常量(Literal Constants)

对于整数值,有以下几种常量

  • 整型: 123
    • 长整型要加 L: 123L
  • 16进制: 0x0F
  • 二进制: 0b00001011

对于浮点数值

  • Doubles类型: 123.5, 123.5e10
  • Floats类型要加 f or F: 123.5f

注意:不支持8进制

数值中的下划线(1.1版开始)

Java8支持数值使用下划线类分割数字分组,可以使用下划线使数字常量更易读:

val oneMillion = 1_000_000
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

等同于

1000000
ffecde5e
11010010011010011001010010010010

表示法(Representation)

在Java平台上,数值被 JVM 虚拟机以字节码的方式物理存储的,除非我们需要做可空标识(比如说 Int?) 或者涉及泛型。

val a: Int = 10000
print(a === a) // 打印'true' ,与Java的‘===’一样
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // 打印`false`

另一方面,值是相等的

val a: Int = 10000
print(a == a) // 打印 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // 打印 'true'

显式转换(Explicit Conversions)

由于不同的表示,短类型不是长类型的子类型

//这是些伪代码,不能编译的
val a: Int? =1 // Int (java.lang.Integer)
val b: Long? = a // Long (java.lang.Long)
print( a == b ) // 打印 'false' ,由于 Long 类型的 equals() 只有和 Long 比较才会相同

短类型是不会隐式(自动)转换为长类型的,需要显示(手动)转换才行

val b: Byte = 1 // 
val i: Int = b // 错误,不能自动转换

改为显示(手动)转换

val i: Int = b.toInt() // 成功

数值类型支持的转换有下面几种

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

Kotlin会自动转换类型的,比如

val l = 1.toLong + 1 // Long  + Int => Long,自动转换成Long类型

运算符(Operations)

Kotlin支持标准的算术运算表达式,这些运算符被声明为相应类的成员。
对于位操作,没有特殊的字符,只是命名的函数可以以中缀形式调用,例如

val x = (1 shl 2) and 0x000FF000

支持的位运算操作符有(仅适用于IntLong类型)

  • shl(bits) – 带符号左移 (相当于 Java的 <<)
  • shr(bits) – 带符号右移 (相当于 Java的 >>)
  • ushr(bits) – 无符号右移 (相当于 Java的 >>>)
  • and(bits) – 按位与
  • or(bits) – 按位或
  • xor(bits) – 按位异或
  • inv() – 按位翻转

Characters(字符)

字符类型用 Char 表示,不能直接当做数值来使用

fun check(c: Char) {
    if (c == 1) { // 错误:类型不匹配
        // ...
    }
}

字符文字用单引号括起来:'1',可以使用反斜杠转义特殊字符,支持以下转义序列:\ t,\ b,\ n,\ r,',\“,\和\ $。
要编码任何其他字符,使用Unicode转义序列语法:'\ uFF00'。

下面是将字符类型显示(手动)转换成Int类型

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9') 
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 显示转换为数值类型
}

Boleans(布尔值)

Kotlin的Boolean同Java的boolean类型一样,只有truefalse

Boolean的操作同Java一样

  • || – 或者
  • && – 并且
  • ! - 非

Arrays(数组)

Kotlin中的数组由Array表示,通过[]调用getset方法,支持size属性,以及其他,下面是Array代码

class Array<T> private constructor() {
    val size: Int
    fun get(index: Int): T
    fun set(index: Int, value: T): Unit

    fun iterator(): Iterator<T>
    // ...
}

可以使用 arrayOf() 创建Array,arrayOf(1, 2, 3) 创建了一个[1, 2, 3] 的数组。
可以使用 arrayOfNulls() 创建一个指定大小的空Array。

另外也可以使用工厂函数,该函数采用数组大小​​和函数,该函数可以返回每个数组元素的索引的初始值

// 创建 Array<String> 内容为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })

注意:和 java 不一样,arrays 在 kotlin 中是不可变的。这意味这 kotlin 不允许我们把 Array<String>转为 Array<Any>,这样就阻止了可能的运行时错误(但可以用 Array<outAny>)

Kotlin 有专门的类来表示原始类型: ByteArray, ShortArray, IntArray 等等。这些类与Array类没有继承关系,但它们具有相同的方法和属性集。也有相应的工厂功能

val x: IntArray = intArrayOf(1, 2, 3) // 创建一个Int类型的Array
x[0] = x[1] + x[2]

Strings(字符串)

字符串由类型String表示,字符串是不可变的。字符串的元素是可以通过索引操作访问的字符:s [i]。一个字符串可以用一个for循环迭代

for (c in str) {
    println(c)
}

字符串字面量(String Literals)

Kotlin 有两种类型的 String :一种是可以带分割符的,一种是可以包含新行以及任意文本的。
带分割符的 String 与Java 的 String类似

val s = "Hello World!\n"

如果String 是由三个引号包裹的("""),不可以包含分割符但可以包含其它字符:

val text = """
    for (c in "foo")
        print(c)
"""

可以使用trimMargin()来删除空格

val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

默认为|用作边距前缀,可以选择另一个字符并将其作为参数传递,如trimMargin(“>”)

字符串模版(String Templates)

字符串可以包含模板表达式,前面介绍了可以使用'${}'模版表达式

val s = "abc"
val str = "$s.length is ${s.length}" //识别为 "abc.length is 3"

还有一种是可以使用$模版表达式

val i = 10
val s = "i = $i" // 识别为 "i = 10"

模版表达式同样可以用于由三个引号包裹的String,如下面的,${"$"}表示$符号

val price = """
${'$'}9.99
"""
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容