Kotlin学习(5):基本类型

1、数字

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

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

TypeBit width
Double64
Float32
Long64
Int32
Short16
Byte8
(1)字面常量

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

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

//十六进制
val c = 0x0f

//二进制
val d = 0b00001011

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

  • 默认类型为Double:123.5、123.5e10
  • Float用f或者F标记:123.5f
//默认double
val e = 123.5
val f = 123.5e10

//Float用f或者F
val g = 123.5F
val i = 123.5f
(2)下划线的使用

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

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
(3)表示方式

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

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

val a: Int = 10000
print(a === a) // 输出“true”
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(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 = 1
val i: Int = b
//正确写法, 必须显式转换
val b: Byte = 1
val 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) -位非

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

//两种调用方式,结果都为0
println(1 shr 2)
println(1.shr(2))
//结果为1
println(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 = true
if (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 = 10
val 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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值