資格

【直前】JavaSilver黒本で暗記する一夜漬けチートシート

  • このエントリーをはてなブックマークに追加
  • LINEで送る

Java Silver試験が迫っており、最後の一週間しか時間がない!
そんなあなた。
試験合格に向けて、Java Silver黒本で覚えるべき重要なポイントをしっかり押さえましょう。
試験に出題されやすく忘れやすいトピックを中心に、暗記用チートシートを用意しました。
(まだ未完成ですが、役に立つ箇所もあるはず。という思いで公開しています)

『JavaSilverの受験直前で効率よく勉強するには?』

こんな疑問に答えます。

引っ掛かりやすいところ

初期化しないとコンパイルエラーになるケース

  • ローカル変数の初期化
  • finalのインスタンス変数の初期化
  • finalのクラス変数(static)の初期化

初期化しなくてOK(デフォルト値が代入)のケース

  • クラス変数(nullで初期化)
  • インスタンス変数(nullで初期化)
  • 配列(宣言した型のデフォルト値で初期化)

デフォルト値の例

  • 整数(int/short/byte/long:0
  • 浮動小数点数(float/double): 0.0
  • 文字(char) :\u0000
  • 真偽(boolean):false
  • 参照型(String/配列/クラス):null

NullPointerExceptionにならないケース

  • printlnメソッドにnullを渡したとき
    System.out.println(null); ”null”と表示される

NullPointerExceptionになるケース

  • switch文でnullを評価したとき
    条件はハッシュコードなのでnullを渡すとNullPointerExceptionとなる

  • 値がnullの参照型変数(クラス変数など)内のフィールドやメソッドを参照したとき

スコープ

スコープは変数やメソッドがどこからアクセス可能かを示すもので、コードを理解するための重要

  • フィールド変数とメソッドの引数が同じ名前の場合
    インスタンス変数にアクセスする際にはthisを付ける
  • スコープを省略した場合
    同一パッケージ内からのみアクセス可能
  • ラムダ式内の場合
    宣言したメソッドのローカル変数へアクセス可能
    ただし、メソッド内でローカル変数の値変更はNG(実質的にfinalでないとダメってこと)


スポンサーリンク

演算子

  • インクリメント演算子
    後置インクリメント:代入後に増加する
    // bの値はインクリメント前の5
    int a = 5;
    int b = a++;
    

    前置インクリメント:代入前に増加する
    // bの値はインクリメント後の6
    int x = 5;
    int y = ++x;
    

基本データ型と文字列の操作

プリミティブデータ型と演算子

  • 変数のプリミティブデータ型同士の型変換に注意が必要。広い方から狭い方への型変換はキャストが必要
  • リテラルのプリミティブ型の演算は大きい方にキャストされる(int+LongならLong+Longとなる)

String型

  • Stringはイミュータブル(変更不可)。新しい文字列を作成すると、元の文字列は変更されず、新しい文字列が作成される
  • String型は参照型だがプリミティブ型のように代入できる
    例)下記は両方ともsにabcが代入される
    String s = "abc";
    String s = new String("abc")

メソッド

  • int length()
    文字列の長さを返却
  • boolean equals(Object anObject)
    同じ文字列ならtrue、そうでないならfalseを返す
  • String substring(int beginIndex, int endIndex)
    beginIndexからendIndexまでの部分文字列を返却
    例)”abcde”の”bc”を取得するにはbeginIndexに1、endIndexに3を指定
    要素で挟むイメージ
  • String replace(char old, char new)
    old置換対象の文字(列)をnew:置換後の文字(列)に変換する
    
    public class ReplaceExample {
        public static void main(String[] args) {
            String originalString = "Hello, world!";
            
            // 文字列内の一部を置換
            String replacedString = originalString.replace("world", "Java");
            System.out.println("Replaced String: " + replacedString);
            
            // 文字を置換
            replacedString = originalString.replace('o', 'X');
            System.out.println("Replaced String: " + replacedString);
        }
    }
    
    Replaced String: Hello, Java!
    Replaced String: HellX, wXrld!
    
    String replace(CharSequence old, CharSequence new)もある

