🙌

[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, 自作クラスなどがあります。
以下のように最初はabが同じ"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は影響を受けない)

また、以下の場合はobj1obj2は同じオブジェクトを参照しているので、obj2.someField = 100;とするとobj1.someField100になります。
「参照型の変数を代入」=「同じオブジェクトを共有する」

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クラス

Stringjava.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