热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kotlin学习之-4.3基础类型

4.3基础类型Kotlin中,所有都是对象是因为我们可以调用任何对象的成员函数和属性。有一些类型是内建的,因为这些类型的实现是优化过的,但是使用的时候看起来和普通类是一样的。本节中我

4.3 基础类型

Kotlin中,所有都是对象是因为我们可以调用任何对象的成员函数和属性。有一些类型是内建的,因为这些类型的实现是优化过的,但是使用的时候看起来和普通类是一样的。本节中我们将介绍这些类型:数据类型,字符类型,布尔类型和数组。(number, character, boolean 和array)

数据类型 numbers

Kotlin中处理数据类型和Java方法很类似,但也不完全一样。例如,没有隐式地扩展数据类型字长,还有写法上也稍有不同。

Kotlin提供下面这些内置的数据类型来表示数字,这和Java很接近。

Type Bit width
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

注意字符类型不在数据类型中。

字符常量 Literal Constants

有如下几种给整数值的字符常量

  • 十进制:123
    • 长整型带L 123L
  • 16进制表示:0x0F
  • 二进制:0b00001011

注意:不支持八进制表示
Kotlin还支持浮点数的表示
- 默认是Double类型 : 123.5, 123.5e10
- Float 类型的要加上标记f或者F123.5f

数字表示中的下划线(从v1.1开始)

可以在比较长的数字中间加上下划线,这样更容易阅读

val OneMillion= 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecutiryNumber = 999_999_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

表示方法

在java平台上,数字都是存储成JVM 的基础类型,除非我们需要一个可能为空的数字变量的引用(例如Int?)或者使用了泛型。使用泛型的时候数字被自动封箱。

注意可能为空的自动封箱的数字和原来的数字不保证一致性。

val a: Int = 10000
print(a == a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // !!!Prints 'false'!!!

对应的, 非空的封箱,保持一致性。

val a: Int = 1000
print (a == a) // Prints 'true'
val boxedA: Int = a
val anotherBexedA: Int = a
print(boxedA == anotherBoxedA) // Prints 'true'

显式转换

由于不同的表达方式, 值域范围小的类型不是值域范围大的类型的子类型。
Kotlin不支持隐式转换:

val b: Byte = 1 // Ok
val i: Int = b // Error

可以显式转换:

val b: Byte = 1
val i: int = b.toInt() // OK, 显式的转换

每一种数值类型都支持如下转换操作:

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

缺少隐式转换很难被发现,因为类型是根据上下文推断的,并且算数操作符都被重载成适合改转换的。

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

操作符

kotlin支持标准的算数操作符,他们被定义成对应类的成员函数。编译器会把对应的函数调用优化成对应的指令。 详见 Operator overlading。

对于比特位的操作,没有定义特殊字符给这些运算符,只是用可以被内置的方式来命名这些函数。例如

val x = (1 shl 2) and 0x0000_FF00

下面是支持全部的比特操作(仅对IntLong 类型支持)

  • shl(bits) -带符号左移位,相当于(Java 的<<)
  • shr(bits) -带符号右移位,相当于(Java的>>)
  • ushl(bits) -不带符号左移位,相当于(Java 的<<<)
  • ushr(bits) -不带符号右移位,相当于(Java 的>>>)
  • and(bits) -按位与, 相当于(Java 的&)
  • or(bits) -按位或, 相当于(Java 的|)
  • xor(bits) -按位异或, 相当于(Java 的^)
  • inv() -按位取反, 相当于(Java 的~)

字符类型

Kotlin中字符是用Char来表示。 他们不直接被当做数值来用

fun check(c: Char) {
if (c == 1) { // Error, incompatible types
}
}

字符是用单引号括起来的字符表示:'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()
}

和数值一样,可以为空的引用会触发自动封箱。 这种情况下,不保证一致性。

布尔类型

布尔类型用Boolean来表示,有两个值truefalse
布尔类型在需要一个可以为空的引用时,也会自动封箱。
布尔类型内置的操作符包括:

  • ||
  • &&
  • !

数组类型

数组类型使用Array 来表示,有getset 函数(重载转换成[]),size 属性,和其他一些有用的函数

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

operator fun iterator(): Iterator
// ..
}

创建一个数组,我们可以使用库函数arrayOf(), 例如arrayOf(1, 2, 3)会创建数组[1, 2, 3]。 还可以使用库函数arrayOfNulls()来创建一个指定大小的空数组
还可以使用一个工厂函数,包含数组大小和一个可以根据坐标返回每个元素初始值的函数:

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

可以用[] 来访问数组,相当于调用了get()set()

注意:和Java中的数组不同,Kotlin中的数组是不可变的。这意味着在Kotlin中不允许我们把一个Array 赋值给一个Array, 这样可以防止可能的运行时错误。(但是可以使用Array, 详见Type Projections)

Kotin 还有定制的类来表示基础数据类型的数组来避免封箱带来的额外的开销,他们包括ByteArray, ShortArray, IntArray 等等。 这些类和Array 没有继承关系,但是他们有同样的函数接口和属性接口。每一个都有对应的工厂方法。

val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

字符串 Strings

字符串是用Strings这个类来表示的。 字符串是不可变的。字符串的单个字符可以通过坐标操作来访问:s[i]。一个字符串可以通过一个for循环来遍历。

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

字符串语法

Kotlin有两种字符串语法。转义字符串,可能包含有已经转义的字符;元字符串,包含换行和强制文字。
转义字符串和Java的字符串非常接近

val s = "Hello, world!\n"

转义方式和传统转义一样使用反斜线。

元字符串是用三个引号""" ,不包括任何转义,可以包含换行和任意其他字符。

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

可以通过trimMargin() 方法来去掉每行前面的空格

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

val trimed = text.trimMargin()
println($trimed)

输出是

Tell me and I forget.
Teach me and I remember.
Involve me and I learn.
(Benjamin Franklin)

默认参数是| 也可以使用其他字符。

字符串模板

字符串可以包含字符串模板表达式,例如代码可以判断哪些字符要被输出到字符串结果。一个模板表达式是用美元符开始$,包含一个简单变量名

val i = 10
val s = "i = $i" // "i = 10"

或者是接一个在{}中的完整表达式

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

字符串模板,在元字符串和转义字符串中都可以使用。
如果想要在元字符串中(元字符串不支持反斜线转义)使用美元符$,可以使用如下写法。

val price = """
${'$'}9.99
"""

推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
后果搞活棵_654_962
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有