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

ModifierClassPackageSubclass (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を閉じる

  1. try-with-resource
  2. 最終(さいしゅう) ラッパーの高階(こうかい) ストリームのみ() じる

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

Java Time API

LocalDateTime

  • ISO-8601 タイムゾーンなしの日付(ひづけ) 時刻(じこく)
  • Immutable
日付(ひづけ)記述(きじゅつ)(てき) している:(たと) えば誕生(たんじょう) ()()() りなど。ただし、オフセット/タイムゾーンなどの追加(ついか) 情報(じょうほう) がなければ、時間(じかん) はタイムライン(じょう)特定(とくてい)瞬間(しゅんかん)(あらわ) すことができない。

2023-08-01T12:30:15Z[UTC]

  1. T : 完全(かんぜん)日時(にちじ)
  2. Z : UTC +0、グリニッジ標準(ひょうじゅん) ()

CLI

Document

javadoc -d doc MyClass.java

Enable Preview

  • コンパイル
javac --release 21 --enable-preview Demo.java
  • 実行(じっこう)
java --enable-preview Demo

jar

  • *.classをjarにビルド
jar cf <jar-file> <input-file(s)>

JARファイルの検証

jar tf myproject.jar

jps & jstack

  • 手順(てじゅん) :デッドロックの確認(かくにん)
  • PIDを() つける
jps
  • Thread Dumpを取得(しゅとく)
jstack <PID> > thread_dump.txt

Topics

Why is Java slow?

  • Dynamic Linking: リンクはプログラムが実行(じっこう) されるたびに実行時(じっこうじ)(おこな) われる
  • Run-time Interpreter: バイトコードからネイティブマシンコードへの変換(へんかん)実行時(じっこうじ)発生(はっせい)

Objects.requireNonNull

  • フェイルファストのnullチェック
  • 引数(ひきすう) がnullの場合(ばあい) NullPointerExceptionをスロー
  • パラメータ検証(けんしょう)使用(しよう)