Java 文字列の連結にて+演算子は使わないほうがいいのか?

文字列結合

・文字列を+演算子を使って結合した時
・文字列をStringBuilderクラスを使って結合した時

文字列を+演算子を使って結合した時
String a = "aa";
String b = "bb";
String s = a + b;

Stringクラスは不変クラス*1であるため、"aa"という情報を持ったインスタンスが大きくなって、"aabb"になるわけではない。+演算子が使われた瞬間に、"aa"のインスタンスは破棄され、新たに"aabb"のインスタンスが生成される。

文字列をStringBuilderクラスを使って結合した時
StringBuilder sb = new StringBuilder();
String a = "aa";
String b = "bb";
sb.append(a);
sb.append(b);
String s  = sb.ToString();

StringBuilderクラスは可変クラスで構成されているため、文字列結合する度に新たなインスタンスが生成されるわけではなく、バッファの領域を増やして新たな文字列を追記していく。

  1. 演算子では、文字列結合が行われる度にインスタンスを捨てたり、生成したりしているので遅いが、見た目が直感的でわかりやすい。

何回も文字列結合を行うのであれば、StringBuilderクラスを使った方が良いが、数回の文字列結合であれば、わかりやすい+演算子を使ったほうがいいのかもしれない。

*1:インスタンス化の後に内容が絶対に変化しないように設計されたクラスのこと。

CentOS7 ネットワーク設定 -備忘録-

JavaでWebアプリの勉強をしようと思って、仮想環境にPostgresql入れようと思ったらはまった。
おかげで今日の午前中潰れたよ・・・。

参考サイト

CentOSを入れたらネットにつながらなかった話 - Qiita

「ifcfgほにゃらら」の部分は、

ls -la /etc/sysconfig/network-scripts/ifcfg*

で設定ファイルの内容を確認することでわかる。

Java オーバーライドとオーバーロード -備忘録-

なぜ勉強したか

  • クラスに関しての知識がぼんやりしていた為。
  • 継承との関係性を理解する為。

オーバーライド

  • スーパークラスで定義されているメソッドを、サブクラスで再定義すること。サブクラスで特化した機能を付けたい場合に使用する。
public class Food {
	String action = "食べ物を食べました。";
	public void EatFood() {
		System.out.println(action);
	}
}

public class Vegetables extends Food {
	String action = "野菜を食べました。";
	@Override
	public void EatFood() {
		System.out.println(action);
	}
}

public class Eat {
	public static void main(String[] args) {
		Food eat1 = new Food();
		Food eat2 = new Vegetables();
		eat1.EatFood(); //食べ物を食べました。
		eat2.EatFood(); //野菜を食べました。
	}
}
  • オーバーライドするメソッドには@Overrideを付けたほうが良い。理由としては、スペルミスや存在しないメソッドをオーバーライドしてるよーってエラーで知らせてくれる。

オーバーロード

  • 同一クラスないの同一メソッド名で、「引数の型」、「引数の数」、「並び順」が異なるメソッドを複数定義すること。
public class Food {
	
	/**
	 * 
	 * @param food 食べ物
	 * @param type 食べる種類
	 */
	public void EatFood(String food, int type) {
		System.out.println(food + "を" + type + "種類食べました。");
	}
	
	/**
	 * 
	 * @param food 食べ物
	 */
	public void EatFood(String food) {
		System.out.println(food + "を食べました。");
	}
}

public class Eat {
	public static void main(String[] args) {
		String food = "食べ物";
		int typeNum = 2;
		Food eat1 = new Food();
		
		eat1.EatFood(food, typeNum); // 食べ物を二種類食べました。
		eat1.EatFood(food); // 食べ物を食べました。

	}
}

覚え方

オーバーライド

オーバー(上に) ライド(乗る=上書きする)
スーパークラスのメソッドを上書きする。

オーバーロード

オーバー(上に) ロード(読み込む)
メソッドを複数読み込む

オブジェクト指向ができるまで -備忘録-

・なぜ勉強したか?

・次の客先でJavaを使うので、オブジェクト指向プログラミングの理解を深めたかったから。

・一応C#が得意だけど、オブジェクト指向プログラミングってどうやって生まれたんだろう、とふと疑問に思ったから。

オブジェクト指向プログラミングの歴史

ソフトウェア危機

・1960年代、高級言語が開発されソフトウェアの生産性が一気に向上。

 このままでは需要が増大するソフトウェアに対応しきれない!

構造化プログラミング

・そこで、様々なアイディアが提案され特に構造化プログラミングが注目された。

 (提案したのはダイクストラという有名なプログラマ

 構造化プログラミングってどんなん?

 -goto文はやめましょう。

 -これからはロジックを以下の3つの構造で開発しましょう。

  -順次実行

  -条件分岐

  -繰り返し

だけど、こんな問題がありました。

 「低レベルな基本データ型の抽象化しか出来ない。」

モジュラプログラミング

・上記の問題を解決するために、

「自分でデータ型を定義できるようにして、それを処理する手続きとか関数をまとめて一個の単位にしましょう!」

という考え方が提案され、これがモジュールという概念。

しかし、まだ問題がありました。

 「自分でデータ型を定義できるようになったことで、定義に対して値となる実体(インスタンス)が複数存在するようになり、実体を管理する枠組みがなかった。」

オブジェクト指向プログラミング

・またもや上記の問題を解決するのに、考えられたのがオブジェクト指向

実体(インスタンス)を整理して管理する仕組み(クラスとか、継承とか)がこいつによって作られた。

Simula」(1967年)がオブジェクト指向初の言語らしい。

まとめ

・ソフトウェア開発が膨大になりすぎて管理できないよー

開発を楽にしたい!から生まれた。