Kotlinの基本的なデータ型には、Byte、Short、Int、Long、Float、Doubleなどがあります。 Javaとの違いは、文字はデータ型ではなく、独立したデータ型であるということです。
データ型 | ビット幅 |
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
目次
リテラル定数
以下は、すべてのデータ型のリテラル定数です。
- 10進数:123
- 長整数は大文字のLで終わります:123L
- 16進数は0xで始まります:0x0F
- 2進数(バイナリ)は0bで始まります:0b00001011
- ヒント:8進数はサポートされていません
Kotlinは、従来の表記法で浮動小数点値もサポートしています:
- Doublesデフォルトの書き方: 123.5, 123.5e10
- Floatsは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には基本的なデータ型がなく、カプセル化された数値型のみがあります。変数を定義するたびに、Kotlinは実際にオブジェクトをカプセル化して、nullポインターがないことを確認します。 数値型も同じであるため、2つの数値を比較する場合、データのサイズ、または2つのオブジェクトが同じであるかどうかを比較する違いがあります。
Kotlinでは、3つの等号===はオブジェクトのアドレスを比較することを意味し、2つの等号==は2つの値のサイズを比較することを意味します。
fun main(args: Array<String>) {
val a: Int = 10000
println(a === a) // true,値、またはオブジェクトのアドレスが同じです
//ボックス化した後、2つの異なるオブジェクトが作成されます
val boxedA: Int? = a
val anotherBoxedA: Int? = a
//ボックス化されていますが、値は等しく、両方とも10000です
println(boxedA === anotherBoxedA) // false,値が等しいで、オブジェクトのアドレスが異なります
println(boxedA == anotherBoxedA) // 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) | 論理 AND |
or(bits) | 論理 OR |
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 許容参照ブール値は、必要に応じてボックス化されます。
組み込みのブール演算は次のとおりです。
|| | 条件論理 OR |
&& | 条件付き論理 AND |
! | 論理否定 |
配列
配列はクラス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の配列は不変です。
クラス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 = """
|複数行の文字列
|初心者チュートリアル
|複数行の文字列
|ceodata
""".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 = "ceodata"
val str = "$s.length is ${s.length}" // 実行結果は "ceodata.length is 7"
println(str)
}
ネイティブ文字列とエスケープ文字列はテンプレートをサポートしています。 リテラルの$文字をネイティブ文字列で表す必要がある場合(バックスラッシュのエスケープはサポートされていません)、次の構文を使用してください。
fun main(args: Array<String>) {
val price = """
${'$'}9.99
"""
println(price) // 実行結果は $9.99
}
コメントを残す