Kotlin基础(一)——基本类型
来源:互联网 发布:李银桥和权延赤 知乎 编辑:程序博客网 时间:2024/06/06 04:03
- Numbers
- 数字常量
- 下划线分割的数字11开始
- 存储表示
- 显示转换
- 运算
- Characters
- Booleans
- Arrays
- Strings
- 字符串表示
- 字符串模板
- Numbers
Kotlin中,任何感官上的事务都是对象,我们可以调用任何变量的成员函数和成员属性。某些类型在实现时经过优化,它们在构建时生成,但是对程序员而言,就像使用普通类一样。在这一节将描述这些类型:Numbers、Characters、Booleans和Arrays。
Numbers
Kotlin处理数字的方式同Java很接近,但不雷同。举个例子:Kotlin不存在数字内在变宽转换(java中,int可以转成long),而且某些场景中存在字面上的差别。
Kotlin提供如下內建类型表示数字(这同Java相似)
注:Kotlin中,字符不是数字
数字常量
有如下类型的整数常量:
- 十进制:123
- Long类型用L标记:123L
- 16进制:0x0F
- 二进制:0b00001011
注:Kotlin中,不支持8进制表示
也支持浮点标记的数字:
- 默认双精度型:123.5,123.5e10
- 单精度型用F(f)标记:123.5f
下划线分割的数字(1.1开始)
可以使用下划线使数字更易读
val oneMillion = 1_000_000val creditCardNumber = 1234_5678_9012_3456Lval socialSecurityNumber = 999_99_9999Lval hexBytes = 0xFF_EC_DE_5Eval bytes = 0b11010010_01101001_10010100_10010010
存储表示
在Java平台,数字当做原始类型保存在物理存储空间,除非我们需要一个可以为空的引用(如:Int?)或者涉及泛型。后者情况下,数字是封装的。
注:封装的数字没必要保持它的特征
val a: Int = 10000print(a === a) // 输出 'true' val boxedA: Int? = aval anotherBoxedA: Int? = aprint(boxedA === anotherBoxedA) // !!!输出'false'!!!
另一方面,他们保持相等
val a: Int = 10000print(a == a) // 输出 'true' val boxedA: Int? = aval anotherBoxedA: Int? = aprint(boxedA == anotherBoxedA) // !!!输出'true'!!!
显示转换
由于不同的存储表示,小的类型并不是大些类型的子类型。如果是这样,我们将会遇到下述麻烦。
//假设的代码,不是实际编译的val a: Int? = 1 //Int类型(java.lang.Integer)val b: Long? = a //隐式的转换成Long类型(java.lang.Long)println(a==b) //输出false,用Long.equal()方法校验另一部分的Long
不仅仅是特征,还有相等的属性都在替换中悄无声息的丢失了。
简而言之,小的类型不能隐式转换成大的类型,也就是说,我们不能不使用显示转换就将Byte类型的值转换成Int类型的值。
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
缺少隐式转换是很难被发现出来的,因为类型可以通过上下文推理出来、也可以通过算术运算转化成合适的类型。如:
val l = 1L + 3 // Long + Int => Long
运算
Kotlin支持数字的标准算术运算,当做合适类的成员声明(但是,编译器会在调用相应的指令进行优化)。
作为位运算,没有为他们定义特殊的字符,只有叫做修整形式命名的函数。如:
val x = (1 shl 2) and 0x000FF000
下面完整的列举出所有的位运算(只支持Int和Long)
- shl(bits) ——有符号左移(Java中<<)
- shr(bits) ——有符号右移(Java中>>)
- ushr(bits) ——无符号右移(Java中>>>)
- and(bits) ——位运算与
- or(bits) ——位运算或
- xor(bits) ——位运算异或
- inv() ——位运算取反
Characters
Character通常用Char表示,不能直接当做数字对待
fun check(c: Char) { if (c == 1) { // 错误: 类型不匹配 // ... } }
Character用单引号包括:'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() // 显示转换成Int}
同数字一样,当字符需要一个可空的引用时,会被封装起来,字符的特征就不会被保持。
Booleans
Boolean用类型Boolean
表示,通常有两个值:true和false。
如果可以为空引用是必须的,Boolean 也会封装起来。
Boolean类型的內建操作符包括:
- || —— 或
- && —— 与
- !——非
Arrays
Kotlin中,Array类表示数组,有get
和set
两个函数(通过运算符重载用[]
表示)和size属性,和一些其他的有用的成员函数。
class Array<T> private constructor() { val size: Int operator fun get(index: Int): T operator fun set(index: Int, value: T): Unit operator fun iterator(): Iterator<T> // ...}
使用库函数arrayOf()
传入item的值创建数组。arrayOf(1, 2, 3)
创建[1, 2, 3]
数组。或者使用arrayOfNulls()
库函数创建一个指定大小的空数组,每个item值都是null。
还可以使用工厂方法用数组大小和根据索引返回每个item初始值的函数生成数组。
//创建一个Array<String>,值["0", "1", "4", "9", "16"]val asc = Array(5, { i -> (i * i).toString() })
之前已经提过,[]
表示调用get()
和set()
成员函数。
注:不同于Java,Kotlin中Array是不变的,我们不能给Array<Any>
分配Array<String>
,防止可能的运行失败。(但是可以使用Array<out Any>
)
Kotlin有一些专门的类来表示没有封装的原始类型数组。ByteArray
、ShortArray
、IntArray
……这些类没有继承实现Array
,但是他们有相同的方法和属性。他们中的任意一个都有对应的工厂函数。
val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2]
Strings
使用String
表示字符串,String是不可变的,字符串的每个字符元素可以使用索引运算符[]
访问。可以用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 = """ |Tell me and I forget. |Teach me and I remember. |Involve me and I learn. |(Benjamin Franklin) """
|
默认用来做空白前缀,你也可以选择其他字符作为参数传递,如trimMargin(">")
字符串模板
字符串可以包含模板表达式,即将一段代码推算出来并将结果拼接在字符串中,一个模板表达式由一个dollar符开始($)和一些简单的名称组成。
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 """
最后,祝广大程序猿们早日找到另一半,七夕快乐
- Kotlin基础(一)——基本类型
- Kotlin基础(一)--- 基本类型
- Kotlin学习笔记——基本类型
- android kotlin基础(二)-基本类型
- Kotlin 第三章:Kotlin 基础之基本类型
- Kotlin学习笔记一基本类型
- Kotlin开发之旅《一》— 初学者Kotlin基础必备
- Kotlin最简单的入门教程——基础类型(一)
- Kotlin从入门到放弃之基础篇(一)——基本数据类型
- Kotlin 学习笔记(一) 基本类型和基本语法
- Kotlin入门系列教程—基本类型 Number
- Kotlin的基本类型
- Kotlin基本类型
- Kotlin 基本类型
- Kotlin 基本类型
- kotlin---基本类型
- Kotlin -- 基本类型
- Kotlin 基本类型
- Java求101--200之间有多少个素数(质数)
- ios UIView...可变的圆角和边框,某个角,多个角,设置圆角和边框
- Linux管理输入输出 管道 tee
- POJ
- JQueryUI
- Kotlin基础(一)——基本类型
- 安装 MySQLdb
- 博客内容及分类简介
- CSS Spite实现菜单标签
- Javascript之一切皆为对象1全屏模式 2016-02-21 11:09 by 猴子猿, 1318 阅读, 2 评论, 收藏, 编辑 在javascript的世界里,有这么一句话,一切皆为对象。
- 单点登录原理与简单实现
- CSS实现背景透明,文字不透明(兼容各浏览器)
- 朴素 多项式期望求解
- RXAndroid2.0初学习四