🙌
[Javaの基礎]基本データ型(プリミティブ型)と参照型について
はじめに
ここではJavaにおけるデータ型についてまとめています。
データ型
基本データ型(プリミティブ型)
Javaで用意されている基本データ型(プリミティブ型)は以下のようになってます。異なる型への再代入はできません。
データ型 | 値 |
---|---|
byte | 8ビット整数 (-128~127) |
short | 16ビット整数 (-32,768~32,767) |
int | 32ビット整数 (-2,147,483,648~2,147,483,647) |
long | 64ビット整数 (-9,223,372,036,854,775,808~9,223,372,036,854,775,807) |
float | 32ビット単精度浮動小数点数 |
double | 64ビット倍精度浮動小数点数 |
char | 16ビットUnicode文字 |
boolean | true or false |
参照型
参照型とはオブジェクトの実体ではなく、その実体がメモリ上のどこにあるか(アドレス)を記録しています。String
, Aray
, List
, Map
, 自作クラスなどがあります。
以下のように最初はa
とb
が同じ"Hello"
を参照していますが、b
に"World"
を代入した時点でb
は別の文字列を指すようになります。
String a = "Hello";
String b = a;
System.out.println(a); // Hello
System.out.println(b); // Hello
b = "World";
System.out.println(a); // Hello(aは影響を受けない)
また、以下の場合はobj1
とobj2
は同じオブジェクトを参照しているので、obj2.someField = 100;
とするとobj1.someField
も100
になります。
「参照型の変数を代入」=「同じオブジェクトを共有する」
MyClass obj1 = new MyClass();
MyClass obj2 = obj1;
参照型を扱うときの注意点
-
NullPointerException
の原因となるのでnull
チェックを忘れずに行う。 - 同じオブジェクトを参照していると、一方の変更が他方にも影響することに注意する。
-
==
での比較は同じ参照かの比較になる。値の比較にはequals()
を使う。
String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false(参照が違う)
System.out.println(a.equals(b)); // true(値が同じ)
Stringクラス
String
はjava.lang.String
というクラスであり、オブジェクト指向の概念に基づいた参照型です。String
は使用頻度が高いためリテラルを使用して簡単に生成できますが、内部的にはString
クラスのインスタンスです。
String s = "Hello"; // Stringクラスのインスタンスを生成
String s = new String("Hello"); // 明示的にオブジェクト生成
型変換
ある型を別の型に変換することをキャストといい、自動型変換(暗黙的型変換)と明示的変換(キャスト)があります。
自動型変換(暗黙的型変換)
小さいデータ型から大きいデータ型へ自動的に変換される場合、Javaが自動的に変換を行います(精度が落ちない変換)。
int i = 100;
long l = i; // int → long に自動変換
double d = l; // long → double に自動変換
System.out.println("int: " + i);
System.out.println("long: " + l);
System.out.println("double: " + d);
出力
int: 100
long: 100
double: 100.0
明示的変換(キャスト)
大きいデータ型から小さいデータ型へ変換する場合、精度の損失やオーバーフローの可能性があるため明示的なキャストが必要です。
double d = 123.456;
int i = (int) d; // 明示的キャスト:double → int
System.out.println("double: " + d);
System.out.println("int: " + i);
出力
double: 123.456
int: 123 // 小数部分が切り捨てられる
Discussion