はじめに
これは大学中退後8年間フリーターだったアラサーが一念発起してエンジニアに転職できたはいいものの、右も左もわからなすぎるのでJavaSilverを取得しようと頑張ったけどここで詰まったよってお話です。
まず私にはほとんどJavaの知識はありません。それどころかプログラミング全般大した知識が無いと言っていいです。
学生時代に趣味と授業でC言語はいじったなぁくらいで、最近はPython3をWeb教材で勉強したぞ! ってくらいのドがつく素人です。
で、何故Javaの資格かと言われると単純に需要が高そうだから。それだけです。
オブジェクト指向ってやつをするのに適してるらしいじゃん? くらいの印象しかありません。
Java Silver合格まで勉強中詰まったところをほぼ自分用に書いていこうと思います。
間違い等ありましたら是非私の未来の為に教えてください。
#String型の不思議
とりあえずJavaの入門書を買って勉強していると、さっそく面白い内容にぶちあたりました。
なんと、String型は参照型であるため例えば
public class StrTest {
public static void main(String args[]) {
String str1 = "hoge";
String str2 = "ho";
str2 += "ge";
System.out.println(str1 == str2);
}
}
はfalse
になるから文字列比較する時は
public class StrTest {
public static void main(String args[]) {
String str1 = "hoge";
String str2 = "ho";
str2 += "ge";
System.out.println(str1.equals(str2));
}
}
みたいにequals()
を使用するんだぞ
とのこと。さっそく大興奮の私は試しにこんなコードを書きました。
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なので値を変更することがそもそもできないようです。
値を変更できない……???
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であるようです。
さっき書いたコードはどっかのメソッドで新たな文字列が勝手に爆誕しているだけだったってことですね。