Базовые типы данных 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 |
Примеры
// Целочисленные типы
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
}
Преобразование типов: Kotlin автоматически выполняет преобразование типов при сравнении разных типов данных. Например, в приведённом выше примере,
aДаIntтип, иcДаDoubleтип, Kotlin автоматически преобразуетaвDoubleтип для сравнения.Равенство: В 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
}
Другие расширения