Базовые типы данных Kotlin

Основные числовые типы Kotlin включают Byte, Short, Int, Long, Float, Double и т. д.

В отличие от Java, символы не являются числовым типом и представляют собой независимый тип данных.

Целочисленные типы

  • Byte: 8-битный, диапазон от -128 до 127.
  • Short: 16-битный, диапазон от -32,768 до 32,767.
  • Int: 32-битный, диапазон от -2^31 до 2^31 - 1.
  • Long: 64-битный, диапазон от -2^63 до 2^63 - 1.

Типы с плавающей запятой

  • Float: 32-битный, одинарной точности, с 6-7 значащими цифрами.
  • Double: 64-битный, двойной точности, с 15-16 значащими цифрами.

Символьный тип

  • Char: 16-битный символ Unicode.

Логический тип

  • Boolean: имеет два значения:trueиfalse。

Строковый тип

  • String: последовательность символов.

Тип массива

Kotlin предоставляет типы массивов для хранения элементов одного типа, например:

  • IntArray: хранитIntмассив типа.
  • DoubleArray: хранитDoubleмассив типа.
  • Array<T>: обобщённый массив, может хранить любой тип.
Type Разрядность
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

Примеры

fun main() {
    // Целочисленные типы
    val byteValue: Byte = 127
    val shortValue: Short = 32767
    val intValue: Int = 2147483647
    val longValue: Long = 9223372036854775807L

    // Типы с плавающей запятой
    val floatValue: Float = 3.14F
    val doubleValue: Double = 3.141592653589793

    // Символьный тип
    val charValue: Char = 'A'

    // Тип Boolean
    val booleanValue: Boolean = true

    // Тип String
    val stringValue: String = "Привет, Kotlin!"

    // Тип Array
    val intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)
    val doubleArray: DoubleArray = doubleArrayOf(1.1, 2.2, 3.3)
    val stringArray: Array<String> = arrayOf("Kotlin", "Java", "Python")

    // Вывести все значения
    println("Значение Byte: $byteValue")
    println("Значение Short: $shortValue")
    println("Значение Int: $intValue")
    println("Значение Long: $longValue")
    println("Значение Float: $floatValue")
    println("Значение Double: $doubleValue")
    println("Значение Char: $charValue")
    println("Значение Boolean: $booleanValue")
    println("Значение String: $stringValue")
    println("Массив Int: ${intArray.joinToString()}")
    println("Массив Double: ${doubleArray.joinToString()}")
    println("Массив String: ${stringArray.joinToString()}")
}

Литеральные константы

Ниже приведены литеральные константы всех типов:

  • Десятичная запись: 123
  • Длинные целые числа заканчиваются заглавной L: 123L
  • Шестнадцатеричная запись начинается с 0x: 0x0F
  • Двоичная запись начинается с 0b: 0b00001011
  • Примечание: восьмеричная запись не поддерживается

Kotlin также поддерживает значения с плавающей точкой в традиционной записи:

  • Стандартная запись для Double:123.5, 123.5e10
  • Числа Float используют суффикс f или F:123.5f

Можно использовать символы подчёркивания, чтобы сделать числовые константы более читаемыми:

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、Double、Floatи т. д.

fun main() {
    val a: Int = 5
    val b: Int = 10
    val c: Double = 5.0

    // 相等和不相等比较
    println("a == b: ${a == b}")   // 输出 false
    println("a != b: ${a != b}")   // 输出 true

    // 大小比较
    println("a < b: ${a < b}")     // 输出 true
    println("a > b: ${a > b}")     // 输出 false
    println("a <= b: ${a <= b}")   // 输出 true
    println("a >= b: ${a >= b}")   // 输出 false

    // 不同类型的比较
    println("a == c: ${a == c}")   // 输出 true,Kotlin 自动将 Int 转换为 Double 进行比较
    println("a < c: ${a < c}")     // 输出 false
    println("a > c: ${a > c}")     // 输出 false
}
  1. Преобразование типов: Kotlin автоматически выполняет преобразование типов при сравнении разных типов данных. Например, в приведённом выше примере,aДаIntтип, иcДаDoubleтип, Kotlin автоматически преобразуетaвDoubleтип для сравнения.

  2. Равенство: В Kotlin,==оператор используется для сравнения структурного равенства, то есть сравнения значений, тогда как===оператор используется для сравнения ссылочного равенства, то есть для проверки, являются ли объекты одним и тем же экземпляром. При сравнении базовых типов данных,==оператор обычно используется.

fun main() {
    val x: Int = 1000
    val y: Int = 1000

    println("x == y: ${x == y}")   // 输出 true,值相等
    println("x === y: ${x === y}") // 输出 false,不同的实例

    val z: Int = x
    println("x === z: ${x === z}") // 输出 true,引用相同
}

В этом примере,xиyзначения равны, но они являются разными экземплярами, поэтомуx === yвозвращаетfalse. Ноxиzссылаются на один и тот же экземпляр, поэтомуx === zвозвращаетtrue。


