kotlin基本数据类型
Kotlin基本数据类型
1 Kotlin是面向对象,基本把java的所剩的一点不是面向对象的东西规避了。在Kotlin中所有基本数据类型都装箱使用。
2 数字型(Numbers)
2.1 字面常量
2.1.1 下面是所有类型的字面常量:
2.1.2 小数(Decimals):123
2.1.3 长整型以大写的L结尾:123L
2.1.4 16进制以0x开头:0x0F
2.1.5 2进制以0b开头:0b00001011
2.2 声明
2.2.1 变量
var
var a =100
var a:Int=100
var a:Int? a=100
好玩的 a=100_234
var f=1.234f var d=1.234
2.2.2 常量
val
你可以使用下划线使数字常量更易读:
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
val PI:Float=3.1_415926F
val PI2:Double = 3.145926
val A=1000 val PI=3.1_415926
小数点左右不支持下划线
2.3 java不具有的
2.3.1 val bb:Any = 100_000_000.00_00f
数字中间可以加下划线,用来更好的辨识
2.4 进制
2.4.1 支持10 ,16, 2进制
0x 表示16进制
0b 二进制
2.4.2 不支持8进制
2.5 装箱
2.5.1 在kotlin中全部使用包装类操作
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
2.5.2 所有的数字类型(Number)都支持一下的转换:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
2.5.3 类型转换
因为都是包装类,基本不能隐式转换
不能把 Byte 型值赋给一个 Int 变量。 val b: Byte = 1 // OK, 字面值是静态检测的 val i: Int = b // 错误 我们可以代用其toInt()方法。 val b: Byte = 1 // OK, 字面值是静态检测的 val i: Int = b.toInt() // OK
java中小值赋给大值也不行
通过以上类型转换后使用
2.5.4 比较两个数字
比较两个数字 Kotlin 中没有基础数据类型,只有封装的数字类型,你每定义的一个变量,其实 Kotlin 帮你封装了一个对象,这样可以保证不会出现空指针。数字类型也一样,所有在比较两个数字的时候, 就有比较数据大小和比较两个对象是否相同的区别了。 在 Kotlin 中,三个等号 === 表示比较对象地址,两个 == 表示比较两个值大小
例: fun main(args: Array<String>) { val a: Int = 10000 println(a === a) // true,值相等,对象地址相等 //经过了装箱,创建了两个不同的对象 val boxedA: Int? = a val anotherBoxedA: Int? = a //虽然经过了装箱,但是值是相等的,都是10000 println(boxedA === anotherBoxedA) // false,值相等,对象地址不一样 println(boxedA == anotherBoxedA) // true,值相等 }
2.5.5 位操作符
shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 无符号右移位 (Java’s >>>)
and(bits) – 与
or(bits) – 或
xor(bits) – 异或
inv() – 反向
3 字符
3.1 和 Java 不一样,Kotlin 中的 Char 不能直接和数字操作,Char 必需是单引号''包含起来的。比如普通字符 '0','a'。 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() // 显式转换为数字 } 当需要可空引用时,像数字、字符会被装箱。装箱操作不会保留同一性。
4 Boolean
4.1 布尔用 Boolean 类型表示,它有两个值:true 和 false。 若需要可空引用布尔会被装箱。 内置的布尔运算有: || – 或 && –与 ! - 非
5 和 Java 一样,String 是可不变的
5.1 支持三个引号 """ 扩起来的字符串,支持多行字符串,比如: fun main(args: Array<String>) { val text = """ 多行字符串 多行字符串 """ println(text) // 输出有一些前置空格 }
5.2 方括号 [] 语法可以很方便的获取字符串中的某个字符
5.3 字符串是由 String 表示的。字符串是不变的。字符串的元素可以通过索引操作读取: s[i] 。字符串可以用 for 循环迭代: for (c in str) { println(c) } 字符串字面量 Kotlin 有两种类型的字符串字面量:一种是可以带分割符的,一种是可以包含新行以及任意文本的。带分割符的 string 很像 java 的 string: val s = "Hello World!\n" 转义是使用传统的反斜线的方式。参见Characters,以获得支持的转义序列。 整行String 是由三个引号包裹的("""),不可以包含分割符但可以包含其它字符: val text = """ 你可以通过trim-margin()函数移除空格: val text = """ |Tell me and I forget. |Teach me and I remember. |Involve me and I learn. |(Benjamin Franklin) """.trimMargin() 字符串模板 字符串可以包含模板表达式,即可求值的代码片段,并将其结果连接到字符串中。一个模板表达式由一个 $ 开始并包含另一个简单的名称: val i = 10val s = "i = $i" // 求值为 "i = 10" 或者是一个带大括号的表达式: val s = "abc"val str = "$s.length is ${s.length}" // 求值为 "abc.length is 3" 模板既可以原始字符串中使用,也可以在转义字符串中使用。如果需要在原始字符串(不支持反斜杠转义)中表示一个文字$字符,那么可以使用以下语法: val price = """
6 数组
6.1 数组用类 Array 实现,并且还有一个 size 属性及 get 和 set 方法,由于使用 [] 重载了 get 和 set 方法,所以我们可以通过下标很方便的获取或者设置数组对应位置的值。 数组的创建两种方式:一种是使用函数arrayOf();另外一种是使用工厂函数。如下所示,我们分别是两种方式创建了两个数组: fun main(args: Array<String>) { //[1,2,3] val a = arrayOf(1, 2, 3) //[0,2,4] val b = Array(3, { i -> (i * 2) }) //读取数组内容 println(a[0]) // 输出结果:1 println(b[1]) // 输出结果:2 } 如上所述,[] 运算符代表调用成员函数 get() 和 set()。 注意: 与 Java 不同的是,Kotlin 中数组是不型变的(invariant)。 除了类Array,还有ByteArray, ShortArray, IntArray,用来表示各个类型的数组,省去了装箱操作,因此效率更高,其用法同Array一样: val x: IntArray = intArrayOf(1, 2, 3) x[0] = x[1] + x[2]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)