Javaプログラミングについて個人的にまとめたものです。内容には間違いが含まれている場合があります。
言語仕様
- 変数に
finalを付けると、その変数へ代入することができなくなるが、変数が参照する先はその限りではない- 配列やクラスを型とする変数を
finalにしても、その要素やフィールドには代入することができる
- 配列やクラスを型とする変数を
java.lang
StringBufferとStringBuilderの違い
- 使い方に違いはない
- 基本は
StringBuilderを使う
StringBuffer
- スレッドセーフである
- 単純に使おうとすると同期を伴う分だけ遅くなる
StringBuilder
- スレッドセーフではない
- 単純に使おうとすると同期を伴わない分だけ速くなる
java.util
コンテナ生成時の一括初期化
参考資料:https://www.baeldung.com/java-initialize-hashmap
initializer blockを使う方法
参考資料:https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
- static initialization blockを使ってstatic変数を初期化するときに要素を追加する
- 匿名クラスのインスタンスを初期化するときに要素を追加する
- メモリリークの原因になったりするので、この方法は使わないほうが良い
// static変数
static HashMap<K, V> staticMap;
static {
staticMap = new HashMap<>();
staticMap.put(new K(), new V());
};
// 匿名クラス
var anonMap = new HashMap<K, V>() {{
put(new K(), new V());
}};Map.of()を使う方法(Java 9以降)
- 要素数が0から10の間であれば、
Map.of()を使ってimmutableなMapを作ることができる
Guavaを使う方法
ImmutableMap.Builder<K, V>を使ってImmutableMapを構築する
VectorとArrayListの違い
- 使い方に違いはほとんどない
- 基本は
ArrayListを使う
Vector
- スレッドセーフである
- 単純に使おうとすると同期を伴う分だけ遅くなる
- 容量が不足する場合、
capacityIncrementの値に基づいてgrowされるcapacityIncrement <= 0であれば、その時点の容量の2倍にgrowされる
ArrayList
- スレッドセーフではない
- 単純に使おうとすると同期を伴わない分だけ速くなる
- 容量が不足する場合、実装依存のサイズにgrowされる
- その詳細は規定されていない