Преобразование типов

Из-за различных представлений меньшие типы не являются подтипами больших типов, и меньшие типы не могут быть неявно преобразованы в большие типы. Это означает, что мы не можем присвоить значение Byte переменной Int без явного преобразования.

val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b // 错误

Вместо этого мы можем использовать его метод toInt().

val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b.toInt() // OK

Каждый тип данных имеет следующие методы, которые могут преобразовывать в другие типы:

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

В некоторых случаях также возможно автоматическое преобразование типов, при условии, что правильный тип данных можно вывести из контекста, а математические операторы перегружены соответствующим образом. Например, следующий код корректен:

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

Побитовые операторы

Для типов Int и Long также существует ряд побитовых операторов, которые можно использовать, а именно:

shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 无符号右移位 (Java’s >>>)
and(bits) – 与
or(bits) – или 
xor(bits) – 异或
inv() – 反向

Символы

В отличие от Java, Char в Kotlin не может напрямую работать с числами, и Char должен быть заключён в одинарные кавычки'. Например, обычные символы '0', 'a'.

fun check(c: Char) {
    if (c == 1) { // 错误:类型不兼容
        // ……
    }
}

Символьные литералы заключаются в одинарные кавычки: '1'. Специальные символы можно экранировать с помощью обратных слешей. Поддерживаются следующие escape-последовательности: \t, \b, \n, \r, \', \", \\ и \$. Чтобы закодировать другие символы, используйте синтаксис escape-последовательности Unicode: '\uFF00'.

Мы можем явно преобразовать символ в число Int:

fun decimalDigitValue(c: Char): Int {
    if (c !in '0'..'9')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 显式转换为数字
}

Когда требуется nullable-ссылка, числа и символы упаковываются. Операции упаковки не сохраняют идентичность.


Boolean

Boolean представлен типом Boolean, который имеет два значения: true и false.

Если требуется nullable-ссылка, булевы значения будут упакованы.

Встроенные логические операции включают:

|| – Short-circuit logical OR
&& – Short-circuit logical AND
! - Logical NOT

Массивы

Массивы реализованы с помощью класса Array, а также имеют свойство size и методы get и set. Поскольку [] перегружает методы get и set, мы можем легко получить или установить значение в соответствующей позиции массива по индексу.

Существует два способа создать массив: один — использовать функцию arrayOf(); другой — использовать фабричные функции. Как показано ниже, мы создали два массива двумя способами:

fun main(args: Array<String>) {
    //[1,2,3]
    val a = arrayOf(1, 2, 3)
    //[0,2,4]
    val b = Array(3, { i -> (i * 2) })

    //读取数组内容
    println(a[0])    // 输出结果:1
    println(b[1])    // 输出结果:2
}

Как упоминалось выше, оператор [] представляет вызов функций-членов get() и set().

Примечание: В отличие от Java, массивы в Kotlin инвариантны.

Помимо класса Array, существуют также ByteArray, ShortArray, IntArray, которые представляют массивы различных типов, избавляя от операций упаковки, и поэтому более эффективны. Их использование такое же, как у Array:

val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

Строки

Как и в Java, String является неизменяемым. Синтаксис квадратных скобок [] позволяет легко получить символ строки, а также перебрать строку с помощью цикла for:

for (c in str) {
    println(c)
}

Kotlin поддерживает строки, заключённые в три кавычки """, поддерживая многострочные строки, например:

fun main(args: Array<String>) {
    val text = """
    多行字符串
    多行字符串
    """
    println(text)   // 输出有一些前置空格
}

String может использовать метод trimMargin() для удаления лишних пробелов.

fun main(args: Array<String>) {
    val text = """
    |多行字符串
    |Example
    |多行字符串
    |Example
    """.trimMargin()
    println(text)    // 前置空格删除了
}

По умолчанию | используется в качестве граничного префикса, но вы можете выбрать другой символ и передать его в качестве параметра, например trimMargin(">").


Шаблоны строк

Строки могут содержать шаблонные выражения, то есть небольшие фрагменты кода, которые вычисляются, и результаты подставляются в строку. Шаблонные выражения начинаются со знака доллара ($) и состоят из простого имени:

fun main(args: Array<String>) {
    val i = 10
    val s = "i = $i" // 求值结果为 "i = 10"
    println(s)
}

Или произвольные выражения, заключённые в фигурные скобки:

fun main(args: Array<String>) {
    val s = "example"
    val str = "$s.length is ${s.length}" // 求值结果为 "example.length is 6"
    println(str)
}

Шаблоны поддерживаются как в сырых строках, так и в экранированных строках. Если вам нужно представить литеральный символ $ в сырой строке (которая не поддерживает экранирование обратной косой чертой), вы можете использовать следующий синтаксис:

fun main(args: Array<String>) {
    val price = """
    ${'$'}9.99
    """
    println(price)  // 求值结果为 $9.99
}
Другие расширения