Kotlin学习(5):基本类型

来源:互联网 发布:validateform js 编辑:程序博客网 时间:2024/06/05 21:52
  • 开发环境:IntelliJ IEDA
  • 个人博客:http://blog.csdn.net/IInmy
  • 项目源码:https://github.com/Rushro2m/LearnKotlin-master

1、数字

Kotlin处理数字在某种程度上接近Java,但是并不完全相同。例如,对于数字没有隐式拓宽转换(如Java中int可以隐式转换为long),另外有些情况字面值略有不同。

Kotlin提供了一些内置类型来表示数字:

Type Bit width Double 64 Float 32 Long 64 Int 32 Short 16 Byte 8
(1)字面常量

数字常量字面值有以下几种:

  • 十进制:123
  • 十六进制:0x0F
  • 二进制:0b00001011
  • 不支持八进制
//十进制val a = 123val b = 123L//十六进制val c = 0x0f//二进制val d = 0b00001011

Kotlin同样支持浮点数的常规表示方法

  • 默认类型为Double:123.5、123.5e10
  • Float用f或者F标记:123.5f
//默认doubleval e = 123.5val f = 123.5e10//Float用f或者Fval g = 123.5Fval i = 123.5f
(2)下划线的使用

可以使用下划线使数字常量更易读

val oneMillion = 1_000_000val creditCardNumber = 1234_5678_9012_3456Lval socialSecurityNumber = 999_99_9999Lval hexBytes = 0xFF_EC_DE_5Eval bytes = 0b11010010_01101001_10010100_10010010
(3)表示方式

在Java平台数字是物理存储为JVM的原生类型,除非我们需要一个可空的引用(如Int?)或泛型。后者情况下会把数字装箱。

数字装箱不必保留一致性, 但它保留了相等性:

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

注:在Kotlin中,“==”表示比较值是否相等,而“===”比较两个对象的地址是否相同

(4)显隐转换

Kotlin中较小的类型不能隐式转换为较大的类型,通过显式转换拓宽数字

  • toByte():Byte
  • toShort():Short
  • toInt():Int
  • toLong():Long
  • toFloat():Float
  • toDouble():Double
  • toChar():Char
//错误的写法,编译不通过val b: Byte = 1val i: Int = b//正确写法, 必须显式转换val b: Byte = 1val i: Int = b.toInt()

缺乏隐式类型转换并不显著,因为类型会从上下文推断出来,而算术运算会有重载做适当转换。

val l = 1L + 3//Long + Int => Long
(5)运算

Kotlin支持数字运算的标准集,运算被定义为相应的类成员(但编译器会将函数调用优化为相应的指令)

对于位运算,没有特殊字符来表示,而只可用中缀方式调用命名函数,例如:

val x = (1 shl 2) and 0x000FF000

完整的位运算列表(只用于Int和Long)

  • shl(bits) - 有符号左移(Java 的<<)
  • shr(bits) - 有符号右移(Java的>>)
  • ushr(bits) - 无符号右移(Java的>>>)
  • and(bits) - 位与
  • or(bits) - 位或
  • xor(bits) - 位异或
  • inv(bits) -位非

注:>>、<<、>>>是将二进制数进行位移。

//两种调用方式,结果都为0println(1 shr 2)println(1.shr(2))//结果为1println(2 shl 1 shr 2)println(2.shl(1).shr(2))

2、字符

字符用Char类型表示。一对单引号包括的值,为字符字面值。它们不能直接当作数字,比如这样:

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') {        println("不在范围内")    }    return c.toInt() - '0'.toInt()//显式转换为数字}

常用的方法

  • isDigit()–>判断是否为数字
  • isLetter()–>判断是否为字母
val aNum = '3'val aLetter = 'a'if (aNum.isDigit()) {    println("aNum是一个数字")}if (aLetter.isLetter()) {    println("aLetter是一个字母")}

3、布尔

布尔用Boolean类型表示,它有两个值:true和false。若需要可空引用布尔会被装箱。

var isVip = trueif (isVip) {    println("欢迎Vip会员")} else {    println("还不赶紧充值")}

内置的布尔运算有:

  • || 短路逻辑或
  • && 短路逻辑与
  • ! 逻辑非
fun main(args: Array<String>) {    val x = true    val y = false    println(x || y)    println(x && y)    println(!x)}

4、数组

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

(1)Array类中的一些属性和方法:
class Array<T> private constructor() {    val size: Int    operator fun get(index: Int): T    operator fun set(index: Int, value: T): Unit    operator fun iterator(): Iterator<T>    //  …… }
(2)创建数组
  • arrayOf()

可以使用库函数arrayOf()来创建一个数组并传递元素之给它.

val ao = arrayOf(1, 2, 3, 4)
  • arrayOfNulls()

可以用于创建一个指定大小,所有元素为空的数组。

val aon = arrayOfNulls<String>(3)
  • Array

接受数组大小和一个函数参数的Array构造函数,用作参数的函数能够返回给定索引的每个元素的初始值:

 val a = Array(5, { i -> (i * i).toString() })

注:Kotlin中数组是不型变的(invariant)。这意味着Kotlin不让我们把Array赋值给Array,以防止可能的运行是失败。

5、字符串

字符串用String类型表示,是有序字符(Char)集合。字符串是不可变的,字符串的元素–字符可以使用索引运算符访问s[i]。可以用for循环迭代字符串:

for(c in str){    println(c)}
(1)字面值

Kotlin中有两种类型的字符串字面值:转义字符串可以有转义字符,以及原生字符串,可以包含换行和任意文本。

  • 转义字符串

转义采用传统的反斜杠方式。

val s = "Hello world!\n"
  • 原生字符串

原生字符串 使用三个引号分界符括起来,内部没有转义并且可以包含换行和任何其它字符:

val text = """    for(c in "foo")        println(c)"""

可以通过trimMargin()函数取出前导空格

val text2 = """        |Tell me and I forget.        |Teach me and I remember.        |Involve me and I Learn.        |(Benjamin Franklin)    """.trimMargin()

默认 | 用作边界前缀,但你可以选择其它字符并作为参数传入,比如 trimMargin(“>”)

val text2 = """        >Tell me and I forget        >Teach me and I remember        >Involve me and I Learn        >(Benjamin Franklin)        """.trimMargin(">")    print(text2)
(2)字符串模版

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

val i = 10val s = "i = $i"

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

val s = "abc"//输出内容为:"abc.length is 3"val str = "$s.length is ${s.length}"

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

val price = """        ${'$'}9.99    """//输出结果为:$9.99 println(price)
(3)常用方法
  • 判断字符串是否为空:isEmpty()
  • 是否不为空:isNotEmpty()
  • 计数:count()或者size
  • 转换为字符数组:toCharArray()
//判断字符串是否为空course.isEmpty()//判断字符串是否不为空course.isNotEmpty()//计数course.count()//将字符串转换为字符数组for (letter in course.toCharArray()) {    println(letter)}
原创粉丝点击