Skip to content
Go back

Javaメモ

· Updated:

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変数を初期化するときに要素を追加する
  • 匿名クラスanonymous classのインスタンスを初期化するときに要素を追加する
    • メモリリークの原因になったりするので、この方法は使わないほうが良い
// 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される
    • その詳細は規定されていない