飞道的博客

Kotlin的使用第三章:数据类型的介绍

331人阅读  评论(0)

Java和Kotlin数据类型对照表                 

     java数据类型       Kotlin数据类型       类型说明              位宽度
             int                Int

              整型

                32

           long

             Long

            长整型

                64

           short

              Short

             短整型

                16

           float

              Float

      单精度浮点型

                32

          double

             Double

      双精度浮点型

                64

         boolean

            Boolean

           布尔型

        true 与 false。

            char

              Char

           字符型

  16 位 Unicode 字符

           byte

              Byte

           字节型

                8

 


   
  1. class Main2Activity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main2)
  5. // byte
  6. Log.e("TAG","基本类型:byte 二进制位数:" + Byte.SIZE_BITS)
  7. Log.e("TAG","包装类:Kotlin.Byte")
  8. Log.e("TAG","最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE)
  9. Log.e("TAG","最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE)
  10. // short
  11. Log.e("TAG","基本类型:short 二进制位数:" + Short.SIZE_BITS)
  12. Log.e("TAG","包装类:Kotlin.Short")
  13. Log.e("TAG","最小值:Short.MIN_VALUE=" + Short.MIN_VALUE)
  14. Log.e("TAG","最大值:Short.MAX_VALUE=" + Short.MAX_VALUE)
  15. // int
  16. Log.e("TAG","基本类型:int 二进制位数:" + Int.SIZE_BITS)
  17. Log.e("TAG","包装类:Kotlin.Integer")
  18. Log.e("TAG","最小值:Integer.MIN_VALUE=" + Int.MIN_VALUE)
  19. Log.e("TAG","最大值:Integer.MAX_VALUE=" + Int.MAX_VALUE)
  20. // long
  21. Log.e("TAG","基本类型:long 二进制位数:" + Long.SIZE_BITS)
  22. Log.e("TAG","包装类:Kotlin.Long")
  23. Log.e("TAG","最小值:Long.MIN_VALUE=" + Long.MIN_VALUE)
  24. Log.e("TAG","最大值:Long.MAX_VALUE=" + Long.MAX_VALUE)
  25. // float
  26. Log.e("TAG","基本类型:float 二进制位数:" + java.lang.Float.SIZE)
  27. Log.e("TAG","包装类:java.lang.Float")
  28. Log.e("TAG","最小值:Float.MIN_VALUE=" + Float.MIN_VALUE)
  29. Log.e("TAG","最大值:Float.MAX_VALUE=" + Float.MAX_VALUE)
  30. // double
  31. Log.e("TAG","基本类型:double 二进制位数:" + java.lang.Double.SIZE)
  32. Log.e("TAG","包装类:java.lang.Double")
  33. Log.e("TAG","最小值:Double.MIN_VALUE=" + Double.MIN_VALUE)
  34. Log.e("TAG","最大值:Double.MAX_VALUE=" + Double.MAX_VALUE)
  35. // char
  36. Log.e("TAG","基本类型:char 二进制位数:" + Char.SIZE_BITS)
  37. Log.e("TAG","包装类:Kotlin.Char")
  38. // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
  39. // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
  40. Log.e("TAG", "最小值:Char.MIN_VALUE=" + Char.MIN_VALUE.toInt())
  41. // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
  42. // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
  43. Log.e("TAG", "最大值:Char.MAX_VALUE=" + Char.MAX_VALUE.toInt())
  44. }
  45. }

输出:

01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 基本类型:byte 二进制位数:8
01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 包装类:Kotlin.Byte
01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 最小值:Byte.MIN_VALUE=-128
01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 最大值:Byte.MAX_VALUE=127
01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 基本类型:short 二进制位数:16
01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 包装类:Kotlin.Short
01-06 13:11:54.713 11612-11612/com.example.workingspace E/TAG: 最小值:Short.MIN_VALUE=-32768
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最大值:Short.MAX_VALUE=32767
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 基本类型:int 二进制位数:32
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 包装类:Kotlin.Integer
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最小值:Integer.MIN_VALUE=-2147483648
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最大值:Integer.MAX_VALUE=2147483647
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 基本类型:long 二进制位数:64
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 包装类:Kotlin.Long
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最小值:Long.MIN_VALUE=-9223372036854775808
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最大值:Long.MAX_VALUE=9223372036854775807
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 基本类型:float 二进制位数:32
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 包装类:java.lang.Float
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最小值:Float.MIN_VALUE=1.4E-45
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 最大值:Float.MAX_VALUE=3.4028235E38
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 基本类型:double 二进制位数:64
01-06 13:11:54.714 11612-11612/com.example.workingspace E/TAG: 包装类:java.lang.Double
01-06 13:11:54.715 11612-11612/com.example.workingspace E/TAG: 最小值:Double.MIN_VALUE=4.9E-324
01-06 13:11:54.715 11612-11612/com.example.workingspace E/TAG: 最大值:Double.MAX_VALUE=1.7976931348623157E308
01-06 13:11:54.715 11612-11612/com.example.workingspace E/TAG: 基本类型:char 二进制位数:16
01-06 13:11:54.715 11612-11612/com.example.workingspace E/TAG: 包装类:Kotlin.Char
01-06 13:11:54.715 11612-11612/com.example.workingspace E/TAG: 最小值:Char.MIN_VALUE=0
01-06 13:11:54.715 11612-11612/com.example.workingspace E/TAG: 最大值:Char.MAX_VALUE=65535

