未経験エンジニア奮闘記 JavaSilver合格目指して勉強中詰まったところString型編


はじめに

これは大学中退後8年間フリーターだったアラサーが一念発起してエンジニアに転職できたはいいものの、右も左もわからなすぎるのでJavaSilverを取得しようと頑張ったけどここで詰まったよってお話です。

まず私にはほとんどJavaの知識はありません。それどころかプログラミング全般大した知識が無いと言っていいです。
学生時代に趣味と授業でC言語はいじったなぁくらいで、最近はPython3をWeb教材で勉強したぞ! ってくらいのドがつく素人です。

で、何故Javaの資格かと言われると単純に需要が高そうだから。それだけです。
オブジェクト指向ってやつをするのに適してるらしいじゃん? くらいの印象しかありません。

Java Silver合格まで勉強中詰まったところをほぼ自分用に書いていこうと思います。
間違い等ありましたら是非私の未来の為に教えてください。

String型の不思議

とりあえずJavaの入門書を買って勉強していると、さっそく面白い内容にぶちあたりました。
なんと、String型は参照型であるため例えば

StrTest.java
public class StrTest {
  public static void main(String args[]) {
    String str1 = "hoge";
    String str2 = "ho";
    str2 += "ge";
    System.out.println(str1 == str2);
  }
}

falseになるから文字列比較する時は

StrTest.java
public class StrTest {
  public static void main(String args[]) {
    String str1 = "hoge";
    String str2 = "ho";
    str2 += "ge";
    System.out.println(str1.equals(str2));
  }
}

みたいにequals()を使用するんだぞ

とのこと。さっそく大興奮の私は試しにこんなコードを書きました。

StrTest.java
public class StrTest {
  public static void main(String args[]) {
      String str = "hoge";
      StrChange(str);
      System.out.println(str);
  }

  public static void StrChange(String str){
      str = "fuga";
  }
}

これで出力はfugaになるはず。なんてったって参照型なんだから。
そう思って実行すると出力されるのはhoge。おやぁ~??

まったくクエスチョンになったのでGoogle先生に泣きついてみると、しっかり解説が出てきました。
先輩エンジニアの皆さん、ありがとうございます。

どうやらString型のインスタンスはimmutableなので値を変更することがそもそもできないようです。
値を変更できない……???

StrTest.java
public class StrTest {
  public static void main(String args[]) {
        String str = "hoge";
        System.out.println(str); // hoge
        str += "hoge";
        System.out.println(str); // hogehoge
        str = "fuga";
        System.out.println(str); // fuga
  }
}

めちゃ変更されてる!!
何故immutableなのに値が変更できる? 何故変更できるのにさっきのコードでは変更されてない?

前後不覚になったのでGoogle先生に泣きついてみると、しっかり解説が出てきました。
先輩エンジニアの皆さん、ありがとうございます。

どうやら値を変更しているようにみえて実際は新たな領域に新しい値として作り直しているようです。
というわけで間違いなくString型はimmutableであるようです。
さっき書いたコードはどっかのメソッドで新たな文字列が勝手に爆誕しているだけだったってことですね。