Java Basics
Java核心 概念 と基礎 知識 リファレンス。
CDI
Contexts and Dependency Injection
Do-it-Yourself Dependency Injection
Collection
Java Collections Frameworkは、List、Set、Map、Queueなどのデータ構造 を提供 。
ConcurrentHashMap
- 複数 のスレッドが同時 にエントリにアクセス可能
- デフォルト:16セグメントに分割
- デフォルト容量 :16、負荷 係数 :0.75
CopyOnWriteArrayList
- ArrayListのスレッドセーフ版
- 書 き込 み操作 時 に基礎 配列 の新 しいコピーを作成
classpath
classpathは、Javaランタイムがクラスとリソースを検索 するために使用 。
Encapsulation
| Modifier | Class | Package | Subclass (Same/Other Package) | Global |
|---|---|---|---|---|
| private | ⭕ | |||
| default | ⭕ | ⭕ | ||
| protected | ⭕ | ⭕ | ⭕ | |
| public | ⭕ | ⭕ | ⭕ | ⭕ |
Enum
int enum pattern
- 欠陥 あり!
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;- 型 安全性 がなく、便利 さもない。
コンパイラは_apple_を_orange_を期待
するメソッドに渡
しても警告
しない。
int enumはコンパイル時
定数
であり、使用
するクライアントにコンパイルされる。
enum定数
に関連
する_int_が変更
されると、クライアントを再
コンパイルする必要
がある。
int enum定数
を印刷
可能
な文字列
に変換
する簡単
な方法
がない(数字
しか見
えない)。
Solution - Enum Types
主要 ポイント:
- enumは型 安全性 を向上
- enum型 のフィールド名 は大文字
- enumはswitch文 で簡単 に使用 可能
- enumは走査 可能
- enumはフィールド、コンストラクタ、メソッドを持 てる
- enumのコンストラクタはprivateなのでインスタンス作成 不可
- enumに抽象 メソッドを書 いて実装 を提供 可能
- enumは複数 のインターフェースを実装 できるが、クラスは継承 できない(内部 でEnumクラスを継承 )
Exception
Checked Exception 検査例外
必
ず処理
が必要
なException。これらの状況
は事前
に回避
できるとは限
らず、外部
環境
に関連
することが多
いため、事前
処理
が必須
。
Unchecked Exception 非検査例外
必
ずしも処理
する必要
がないException。これらの状況
はエンジニアがコードを書
く際
に事前
に回避
できるため、Javaはコードの複雑
さを増
やさないよう強制
しない。
Generics
- PECS
- Producer : 読 み取 りのみ、格納 不可 (Covariance)
- Consumer : 格納 可能 、外部 への読 み取 りはObjectのみ (Contravariance)
I/O
graph RL
subgraph TOP
R[\Reader\] --> |character streams| Z{Object}
W[\Writer\] --> |character streams| Z
IS[\InputStream\] --> |bytes stream| Z
OS[\OutputStream\] --> |bytes stream| Z
end
データフロー (Data Flow) 処理
入力は源を探す
graph LR
0((源 Source))
==> 1([低階Input_FileInputStream])
==> 2([高階Input_BufferedInputStream])
==> 3([任意の高階Input])
==> infitity((プログラム Program))
出力は宛先を探す
flowchart LR
infitity((プログラム Program))
==> 3([任意の高階Output])
==> 2([高階Output_BufferedOutputStream])
==> 1([低階Output_FileOutputStream])
==> dest((宛先 Destination))
I/Oを閉じる
- try-with-resource
- 最終 ラッパーの高階 ストリームのみ閉 じる
Stream APIs
- Intermediate Operations
- Stateful
- Stateless
- Terminal Operation
- Short-Circuit
- Non-Short-Circuit
Intermediate operationsは常
にlazy。
Stateless
操作
の処理
が以前
の要素
に影響
されない場合
、ステートレス
- unordered, filter, map, mapToInt, mapToLong, mapToDouble
- flatMap, flatMapToInt, flatMapToLong, flatMapToDouble, peek
Stateful
操作
がこれまで処理
されたすべての要素
の情報
を必要
とする場合
、ステートフル
- distinct, sorted, limit, skip
Short-Circuit
要素
の不要
な処理
を回避
して計算
を最適
化
し、パフォーマンスを向上
させる操作
。
- anyMatch, allMatch, noneMatch, findFirst, findAny, limit
Non-Short-Circuit
最終
結果
を得
るためにすべての要素
を処理
する必要
がある。
- forEach, forEachOrdered, toArray, reduce, collect, max, min, count
Functional Interface
| Interface | 説明 | Method(s) |
|---|---|---|
Predicate<T> | 1つの引数 の述語 (boolean値 関数 ) | boolean test(T t) |
Consumer<T> | 1つの入力 引数 を受 け取 り、結果 を返 さない操作 | void accept(T t) |
Function<T, R> | 1つの引数 を取 り、結果 を生成 する関数 | R apply(T t) |
Supplier<T> | 結果 のサプライヤ | T get() |
UnaryOperator<T> | 1つのオペランドに対 する操作 で、同 じ型 の結果 を生成 | T apply(T t) |
BinaryOperator<T> | 同 じ型 の2つのオペランドに対 する操作 、同 じ型 の結果 を生成 | T apply(T t1, T t2) |
BiPredicate<T, U> | 2つの引数 の述語 | boolean test(T t, U u) |
BiConsumer<T, U> | 2つの入力 引数 を受 け取 り、結果 を返 さない操作 | void accept(T t, U u) |
BiFunction<T, U, R> | 2つの引数 を取 り、結果 を生成 する関数 | R apply(T t, U u) |
Comparator<T> | 同 じ型 の2つのオブジェクトを比較 する関数 | int compare(T o1, T o2) |
上記
が要件
を満
たさない場合
は、カスタム
@FunctionalInterfaceを使用Supplier
- 引数
を取
らず値
を返
す動作
が必要
な場合
は
Supplierを使用
Consumer
- 引数
を1つ受
け取
り、処理
後
に値
を返
さない動作
が必要
な場合
は
Consumerを使用
Function
- 引数
を1つ受
け取
り、計算
後
に結果
を返
す動作
が必要
な場合
は
Functionを使用
Predicate
- 引数
を1つ受
け取
り、boolean値
のみを返
す動作
が必要
な場合
は
Predicateを使用
SPI
Service Provider Interface
Javaが提供 する、サードパーティによる実装 や拡張 のためのインターフェース。フレームワークの拡張 やコンポーネントの置 き換 えに使用 。
flowchart
subgraph Provide
Cer[Caller]
I[interface]
end
Impler[Service Provider]
Cer ---->|Call| I
Impler ---->|implementation| I
Time
LocalDateTime
- ISO-8601 タイムゾーンなしの日付 時刻
- Immutable
日付
の記述
に適
している:例
えば誕生
日
、締
め切
りなど。ただし、オフセット/タイムゾーンなどの追加
情報
がなければ、時間
はタイムライン上
の特定
の瞬間
を表
すことができない。
2023-08-01T12:30:15Z[UTC]
- T : 完全 な日時
- Z : UTC +0、グリニッジ標準 時
CLI
Document
javadoc -d doc MyClass.javaEnable Preview
- コンパイル
javac --release 21 --enable-preview Demo.java- 実行
java --enable-preview Demojar
*.classをjarにビルド
jar cf <jar-file> <input-file(s)>JARファイルの検証
jar tf myproject.jarjps & jstack
- 手順 :デッドロックの確認
- PIDを見 つける
jps- Thread Dumpを取得
jstack <PID> > thread_dump.txtTopics
Why is Java slow?
- Dynamic Linking: リンクはプログラムが実行 されるたびに実行時 に行 われる
- Run-time Interpreter: バイトコードからネイティブマシンコードへの変換 は実行時 に発生
Objects.requireNonNull
- フェイルファストのnullチェック
- 引数 がnullの場合 NullPointerExceptionをスロー
- パラメータ検証 に使用