Java跟Kotlin的数据类型类似,可以说基本一样,就是分大小写,所以如果有java基础,这一章只要大概看一眼即可!   

字面常量

下面是所有类型的字面常量:

  • 十进制:123
  • 长整型以大写的 L 结尾:123L
  • 16 进制以 0x 开头:0x0F
  • 2 进制以 0b 开头:0b00001011
  • 注意:8进制不支持
  • Kotlin 同时也支持传统符号表示的浮点数值:

  • Doubles 默认写法: 123.5123.5e10
  • Floats 使用 f 或者 F 后缀:123.5f

   

每种数据类型都有下面的这些方法,可以转化为其它的类型:


   
  1. toByte(): Byte
  2. toShort(): Short
  3. toInt(): Int
  4. toLong(): Long
  5. toFloat(): Float
  6. toDouble(): Double
  7. toChar(): Char   
  8. 其中还有一种为:toString(),这是是转化为字符串String           

默认数值(Kotlin)


   
  1. var bool = false
  2. var by: Byte = 0
  3. var ch = 0.toChar()
  4. var d = 0.0
  5. var f = 0f
  6. var i = 0
  7. var l: Long = 0
  8. var sh: Short = 0
  9. var str: String? = null

所有以未超出 Int 最大值的整型值初始化的变量都会推断为 Int 类型。如果初始值超过了其最大值,那么推断为 Long 类型。 如需显式指定 Long 型值,请在该值后追加 L 后缀。


   
  1. val one = 1 // Int
  2. val threeBillion = 3000000000 // Long
  3. val oneLong = 1L // Long
  4. val oneByte: Byte = 1

对于浮点数,Kotlin 提供了 Float 与 Double 类型。 根据 IEEE 754 标准, 两种浮点类型的十进制位数(即可以存储多少位十进制数)不同。 Float 反映了 IEEE 754 单精度,而 Double 提供了双精度

类型 大小(比特数) 有效数字比特数 指数比特数 十进制位数
Float 32 24 8 6-7
Double 64 53 11 15-16

对于以小数初始化的变量,编译器会推断为 Double 类型。 如需将一个值显式指定为 Float 类型,请添加 f 或 F 后缀。 如果这样的值包含多于 6~7 位十进制数,那么会将其舍入。

val pi = 3.14 // Double
val e = 2.7182818284 // Double
val eFloat = 2.7182818284f // Float,实际值为 2.7182817

请注意,与一些其他语言不同,Kotlin 中的数字没有隐式拓宽转换。 例如,具有 Double 参数的函数只能对 Double 值调用,而不能对 Float、 Int 或者其他数字值调用。

有些情况下也是可以使用自动类型转化的,前提是可以根据上下文环境推断出正确的数据类型而且数学操作符会做相应的重载。例如下面是正确的:

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

位操作符

对于Int和Long类型,还有一系列的位操作符可以使用,分别是:


   
  1. shl(bits) – 左移位 (Java’s <<)
  2. shr( bits) – 右移位 ( Javas >>)
  3. ushr(bits) – 无符号右移位 (Java’s >>>)
  4. and(bits) – 与
  5. or(bits) – 或
  6. xor(bits) – 异或
  7. inv() – 反向

字符

和 Java 不一样,Kotlin 中的 Char 不能直接和数字操作,Char 必需是单引号 ' 包含起来的。比如普通字符 '0','a'。


   
  1. fun check(c: Char) {
  2. if (c == 1) { // 错误:类型不兼容
  3. // ……
  4. }
  5. }

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

我们可以显式把字符转换为 Int 数字:


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

