首页 > 其他 > 详细

基本数据类型

时间:2020-06-18 18:52:46      阅读:58      评论:0      收藏:0      [点我收藏+]

1.对于数字的定义,支持java 8的下划线分割的方式

val a = 1_2_3 与 val a = 123 是相同的

2.如果要指定数字类型有两种方式

val a : Float = 1
或者
val a = 1f

3.kotlin没有隐式拓宽转换

val i = 1 
val d = 1.1
val f = 1.1f

printDouble(d)
printDouble(i) // 错误:类型不匹配 
printDouble(f) // 错误:类型不匹配

4.kotlin数字定义不支持八进制

十进制:     123
   -- Long类型 123L
十六进制:  0x0f
二进制:     0b001

5.当采用可空的引用(Int?)或泛型,后者情况会把数字装箱,装箱的数字保留相等性,但不一定保留同一性

val a: Int = 10000
println(a === a) // 输出“true”
val boxedA: Int? = a
val anotherBoxedA: Int? = a
println(boxedA === anotherBoxedA) // !!!输出“false”!!!

但保留相等性
val a: Int = 10000
println(a == a) // 输出“true”
val boxedA: Int? = a
val anotherBoxedA: Int? = a
println(boxedA == anotherBoxedA) // 输出“true”

6.显示转换,现在无法直接用long类型接收一个int类型的数字,在早起版本会把int类型装箱变为Long类型,后续版本在编译期就会报错,无法通过默认方式的编译成功

// 假想的代码,实际上并不能编译:
val a: Int? = 1 // 一个装箱的 Int (java.lang.Integer)
val b: Long? = a // 隐式转换产生一个装箱的 Long (java.lang.Long)
print(b == a) // 惊!这将输出“false”鉴于 Long 的 equals() 会检测另一个是否也为 Long

//以下的方式也是错的
 val b: Byte = 1 // OK, 字面值是静态检测的
 val i: Int = b // 错误


但是可以通过显式转换
 val i: Int = b.toInt() // OK:显式拓宽

可以使用以下的方式
— toByte(): Byte
— toShort(): Short
— toInt(): Int
— toLong(): Long
— toFloat(): Float
— toDouble(): Double 
— toChar(): Char

注意:
val l = 1L + 3 // Long + Int => Long

7.运算时,整数计算只会得到整数,如果需要返回浮点,需要其中一个进行显式转换

 val x = 5 / 2.toDouble() 
 println(x == 2.5)

8.位运算,对于位运算,没有特殊字符来表示,而只可用中缀方式调用具名函数

val x = (1 shl 2) and 0x000FF000 

这是完整的位运算列表(只用于 Int 与 Long):

— shl(bits) ? 有符号左移
— shr(bits) ? 有符号右移
— ushr(bits) ? 无符号右移
— and(bits) ? 位与
— or(bits) ? 位或
— xor(bits) ? 位异或
— inv()?位非

9.区间比较

区间实例以及区间检测:a..b、x in a..b、x !in a..b

10.字符Char,不能直接作为数字,可以显式转换

字符字面值用单引号括起来: ‘1‘ 。特殊字符可以用反斜杠转义。支持这几个转义序列:\t 、 \b 、\n 、\r 、\‘ 、\" 、\\ 与 \$ 。编码其他字符要用 Unicode 转义序列语法:‘\uFF00‘


fun decimalDigitValue(c: Char): Int {
     if (c !in ‘0‘..‘9‘)
            throw IllegalArgumentException("Out of range") 
    return c.toInt() - ‘0‘.toInt() // 显式转换为数字
}            

11.数组,在kotlin中使用Array类来表示,在kotlin中是不型变的(invariant)。这意味着 Kotlin 不让我们把 Array<String> 赋值给Array<Any>,以防止可能的运行时失败(但是你可以使用 Array<out Any>,参?类型投影)。

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

12.原生类型数组

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

// 大小为 5、值为 [0, 0, 0, 0, 0] 的整型数组 
val arr = IntArray(5)

// 例如:用常量初始化数组中的值
// 大小为 5、值为 [42, 42, 42, 42, 42] 的整型数组 
val arr = IntArray(5) { 42 }

// 例如:使用 lambda 表达式初始化数组中的值
// 大小为 5、值为 [0, 1, 2, 3, 4] 的整型数组(值初始化为其索引值) 
var arr = IntArray(5) { it * 1 }

13.无符号整型(kotlin 1.3起才可用)

val a :UByte = 1u
val b: Byte = a.toByte()

注意:将类型从无符号类型更改为对应的有符号类型(反之亦然)是二进制不兼容变更
无符号类型是使用另一个实验性特性(即内联类)实现的。

14.特化的类

与原生类型相同,每个无符号类型都有相应的为该类型特化的表示数组的类型:
— kotlin.UByteArray : 无符号字节数组
— kotlin.UShortArray : 无符号短整型数组
— kotlin.UIntArray : 无符号整型数组
— kotlin.ULongArray : 无符号?整型数组
与有符号整型数组一样,它们提供了类似于 Array 类的 API 而没有装箱开销。
此外,区间与数列也支持 UInt 与 ULong(通过这些类 kotlin.ranges.UIntRange 、 kotlin.ranges.UIntProgression 、kotlin.ranges.ULongRange 、 kotlin.ranges.ULongProgression )

 

基本数据类型

原文:https://www.cnblogs.com/developer-wang/p/13158910.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!