Kotlin——数据的基本表现形式及其运算

引言

前面一篇简单的总结了下入门Kotlin的第一步——配置开发环境引入Kotlin库,接下来正式踏入Kotlin的世界。Kotlin是诞生于多年前年的一种程序语言,对,就是一套完整的程序语言,而且Kotlin本身是一种完全面向对象的,万物皆对象(意味着可以在任何变量上调⽤成员函数和属性),而构成对象的变量类型多种多样,这就需要不同的数据类型支持,有些类型是内置的,因为他们的实现是优化过的(因为Kotlin本质上是一种JVM语言),但是看起来他们就像普通的类,学习Kotlin语法的时候可以到在线编写运行Kotlin代码

一、数据的基本类型

在Kotlin中,数据的类型和大多数程序语言一样也分为五种:数字字符布尔数组字符串类型。

二、数字类型

Kotlin 处理数字类型的数据在某种程度上和Java大同小异,在Kotlin中对于数字没有隐式类型自动转换(在Java中转换按数据长度增加的方向进行,以保证精度不降低,所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算,char型和short型参与运算时,必须先转换成int型,在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型等),Kotlin处理数字类型的数据根据精度不同也分为6种:Double、Float、Int、Long、Short、Byte

| 类型| 所占字节 |
| ------------- |:-------------:| -----:|
|Double |64
|Float |32
|Long |64
|Int |32
|Short |16
|Byte |8

1、整数类型

在Kotlin中整数类型数据使用根据精度不同分别使用IntLongShortByte,而且根据进制不同还可以分为十进制、二进制和16进制(不支持8进制)。

  • ⼗进制: 9080980,Long 类型⽤⼤写 L 标记: 9080980L
  • ⼗六进制: 0x0FF,前缀用0x
  • ⼆进制: 0b00001011

2、浮点型

而浮点型根据精度不同分别使用DoubleFloat,小数默认使用Double类型,而使用F或f标识Float类型

3、数字常量中的下划线

从Kotlin 1.1起,也许是为了方便阅读高数字的需要,在一个数字常量中的任意位置(非头部和尾部)插入一个“_”,可以看成一个简单的连接符,无论是任何进制的数字,也不管是小数还是整数都支持。

val oneMillion = 1_000_000.4
val creditCardNumber = 1234_56_78_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

4、数字的拆箱和装箱

通常数字是以拆箱的形式物理存储为 JVM 的原⽣类型,而当我们需要⼀个可空的引⽤(如 Int? )或泛型才会把数字装箱,装箱操作不会保留同⼀性。基本类型只有值,可以理解成是什么值就是什么值没有别的, 即使声明的时候没有赋值,系统也会默认的给他一个默认值0。而装箱基本类型不同,两个装箱基本类型可以具有相同的值,并且还可以有不同的同一性,比如他们的引用地址不同。

  • 装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。

  • 拆箱:和装箱相反,将引用类型的对象简化成值类型的数据

数字装箱的时候不一定持有同一性

val a: Int = 10000
print(a === a) // 输出“true”
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!输出“false”!!!,因为boxedA和anotherBoxedA不是同一个对象

数字装箱的时候保持了自等性

 val a: Int = 10000
 print(a == a) // 输出“true”
 val boxedA: Int? = a
 val anotherBoxedA: Int? = a
 print(boxedA == anotherBoxedA) // 输出“true”,值相等

5、数字之间的显式转换

所谓的显式转换即强转,实现也很简单只需要调用对应的方法即可

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

6、Long和Int型数字的位运算

位运算应该是效率最高的运算,对于位运算,没有特殊字符来表⽰,⽽只可⽤中缀⽅式调⽤命名函数,例如:val x = (1 shl 2) and 0x000FF000

  • shl(bits) ——有符号左移 (Java 的 << )
  • shr(bits) —— 有符号右移 (Java 的 >> )
  • ushr(bits) ——⽆符号右移 (Java 的 >>> )
  • and(bits) ——按位与
  • or(bits) ——按位或
  • xor(bits) ——按位异或
  • inv() ——按位⾮

三、字符

