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: 2つの値を持ちます:trueとfalse。

文字列型

  • String: 一連の文字の並び(シーケンス)です。

配列型

Kotlin は、同じ型の要素を格納するための配列型を提供します。例:

  • IntArray: 格納するInt型の配列。
  • DoubleArray: 格納するDouble型の配列。
  • Array<T>: ジェネリック配列で、任意の型を格納できます。
型 ビット幅
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'

    // ブール型
    val booleanValue: Boolean = true

    // 文字列型
    val stringValue: String = "Hello, Kotlin!"

    // 配列型
    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 Value: $byteValue")
    println("Short Value: $shortValue")
    println("Int Value: $intValue")
    println("Long Value: $longValue")
    println("Float Value: $floatValue")
    println("Double Value: $doubleValue")
    println("Char Value: $charValue")
    println("Boolean Value: $booleanValue")
    println("String Value: $stringValue")
    println("Int Array: ${intArray.joinToString()}")
    println("Double Array: ${doubleArray.joinToString()}")
    println("String Array: ${stringArray.joinToString()}")
}

リテラル定数

以下はすべての型のリテラル定数です:

  • 10進数:123
  • long 型は大文字の L で終わります:123L
  • 16進数は 0x で始まります:0x0F
  • 2進数は 0b で始まります:0b00001011
  • 注意:8進数はサポートされていません

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

2つの数値の比較

Kotlin では、2つの数値を比較するために標準の比較演算子を使用できます。含まれるのは==、!=、<、>、<=と>=。これらの演算子は基本データ型を比較できます。例えば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 とは異なり、Kotlin の Char は数値と直接演算できません。Char は単一引用符で'囲む必要があります。例えば通常の文字 '0'、'a' などです。

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')
        throw IllegalArgumentException("Out of range")
    return c.toInt() - '0'.toInt() // 显式转换为数字
}

null 許容参照が必要な場合、数値や文字はボックス化されます。ボックス化操作は同一性を保持しません。


ブール

ブールは Boolean 型で表され、true と false の2つの値を持ちます。

null 許容参照が必要な場合、ブールはボックス化されます。

組み込みのブール演算は次のとおりです:

|| – 短絡論理和  
&& – 短絡論理積  
! – 論理否定

配列

配列はクラス Array で実装されており、size プロパティと get および set メソッドを持っています。[] を使用して get と set メソッドがオーバーロードされているため、添字を使って配列の対応する位置の値を簡単に取得または設定できます。

配列の作成方法は2つあります。1つは関数 arrayOf() を使用する方法、もう1つはファクトリ関数を使用する方法です。以下に示すように、2つの方法でそれぞれ2つの配列を作成します:

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 の配列は不変(invariant)です。

クラス 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 は3つの引用符 """ で囲まれた文字列をサポートしており、複数行の文字列をサポートします。例:

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

String は trimMargin() メソッドで余分な空白を削除できます。

fun main(args: Array<String>) {
    val text = """
    |多行字符串
    |サンプル
    |多行字符串
    |サンプル
    """.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 = "サンプル"
    val str = "$s.length is ${s.length}" // 求值结果为 "サンプル.length is 6"
    println(str)
}

生文字列とエスケープ文字列の両方でテンプレートがサポートされています。生文字列内でリテラルの $ 文字を表す必要がある場合(バックスラッシュエスケープはサポートされていません)、次の構文を使用できます:

fun main(args: Array<String>) {
    val price = """
    ${'$'}9.99
    """
    println(price)  // 求值结果为 $9.99
}
その他の拡張