首页 Kotlin学习笔记(1) - 基础类型
文章
取消

Kotlin学习笔记(1) - 基础类型

一、整数类型

类型大小(位数)最小值最大值
Byte8-128127
Short16-3276832767
Int32-2,147,483,648 (-2^31)2,147,483,647 (2^31 - 1)
Long64-9,223,372,036,854,775,808 (-2^63)9,223,372,036,854,775,807 (2^63 - 1)

无需显示指定类型,会进行自动推导类型,默认是Int类型,如果超过了会推导为Long类型,如果需要的话也可以直接指定类型,如下

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

二、浮点类型

类型大小有效位指数位小数位
Float322486-7
Double64531115-16

不指定类型时,只要携带 . 就会被推导为Double类型,也可以直接指定类型

1
2
3
4
val pi = 3.14 // Double
// val one: Double = 1 // Error: type mismatch
val oneDouble = 1.0 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817

需要注意如果显式的指定了Float类型后小数部分如果超过了6-7位后会进行四舍五入

Kotlin 中不会对数字直接进行隐式转换(attn. 函数运算中会进制显示转换),像下面这样会报错

1
2
3
4
5
6
7
8
9
10
11
fun main() {
    fun printDouble(d: Double) { print(d) }

    val i = 1
    val d = 1.0
    val f = 1.0f

    printDouble(d)
//    printDouble(i) // Error: Type mismatch
//    printDouble(f) // Error: Type mismatch
}

通常可以我们可以进行显式转换,所有的数字都提供了不同类型转换方式

1
2
3
4
5
6
7
8
9
10
11
toByte(): Byte

toShort(): Short

toInt(): Int

toLong(): Long

toFloat(): Float

toDouble(): Double

在函数运算中仍然可以帮我们隐式转换

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

三、数字常量的表示

  • 十进制:123

  • 十六进制:0x0F

  • 二进制:0b00001011

  • 八进制:Kotlin中不支持八进制

Kotlin中还可以给数字添加下划线来让数字更容易理解

1
2
3
4
5
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

四、位运算

Kotlin中提供了以下中缀形式函数来支持位运算,只支持Int,Long类型

  • shl(bits)– 有符号左移
  • shr(bits)– 有符号右移
  • ushr(bits)– 无符号右移
  • and(bits)– 按位
  • or(bits)– 按位
  • xor(bits)– 按位异
  • inv()– 按位取反
1
val x = (1 shl 2) and 0x000FF000

五、无符号整数

Kotlin中提供了以下无符号整数类型

  • UByte:无符号8位整数,范围从0到255
  • UShort:无符号16位整数,范围从0到65535
  • UInt:无符号 32 位整数,范围从 0 到 2^32 - 1
  • ULong:无符号64位整数,范围从0到2^64 - 1

通过一下方式进行定义,使用用u标签,无符号Long 可以使用 UL

1
2
3
4
5
6
7
val b: UByte = 1u  // UByte, expected type provided
val s: UShort = 1u // UShort, expected type provided
val l: ULong = 1u  // ULong, expected type provided

val a1 = 42u // UInt: no expected type provided, constant fits in UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong: no expected type provided, constant doesn't fit in UInt
val a = 1UL // ULong, even though no expected type provided and constant fits into UInt

主要用于一些无需负数含义的地方.例如通常的颜色表示 如32位argb值

1
2
3
data class Color(val representation: UInt)

val yellow = Color(0xFFCC00CCu)

六、Boolean类型

Boolean类型的内置运算包含

  • ||– 逻辑
  • &&– 逻辑
  • !– 逻辑
1
2
3
4
5
6
7
val myTrue: Boolean = true
val myFalse: Boolean = false
val boolNull: Boolean? = null

println(myTrue || myFalse)
println(myTrue && myFalse)
println(!myTrue)

七、Char类型

通常使用单引号括起来 ‘1’,特殊字符需要使用\进行转意

  • \t- 标签
  • \b– 退格键
  • \n– 换行(LF)
  • \r– 回车符 (CR)
  • \'– 单引号
  • \"– 双引号
  • \\– 反斜杠
  • \$- 美元符号

编码其他字符的需要使用Unicode进行转意

1
2
3
4
5
val aChar: Char = 'a'

println(aChar)
println('\n') // Prints an extra newline character
println('\uFF00')

八、String类型

通常使用双引号括起来,字符串支持索引访问,支持遍历

1
2
3
4
5
val str = "abcd 123"
//val str1 =str[1] 
for (c in str) {
    println(c)
}

字符串一旦创建时不可变的,所有的转换操作都是返回一个新的字符串

字符串可以使用 +操作符进行字符串拼接,但需要注意拼接时的第一个字符串必须是String类型

字符串主要包括以下几种类型

  1. 转意字符串:可包含转意字符 或任意字符
1
val s = "Hello, world!\n"
  1. 多行字符串:可包含换行和任意文本,不包含转意
1
2
3
4
val text = """
    for (c in "foo")
        print(c)
"""
  1. 字符串模版:可以使用$ or ${}将常量,表达式结果等拼接到字符串中
1
2
3
4
5
6
7
8
9
10
11
val i = 10
println("i = $i")  // 输出“i = 10”

val s = "abc"
println("$s.length is ${s.length}") // 输出 "abc.length is 3"

//多行字符串中使用模版可以用$进行转意
val price = """
${'$'}_9.99
"""

九、数组

Kotlin中数组由Array类表示,通常最好在遇到性能问题或需要自定义数据结构时使用数组,否则集合应该是一个更好的选择.

原始类型数组Java 中的等效项
BooleanArrayboolean[]
ByteArraybyte[]
CharArraychar[]
DoubleArraydouble[]
FloatArrayfloat[]
IntArrayint[]
LongArraylong[]
ShortArrayshort[]

创建数组

通常可以使用arrayOf()arrayOfNulls()emptyArray() 来创建数组

也可以通过指定大小,传递一个函数进行初始化

1
2
3
4
5
6
7
8
9
// Creates an Array<Int> that initializes with zeros [0, 0, 0]
val initArray = Array<Int>(3) { 0 }
println(initArray.joinToString())
// 0, 0, 0

// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { print(it) }
// 014916

创建多维数组

1
2
3
4
5
6
7
8
9
//创建二维数组
val twoDArray = Array(2) { Array<Int>(2) { 0 } }
println(twoDArray.contentDeepToString())
// [[0, 0], [0, 0]]

// 创建三维数组
val threeDArray = Array(3) { Array(3) { Array<Int>(3) { 0 } } }
println(threeDArray.contentDeepToString())
// [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]

传递可变数量参数给函数

使用扩展运算符*进行传递

1
2
3
4
5
6
7
8
9
10
11
fun main() {
    val lettersArray = arrayOf("c", "d")
    printAllStrings("a", "b", *lettersArray)
    // abcd
}

fun printAllStrings(vararg strings: String) {
    for (string in strings) {
        print(string)
    }
}

比较数组

数组在比较时不可以直接使用== or !=,需要使用数组的比较函数.contentEquals().contentDeepEquals()

数组变换

同集合一样提供了一系列变换方法,如:sum shuffle map fliter

也提供了转化为集合的相关方法,如:.toList()and.toSet()函数、.toMap()函数

本文由作者按照 CC BY 4.0 进行授权

-

Kotlin学习笔记(2) - 控制流程