Kotlin中字符⽤ Char 类型表⽰,字符常量用单引号' '括起来,特殊字符可以⽤反斜杠转义(⽀持以下转义序列:\t 、 \b 、\n 、\r 、' 、" 、\ 和 $ ) 编码其他字符要⽤Unicode 转义序列语法:'\uFF00' ,且与Java不同它们不能直接当作数字(Java中字符的值对应着ASCCII值),最后当需要可空引⽤时,像数字、字符类型会自动被装箱,但装箱操作不会保留同⼀性。

四、布尔

布尔⽤ Boolean 类型表⽰,和Java它有两个值:true 和 false,若需要可空引⽤布尔会被自动装箱。
内置的布尔运算有:

  • || —— 短路逻辑或
  • && ——短路逻辑与
  • ! ——逻辑⾮

五、字符串

字符串⽤ String 类型表⽰,字符串是不可变的。 在Kotlin中是可以使⽤索引运算符访问字符串的字符也可以⽤ for 循环遍历字符串。

//直接索引访问 c[2]
for (c in str) {
    println(c)
}

1、 转义字符串和**原始字符串

另外在Kotlin中有两种类型的字符串常量: 转义字符串原始字符串,可以有转义字符(转义采⽤传统的反斜杠⽅式),转义字符串很像 Java 字符串而在实际使用中字符串可能还会包含转义符、系统保留关键字等特殊字符,为了更好地区分,Kotlin特别定义了一个所谓的原始字符串(原始字符串由三重引号(""" """)分隔,不包含转义,不能包含换行符和其他字符),简单来说就是三重引号内的一切特殊字符绝不做额外处理仅仅看成是一个普通的字符。

 val text = """
    for (c in "foo")
        print(c)
        \n
    """
    println(text)/**输出 for (c in "foo")
                    print(c)
                    \n 
                    */

2、字符串模板

Kotlin字符串中还可以包含模板表达式 ,这些表达式不会被当成普通字符来处理而是会当成一个运算表达式来完成运算得到结果,然后再把结果替换掉表达式,简单地可以看成是这个表达式当做占位符的功能。 模板表达式以美元符( $ )开头

val i = 10
val s = "i = $i" // 求值结果为 "i = 10"
val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"

原⽣字符串和转义字符串内部都⽀持模板。 如果你需要在原⽣字符串中表⽰字⾯值 $ 字符(它不⽀持反斜杠转义),你可以这样用

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

六、数组

在 Kotlin 中数组使用Array 类来表⽰,它定义了 get 和 set 函数(按照运算符重载约定这会转变为 [] )和 size 属性,以及⼀些其他有⽤的成员

1、数组的创建

创建数组实例主要有四种方式:Array(size: Int, init: (Int) -> T)arrayOf()arrayOfNullsemptyArray 函数直接创建。

  • arrayOf()——返回指定元素的数组
  • arrayOfNulls ——返回指定类型的数组并用null初始化
  • emptyArray——返回指定类型的空数组
val asc = Array(5, { i -> (i * i).toString() })
//遍历数组
for(v in asc){
    println(v)
}

//遍历数组下标
for (arr in asc.indices) {
    println(arr)
}


val arr = arrayOf(1, 2, 3);
for (item in arr) {
    println(item);
}
//创建原始整形数组
val numbers: IntArray = intArrayOf(10, 20, 30, 40, 50)
var numbers: IntArray = IntRange(10, 50).step(10).toList().toIntArray()

//长度为0的空数组
val empty = emptyArray()


最后,与 Java 不同的是,Kotlin 中数组是不型变的(invariant)。这意味着 Kotlin 不让我们把 Array<String> 赋值给 Array<Any> ,以防⽌可能的运⾏时失败(但是你可以使⽤ Array<out Any> )。Kotlin 也有⽆装箱开销的专⻔的类来表⽰原⽣类型数组: ByteArray 、 ShortArray 、IntArray 等,虽然这些类和 Array 并没有继承关系,但是它们有同样的⽅法属性集。

小结

Kotlin和其他程序语言差不多,拥有五种基本数据类型数字字符布尔数组字符串类型,需要注意的是字符串和数组与Java中的区别,这篇文章就到这了,主要就是结合官方的文档和自己的理解重新整理下。官方文档阅读,下一篇开始进入程序的结构的学习。

你可能感兴趣的:(Kotlin——数据的基本表现形式及其运算)