データ型
Javaにはデータ型が2種類あります
- 基本データ型(プリミティブ型)
byte short int long
float double boolean char
- 参照型(クラス型)
String Array Class
基本データ型と参照型のデータ保存方法の違い
-
基本データ型
メモリ領域に格納するのはデータの値 -
参照型
メモリ領域に格納するのはデータの値とデータを格納した番地の値
格納順序(Arrayを例にした場合)
// Arrayの宣言
// この時点ではデータの格納領域がどれくらいかがわからないため変数aを入れるためだけのメモリを確保する
int[] a;
// データの格納
// 変数へデータを格納した時点でメモリ上では格納した値の数分メモリを確保する
// 1で確保したメモリには2で確保したメモリの最初の番地を格納する
a = { 100, 200, 300 };
参照型は上記のような特性があるためデータの更新は注意が必要
参照型はメモリの番地を保存しているために意図しない更新が発生する
// 意図しない更新
int[] a = { 100, 200, 300 };
int[] b = a;
b[0] = 1000;
System.out.println(a[0]); // 1000
System.out.println(b[0]); // 1000
String型については上記の更新を行なった場合でも元の変数は更新されない
String型は元の変数を違う変数へ格納、更新のタイミングで元の変数と値が異なる場合に新たにメモリ領域を確保する
// String型のデータ更新
String a = "hello";
String b = a;
b = "world";
System.out.println(a[0]); // hello
System.out.println(b[0]); // world
ラッパークラス
基本データ型の値をラッピングしてオブジェクトとして利用できるようにするクラスが用意されている。
基本データ型にはそれに対応する参照型のクラスが用意されている
基本型 | ラッパークラス |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
// 基本データ型をIntegerクラスにしたい場合
Integer i = new Integer(32);
// Integaerクラスを基本データ型にしたい場合
int n = i.intValue();
実は上記は不要、ラッパークラスから基本データ、基本データ型からラッパークラスに自動変換される
- 基本データ型 → ラッパークラスへの変換: auto boxing
- ラッパークラス → 基本データへの変換: auto unboxing
nullの場合は自動変換時にエラーになる
// 基本データ、ラッパークラス間の変換は不要
Integer i = 32;
int n = i;
String型の比較
String型の比較の場合String型の特性上意図しない比較になることがある
String型は基本メモリの番地を参照するが基本データ型に寄せているので同じ値のString型を複数定義した場合に最初に定義したString型のメモリを共有する
別のメモリを使用したい場合は明示的にString型を宣言する必要がある
同じ文字列か比較したい場合は equals
メソッドを使う。
public class Main {
public static void main(String[] args){
// 以下二つのString型の変数は同じメモリ番地を参照している
String ab1 = "ab";
String ab2 = "ab";
System.out.println(ab1 == ab2); // 結果: true
// メモリを分ける場合
String ab3 = new String("ab");
String ab4 = new String("ab");
System.out.println(ab3 == ab4); // 結果: false
System.out.println(ab3.equals(ab4)); // 結果: true
}
}