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<Int>()


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

小结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容