当需要可空引用时,像数字、字符会被装箱。装箱操作不会保留同一性。


布尔

布尔用 Boolean 类型表示,它有两个值:true 和 false。

若需要可空引用布尔会被装箱。

内置的布尔运算有:


   
  1. || – 短路逻辑或
  2. && – 短路逻辑与
  3. ! - 逻辑非

数组

数组用类 Array 实现,并且还有一个 size 属性及 get 和 set 方法,由于使用 [] 重载了 get 和 set 方法,所以我们可以通过下标很方便的获取或者设置数组对应位置的值。

数组的创建两种方式:一种是使用函数arrayOf();另外一种是使用工厂函数。如下所示,我们分别是两种方式创建了两个数组:


   
  1. class Main2Activity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main2)
  5. main()
  6. }
  7. fun main() {
  8. //[1,2,3]
  9. val a = arrayOf(1, 2, 3)
  10. //[0,2,4]
  11. val b = Array(3, { i -> (i * 2) })
  12. //读取数组内容
  13. Log.e("TAG", "a[0]:" + a[0]) // 输出结果:1
  14. Log.e("TAG", "b[0]:" + b[1]) // 输出结果:2
  15. }
  16. }

如上所述,[] 运算符代表调用成员函数 get() 和 set()。

注意: 与 Java 不同的是,Kotlin 中数组是不协变的(invariant)。

除了类Array,还有ByteArray, ShortArray, IntArray,用来表示各个类型的数组,省去了装箱操作,因此效率更高,其用法同Array一样:


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

字符串

和 Java 一样,String 是不可变的。方括号 [] 语法可以很方便的获取字符串中的某个字符,也可以通过 for 循环来遍历:


   
  1. class Main2Activity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main2)
  5. val str = "abcdefghijklmn"
  6. for (c in str) {
  7. Log.e("TAG", "str :" + c)
  8. }
  9. }
  10. }

输出:

01-06 13:32:59.134 11756-11756/com.example.workingspace E/TAG: str :a
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :b
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :c
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :d
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :e
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :f
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :g
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :h
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :i
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :j
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :k
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :l
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :m
01-06 13:32:59.135 11756-11756/com.example.workingspace E/TAG: str :n

Kotlin 支持三个引号 """ 扩起来的字符串,支持多行字符串,比如:


   
  1. class Main2Activity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main2)
  5. main()
  6. }
  7. fun main() {
  8. // Kotlin 支持三个引号 """ 扩起来的字符串,支持多行字符串,比如:
  9. val text = """
  10. 多行字符串
  11. 多行字符串
  12. """
  13. Log.e("TAG", text) // 输出有一些前置空格
  14. // String 可以通过 trimMargin() 方法来删除多余的空白。
  15. val text1 = """
  16. |多行字符串
  17. |菜鸟教程
  18. |多行字符串
  19. |Runoob
  20. """.trimMargin()
  21. Log.e("TAG", text1) // 前置空格删除了
  22. // 默认 | 用作边界前缀,但你可以选择其他字符并作为参数传入,比如 trimMargin(">")。
  23. val text2 = """
  24. |多行字符串
  25. |菜鸟教程
  26. |多行字符串
  27. |Runoob
  28. """.trimMargin(">")
  29. Log.e("TAG", text2)
  30. }
  31. }

输出:

01-06 13:36:34.202 11882-11882/com.example.workingspace E/TAG:     多行字符串
        多行字符串
        
01-06 13:36:34.223 11882-11882/com.example.workingspace E/TAG: 多行字符串
    菜鸟教程
    多行字符串
    Runoob
01-06 13:36:34.224 11882-11882/com.example.workingspace E/TAG:     |多行字符串
        |菜鸟教程
        |多行字符串
        |Runoob

字符串模板

字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:


   
  1. fun main() {
  2. val i = 10
  3. val s = "i = $i" // 求值结果为 "i = 10"
  4. println(s)
  5. }

或者用花括号扩起来的任意表达式:


   
  1. fun main() {
  2. val s = "runoob"
  3. val str = "$s.length is ${s.length}" // 求值结果为 "runoob.length is 6"
  4. println(str)
  5. }

原生字符串和转义字符串内部都支持模板。 如果你需要在原生字符串中表示字面值 $ 字符(它不支持反斜杠转义),你可以用下列语法:


   
  1. fun main() {
  2. val price = """
  3. ${'$'}9.99
  4. """
  5. println(price) // 求值结果为 $9.99
  6. }

转载:https://blog.csdn.net/qq_36333309/article/details/112461950
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场