Javaのプリミティブ型、参照型、Immutable、Mutableをまとめて理解する
Java Silverの勉強をしていますが、この辺りがバラバラに出てきて混乱したので、自分自身の理解をまとめてみました。
プリミティブ型
Type | Value | Bit |
---|---|---|
boolean | 真偽値 | 1 |
byte | 整数 | 8 |
short | 整数 | 16 |
char | 文字 | 16 |
int | 整数 | 32 |
float | 浮動小数点 | 32 |
long | 整数 | 64 |
double | 浮動小数点 | 64 |
参照型
こちらは主にクラスやString、StringBuilderが含まれます。
Let's try
では実際に確認してみましょう。
class Codechef
{
public static void main (String[] args) throws java.lang.Exception
{
StringBuilder sb = new StringBuilder("apple");
sample(sb);
System.out.println(sb); // "apple orange"
StringBuilder ssb = new StringBuilder("apple");
sample5(ssb);
System.out.println(ssb); // "apple"
String s = "apple";
String t = sample2(s);
System.out.println(s); // "apple"
System.out.println(t); // "apple orange"
int i = 1;
sample3(i);
System.out.println(i); //1
}
public static StringBuilder sample(StringBuilder sb) {
return sb.append(" orange");
}
public static String sample2(String s) {
return s+" orange";
}
public static int sample3(int i) {
return i+10;
}
public static StringBuilder sample5(StringBuilder sb) {
return new StringBuilder(sb+" orange");
}
}
Immutable vs Mutable
ここで確認しておきたいのは、同じ参照型でもImmutableなStringとMutableなStringBuilderの違いです。
以下のコードでは、"apple orange"がsbに対して入っており、つまりは引数に渡されたStringBuilderはその値である"apple"ではなく、sbのアドレスが参照として渡されているため、参照先であるsbの値そのものが変わっています。
StringBuilder sb = new StringBuilder("apple");
sample(sb);
System.out.println(sb); // "apple orange"
public static String sample2(String s) {
return s+" orange";
}
対してStringの方はこちらも参照型ですが、引数に渡されたStringの値そのものは変わっていません。なぜか。これはStringBuilderがMutableでStringがImmutableだからです。Stringの方は一度初期化時に割り当てた値はその後変更できない為、 +
などでStringの元の値を変更しようとした場合は内部では新しいインスタンスが返されており、最初に割り当てた参照先の値は変わりません。変更後の値を使用したい場合は、以下のように新たにString変数を作成して、そちらに割り当てるしかありません。
String s = "apple";
String t = sample2(s);
System.out.println(s); // "apple"
System.out.println(t); // "apple orange"
public static String sample2(String s) {
return s+" orange";
}
intの方は先に書いたとおりプリミティブ型なのでいわずもがなですね。引数に渡されているのは参照先のアドレスではなく、実値なので引数に渡された値に対して値が返ってきているだけですので、元の値が変わることはありません。