var(型推論)

  • ローカル変数のみ使用可能(フィールド変数はNG)
  • varに代入するジェネリクスの型を省略するとオブジェクト型になる


スポンサーリンク

配列の操作

インデックスの範囲指定

  • 配列や文字列などのインデックスは0から始まります。指定範囲は0からカウント
    簡単だがボーっとしてたら引っ掛け問題があるので注意。過信は禁物。

配列

  • 配列は参照型なので、インスタンスの生成が必要
    int[] numbers = new int[5];
    // numbers[0] から numbers[4] までの要素が0で初期化される
  • 基本は初期化子{}は変数宣言と同時でないと使えない
    明示的に配列数を指定すれば、あとから初期化子も使える
    // 初期子で宣言と同時に初期化
    int[] numbers = {1, 2, 3, 4, 5}; 
    // 配列の宣言
    int[] numbers;
    
    // 宣言後に初期化子を使用して初期化
    numbers = new int[]{10, 20, 30, 40, 50};
    

    インスタンスとメソッド

    コンストラクタ

    • 戻り値の型がないメソッド(クラス名と同名)
    • コンストラクタチェイン
      サブクラスのコンストラクタにはスーパークラスのコンストラクタを呼び出しsuper()が暗黙的に追加される
      明示的に追加してもOK
      class SuperClass {
          public SuperClass() {
              System.out.println("SuperClassのデフォルトコンストラクタ");
          }
      }
      
      class SubClass extends SuperClass {
          public SubClass() {
              // 暗黙的に super() が追加されて、スーパークラスのデフォルトコンストラクタが呼び出される
              System.out.println("SubClassのデフォルトコンストラクタ");
          }
      }
    • 初期化子

      全てのコンストラクタで共通する前処理を実行するために記述。コンストラクタが実行される前に実行される

      Class Sample{
        int a;
        String b;
        {
          a = 3;  //コンストラクタが実行される前に実行
          b = 4;
        }
        Sample(){ }
      }
              

    スタティック

    staticなメソッドやフィールドはクラス自体に関連づけられ、インスタンス化されたオブジェクトとは独立する(コンパイル時にメモリ割り当てされる)

    • staticなフィールド変数(クラス変数)はインスタンス間で共有される
    • staticなメソッドからインスタンス化されたメソッドを呼べない
    • static初期化子

      staticなクラスはstatic初期化子で初期化処理を実施(インスタンス化されれないのでコンストラクタがない)

      Class Sample{
        static int a;
        String b = "test";
        static{
          a = 3;  //クラスのロード時に実行
        }
      }
      

    クラスの継承、インタフェース、抽象クラス

    オーバーライド

    同じメソッド名で下記の条件を満たすこと

    • オーバーライドするメソッドのシグネチャ(メソッド名、引数の型と個数)は親クラスと一致させる
    • オーバーライドするメソッドの戻り値の型は、同じクラスかサブクラス(共変戻り値)
    • オーバーライドするメソッドのアクセス修飾子は親クラスのメソッドよりも緩いスコープでオーバーライド
    • オーバーライドするメソッドは例外をスローする場合、同じクラスかサブクラスで例外をスロー

    オーバーロード

    同じメソッド名で下記の条件を満たすこと

    • シグニチャ異なる(戻り値は関係ない)

    インターフェース

    • 抽象メソッドを持つ
    • デフォルトメソッドを使うと実装できる
      interface MyInterface {
          void abstractMethod(); // 抽象メソッド
      
          default void defaultMethod() {
              // デフォルトメソッド
              System.out.println("これはデフォルトメソッドです。");
          }
      }
      
      class MyClass implements MyInterface {
          @Override
          public void abstractMethod() {
              System.out.println("抽象メソッドの実装");
          }
      }
      
      public class Main {
          public static void main(String[] args) {
              MyClass obj = new MyClass();
              obj.abstractMethod(); // MyClassで実装された抽象メソッド
              obj.defaultMethod();  // インタフェースのデフォルトメソッド
          }
      }
      

    抽象クラス

    • 抽象クラスは抽象メソッドだけでなく、具体的なメソッドも含むことができる

    関数型インタフェース、ラムダ式

    ラムダ式

    抽象メソッドを1つだけ持つインタフェースはラムダ式が使用できる。

    ラムダ式の基本構文

    • パラメータなし
       () -> { 処理内容 }
    • パラメータあり
      (パラメータ) -> { 処理内容 } 
      (int パラメータ) -> { 処理内容 } 
    • ()を省略:パラメータが1つの場合のみOK
      パラメータ->{処理内容 }
    • {} を省略:処理内容が1文の場合のみOK
      (パラメータ) -> 単一の式
      ※戻り値がある場合もOKだが、returnは記入できない
    • 戻り値あり
      (パラメータ) -> { return 戻り値; }
    • メソッド参照(staticメソッド)
      クラス名::メソッド名
    • メソッド参照(Instanceメソッド)
      インスタンス名::メソッド名

    ラムダ式の例

    Calculatorという簡単な関数型インターフェースを作成し、ラムダ式を使用してcalculateメソッドを実装
    ラムダ式は(a, b) -> a + bで、2つの整数を受け取り、それらを足し合わせる処理

    //例1: ラムダ式を使用して、2つの数値を足し合わせる
    // インターフェース
    interface Calculator {
        int calculate(int a, int b);
    }
    
    public class LambdaExample {
        public static void main(String[] args) {
            // ラムダ式を使用してCalculatorインターフェースのcalculateメソッドを実装
            Calculator addition = (a, b) -> a + b;
            
            int result = addition.calculate(5, 3);
            System.out.println("5 + 3 = " + result);
        }
    }

    関数型インターフェース

     java.util.functionパッケージに所属する関数型インターフェース
    関数型インタフェースは抽象メソッドを1だけ持つ

    • Consumer<T>:accept抽象メソッド
      – 消費者。引数を受け取るが、結果は返さない。
    • Supplier<T>:get抽象メソッド
      – 供給者。引数は無く、結果を1つ返す。
    • Predicate<T>:test抽象メソッド
      – 断定。引数を受け取り、真偽値を返す。
    • Function<T, R>:apply抽象メソッド
      – 関数。引数を受け取って結果を返す。

    後述するAPIのComparatorインタフェースもcompare抽象メソッドを持つ関数型インターフェース

    API

    Iterableインタフェース

    Iterable
    └継承:Collection
     └─継承:List-実装:ArrayList
     └─継承:Setー実装:HashSet、TreeSet
     └─継承:Mapー実装:HashMap、TreeMap

    メソッド

    • default void forEach(Consumer<? super T> action)
      要素数だけConsumer.acceptメソッドを実行

    Collectionインタフェース

    親クラス:Iterable

    メソッド

    • add(E e)メソッド
    • clear()メソッド:
    • default boolean removeIf(Predicate<? super E> filter)
      指定された述語を満たすこのコレクションの要素をすべて削除

    Listインタフェース

    親クラス:Collection
    実装クラス:ArrayList

    要素の順番を持つ
    重複要素OK
    要素数の増減OK

    Setインタフェース

    重複要素NG
    挿入順を持つ

    親クラス:Collection
    実装クラス:HashSet、TreeSet

    Mapインタフェース

    親クラス:Collection
    実装クラス:HashMap、TreeMap
    キーと値が対となった要素を持つ
    キーの重複はNG

    メソッド

    • keyset()メソッド
    • values()メソッド
    • put(K key,V value)
      指定された値と指定されたキーをこのマップで関連付けます(オプションの操作)。
      マップにすでにこのキーに対するマッピングがある場合、古い値は指定された値に置き換えられます。

    TreeMapとHashMapの違い(これは試験にでないかも)

    • HashMapではキーの順番を保証しない
    • TreeMapではキーを自動的にソートし、順序を保証します。
    • HashMapはnullはOK
    • TreeMapはnullがNG
    • 両方ともキーの重複を許さない
    • 両方とも利用できるメソッドは共通
    •  TreeMapでは、引数にComparatorを渡すことで、ソート規則を変更できる

    ArrayListクラス

    ざっくりいうと動的配列を実現するクラス

    • Listインタフェースの実装
    • スレッドセーフではない
      要素数だけfor文を回し、内部でadd or removeメソッドを使うと途中で要素数が変動して実行時例外が発生
    • of(E e)メソッド
      staticメソッドなのでList.of(“a”,”b”,”c”)のように直接呼び出せる
      immutable(変更不可)なので、add、remove、clear、sort等のメソッドを実行するとUnsupportedOperationException
    • set(int index, E e)メソッド

    Arraysクラス

    メソッド

    • public static <T> List<T> asList(T… a)
      指定された配列に連動する固定サイズのリストを返す
      例)
      List<String> stooges = Arrays.asList(“xxx”, “yyy”, “aaa”);
      型パラメータ:T – 配列内のオブジェクトのクラス
      パラメータ:a – リストの基となる配列
      固定長リストなので戻り値のListにaddメソッドなどを実行するとUnsupportedOperationException
    • public static int mismatch​(配列1, 配列2)
      2つの配列間の最初の不一致のインデックスを見つけて返す。
      一致した場合は -1を返します。
    • public static int compare​(配列1, 配列2)
      2つの配列を辞書順に比較します。
      配列1と配列2を比較し、配列1が小さいなら負の整数を返す
      配列1と配列2を比較し、両者が等しいなら0を返す
      配列1と配列2を比較し、配列1が大きいなら正の整数を返す
      他クラスのcompareメソッドも同じような仕様

    Comparatorインタフェース

    リストなどのコレクション内の要素をソートする際に使う関数型インターフェース
    抽象メソッドはcompareメソッドのみのため、ラムダ式が適用できる。

    compareメソッドの仕様
    ・1つ目の引数と2つ目の引数を比較し、1つ目が小さいなら負の整数を返す
    ・1つ目の引数と2つ目の引数を比較し、両者が等しいなら0を返す
    ・1つ目の引数と2つ目の引数を比較し、1つ目が大きいなら正の整数を返す

    compareメソッドをオーバライドして自作の比較結果を作ることができるのがミソ
    例えば、オーバライドしたcompareメソッドで戻り値に符号を反転させることもできる。
    その後に、ListインタフェースのsortメソッドはComparaterなので自作compareで降順にできる。

    compareToメソッドが絡むとややこしいので例をあげる

    Integer a = 12;
    Integer b = 15;
    
    // a(12) と b(15) の比較(12より15が大きいのでマイナスを返す)
    a.compareTo(b)

    Mathクラス

    • Math.pow(2,3) :2の3乗
    • Math.sqrt:平方根

    LocalDateクラス

    LocalDateクラスとCallenderクラスの違い

    • Callenderは月が0始まりだが、LocalDateは1始まり
    • Callenderはmutable(可変)だが、LocalDateはimutable(不変)
    • LocalDateは日付を操作する便利なメソッドが追加された

    LocalDateクラスのメソッド

    • ofメソッド:日付を指定してインスタンスを生成
    • nowメソッド:現在日付でインスタンスを生成
    • parseメソッド:文字列の日付をLocalDateクラスに変換
    • withメソッド:日付の変更

    例外処理

    • 例外は検査例外(Exceptionを直接継承する例外)と非検査例外(ErrorおよびRuntimeExceptionを直接継承する例外)に分類。
    • 非検査例外はtry-catchまたはthrows句が必要ない。
    • RuntimeExceptionはExceptionのサブクラスだが非検査例外。
    • try-with-resources構文を使用してリソースを自動的に閉じれる。

      モジュールシステム

      複数のパッケージを1つにまとめ、公開するパッケージと非公開にするパッケージを分けて管理できる
      目的はパッケージ単位の情報隠蔽。

      モジュール実行の流れ

      1. モジュール用のディレクトリ作成
      2. モジュール用のディレクトリにmodule-info.javaを作成
      3. module-info.javaとソースファイルをコンパイル
      4. 実行したいモジュールの実行

      module-info.java

      記述できること

      • どのパッケージを公開するのか(exports)
      • ほかのどのモジュールを使うのか(requires)

      基本の流れ

      module-info.javaとソースファイルをコンパイルしてモジュール化する

      • コンパイルの構文
        javac△-d△クラス出力先△コンパイルするmodule-info.java のパス△コンパイルするファイルパス
        module-info.javaもコンパイルされてClassファイルができる
      • コンパイル例と実行後の構成
        コンパイル例
        javac -d mods/unko src/unko/module-info.java src/unko/com/sample/Main.java
        コンパイル実行後の構成
        ├─mods
        │ └─unko
        │          │    module-info.class
        │          │
        │          └─com
        │           └─sample
        │                              Main.class

        └─src
                 └─unko
                         │    module-info.java
                         │
                         └─com
                                 └─sample
                                                   Main.java

      モジュールの実行

      • モジュール実行の構文
        java△–module-path△モジュールのルートディレクトリ△-m△実行クラス
      • モジュール実行例(モジュールと完全修飾クラスの間はスラッシュで区切る)
        java –module-path mods -m unko/com.sample.Main
        Hello

      モジュールの公開と利用する流れ

      モジュールとディレクトリ構成

      ├─mods
      │     ├─boo
      │     └─unko

      └─src
            ├─boo
            │     │   module-info.java
            │     │
            │     └─com
            │             └─test
            │                         A.java
            └─unko
                  │    module-info.java
                  │
                  └─com
                        └─sample
                                           Main.java

      module unko {
        requires boo;  //booモジュールを利用する
      }
      module boo {
        exports com.test;  //testパッケージを公開する
      }

      module-info.javaとソースファイルをコンパイルしてモジュール化する

      booのコンパイル
      javac -d mods\boo src\boo\module-info.java src\boo\com\test\A.java
      A.javaは”This is class A.”をprintlnで表示

      unkoのコンパイル
      javac –module-path mods -d mods\unko src\unko\module-info.java src\unko\com\sample\Main.java
      ※–module-path をルートに指定する
      Main.javaは”Hello”をprintlnで表示して、Aを呼び出し

      モジュールの実行
      java –module-path mods -m unko/com.sample.Main
      Hello
      This is class A.

      その他

      • 利用モジュールを伝搬:a1がa3モジュールを利用できる(transitive)
        module a1{
            requires transitive a3
        }
      • モジュールの説明表示
        java –module-path mods –describe-module boo
        boo file://mods/boo/
        requires java.base mandated
        contains com.test
      • JMODファイル形式のモジュールファイル(jmod)
        作成
        jmod create –class-path mods/boo boo.jmod
        説明の表示
        jmod describe boo.jmod
      • 依存関係を調査(jdeps)
        jdeps –list-deps unko.jar
      • 依存モジュールのサーチ内容(–show-module-resolution)
        java –module-path mods –show-module-resolution -m unko/com.sample.Main
      • 非公開パッケージを1時的に利用するコンパイル(–add-exports)
        javac –module-path mods –add-exports boo/com.test=unko -d mods\unko src\unko\module-info.java src\unko\com\sample\Main.java

      最後に…

      いかがでしたでしょうか。

      JavaSilverの受験直前で効率よく勉強するために、引っ掛かりやすいところや出題されそうなところを重点的にまとめました。

      これらのポイントをしっかり覚え、試験に自信を持って挑みましょう。
      最後の一週間を有効に活用すれば、合格への道は開かれています。頑張ってください!


      JavaSilverSE11は何問で合格?時間配分と持ち物など

      黒本の解説だけで合格?JavaSilver攻略のコツと勉強方法!

      SEおっさん
      SEおっさん
      ここまで読んでくれてありがとう!

      「記事を読んでもわからないトコがある」「内容が変だよ」
      という時は、お気軽にコメントください♪

      「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
      という時は、ココナラまで。メッセージもお気軽に♪


      LINEでのお問合わせも受付中!
      LINE公式アカウント

      メッセージをお待ちしています!



      スポンサーリンク
      • このエントリーをはてなブックマークに追加
      • LINEで送る

      コメントを残す

      *