LoginSignup
1
1

More than 3 years have passed since last update.

Javaのプリミティブ型、参照型、Immutable、Mutable

Last updated at Posted at 2020-09-17

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

では実際に確認してみましょう。

Main.java
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の方は先に書いたとおりプリミティブ型なのでいわずもがなですね。引数に渡されているのは参照先のアドレスではなく、実値なので引数に渡された値に対して値が返ってきているだけですので、元の値が変わることはありません。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1