😺

あえて今Java Silverを勉強してみた

2023/03/02に公開

2023.07.14
3月に落ちて、リテイク無料キャンペーン使ってギリギリ合格しました。
受験で見かけた系問題のメモ
やっぱり追加機能系は多めなんだなと思った。とりあえず以下は割と暗記でなんとかなるし、押さえるべきなんだろうな。
・モジュール化JDKの特徴
・モジュールの依存性の確認方法
・モジュールグラフ選択問題
・モジュール化の特徴
・モジュール化したコードの実行コマンドを問う問題
・module-info.javaについて問う問題
・Javaの開発環境について問う問題


Bronzeに続いて。知らなかったことメモ
というよりは抜けては覚えての繰り返しになってきたかもしれない。
Bronzeのときの勉強メモと被りもあるかも。

  1. Java11からjavaコマンドでHoge.javaといったソースファイルも実行可能になった(メモリ展開されて実行できる)簡易的なものであればスクリプト的に使えるので素敵…。あと拡張子が変わってても--sourceでソースファイルとして読み込ませることが可能になった。
  2. Java7から整数リテラルにアンダースコアを混ぜられるようになった。ただし先頭末尾と記号の前後はNG
  3. Java10からのvarは型推論のため初期化が必須。NULLはNG
  4. アンダースコアで桁数の多い数値を区切ることができる(JavaSE7以降)
int i = 111_111;
long l = 1139_232132_321L;

2進数とかでは見たことあったけど、2進数専用のものでは特にないらしい。アンダースコアは先頭と末尾、記号の前後には書けない。

  1. charで数字を入れると、文字に変換してもらえる。(0~65535)
    char c = '\u39A2';
    みたいな書き方は知っていたのにこっちは知らなかった
  2. varは型推論ができる。推論であるためにnullを入れたり、初期化を行わないとエラーになる。ダイヤモンド演算子が使用された場合は、<Object>と見なす。ローカル変数にしか使えず、型推論が使えないメソッドの引数には使用されることがない。
  3. String.sbstringは先頭から1文字ずつ区切るイメージで覚えるとしっくりくる
"abcde".substring(2,4); // cd 
|0|a|1|b|2|c|3|d|4|e|5|
  1. String.replaceは全部を置き換える。(1回だけだと思っていた)
  2. String a = nullは"null"として連結させることが可能
  3. StringBuilderのキャパシティーは初期化時の文字数+16
  4. 別のStringでもコンスタントプールに入った場合は同一インスタンスとして解釈される
  5. if(false) はコンパイルも実行もエラーにはならない(whileは駄目だった記憶がある)
  6. if-else ifを書く場合、else ifの間に開業を入れてしまうと別々に解釈されてしまう。
  7. switchの条件には変数NG、小数点を含む型NG、intより大きな型、booleanを使用できない
  8. java8からインターフェースにdefalt修飾子を使ってデフォルト処理を定義できるようになった。これを使用すると、abstractでの定義が不要になる。このメソッドはOverrideで処理の変更ができます。
	default int methodA(int a, int b){ // 暗黙でpublicになります。
	  return a*b;
	}
  1. インターフェースの中小メソッドは公開することが目的であるため暗黙publicとなる
  2. サブクラスのコンストラクタは自動でsuper()が実行される
  3. Predicate…Boolを返す関数型
  4. ラムダ式で処理が1個なら括弧いらないけど、returnが書けなくなる
  5. Math.pow...累乗
  6. Math.sqrt...平方根
  7. (あべこべになりがち) compareTo(arg1, arg2)でarg2が小さい時は-1になる
  8. ArrayList.addは2つ引数を指定すると追加位置を調整できる
  9. LocalDateはスレッドセーフで変更不可。カレンダーより使いやすく1月は1として始まる。
  10. RuntimeException(非検査例外)はthrowsを省略できる
  11. エラー=回復不能なもの
  12. try-with-resource構文の場合、「リソースを解放してから」例外処理をおこない、finally処理を行う。
  13. 浮動小数点のデフォルト型はdouble
  14. 共変戻り値…オーバーライドの時の戻り値はサブクラスやサブインターフェースでもOK
  15. catchはサブクラスから先に書かないとコンパイルエラーになる。
  16. 無名配列({1,3}とか)で初期化するときは要素数を書けない。
  17. char型は-128 ~ 128の値まで(1byteだから)
  18. JDKをモジュール化するとアプリとJDKのリンクが簡単で、JRE込みで作るとJavaの入っていない環境でも使えるし、必要なものだけを引き込んで追加することができるのでセキュリティが高まる。
  19. コンパイルの仕方
javac -d {dirName} {srcFile.java}
java -cp {classPathDir} {Class}

コマンドを意識したことって無かった感。IDEに頼りきりなのがよくわかる。
35. 依存関係の調べ方

jdeps --list-deps # クラスの依存関係
java --show-module-resolution # モジュールの依存関係
  1. jmodでモジュールを作成できる
  2. モジュール間で相互に依存した場合はコンパイルエラーになる。
  3. モジュールのプログラム実行
# やりたい
java --module-path {ModuleRootDir} -m {ModuleName}/{ClassName}
  1. 配列はObjectのサブクラス

  1. javaの主なパッケージ
  • lang・・・基本動作
  • io・・・入出力関連
  • util・・・複数のオブジェクトを1つにまとめて管理するクラス(ListやMapとか・・・)国際化、日付操作などのユーティリティの提供
  • text・・・文字列、日付、数値など書式や構文解析を行う
    →textパッケージはあんまり使っていないような気がする
    →よく使うのどんなクラスか見てみよう
  1. langパッケージはimportいらず
    →Stringとかいらないのわかってるけど、全部がそうなのは知らなかった
  2. varは結構制約のある型で、メソッドなどの引数としては利用できないし、フィールド指定もできない。ローカル変数のみcatchでも使えないのでぱっと見癖を感じるかも。
  3. 多次元配列も作れる・・・Cで習ったことある気がするけど普段全然使わないから忘れていた・・・。一体これって何次元まで配列作れるのだろう。
  4. 論理演算子の^はあまり仕事で使うのを見ない気がする。便利そうなんだけど、可読性が故か?
    ^・・・A!=Bと同じ意味になる。オブジェクトとして比較が走りそうな雰囲気
  5. TODO:String.internはなにか
  6. String.indexOfは指定文字目以降の一致という形でも処理が可能
String lyrics = "ロールパンナはメロンパンナのお姉ちゃん";
System.out.print.ln(lyrics.indexOf("パン")); // 3
System.out.print.ln(lyrics.indexOf("パン"), 10); // 11
  1. StringBuilderはappend以外にもdeleteやinsertなどの機能がある
  2. 基本データ型とラッパーの変換は自動だけど、Boxingでは暗黙的な動作しない
    →そもそもBoxingってなんだ
  3. staticメンバであればNULLの時でも呼び出しが可能
  4. Stringが参照型と言われる理由。Stringの中にchar[]がいて、それを使って中のデータを返している。Stringの中を初めてちゃんと読もうとしました。プログラミングの本当の入り口がCLIでのC言語だったので、IDE凄いなあと改めて思った。
    13.varで配列を宣言したいとき、通常の配列のような書き方はできない
var a = {1,2,3}; // エラー
var b = new int[]{1,2,3}; // OK
var c = new int[3]; // OK [0,0,0]
  1. 変数名に_$は使える

繰り返し間違えてた箇所のチェック

  1. 例外種別

    1. 非検査例外(RuntimeExceptionがスーパークラスとなるもの)
      正しくプログラムされていないと起きるもの(NullPointerとか)
      コンパイルエラーにはならない
    2. 検査例外(Exception...上記除く)
      …FileNotFoundExceptionとか
      コンパイルエラーになる
    3. エラー(OOMとか)
      …もはやコントロールできないもの
      コンパイルエラーにならない
  2. Protectedとアクセス修飾子なしの違い 何故か混同していた

  • Protected…書かれているクラスと、そのサブクラスからアクセスが可能
  • アクセス修飾子なし…同一パッケージのみアクセスが可能
  1. コンストラクタチェイン
    サブクラスのコンストラクタでは、最初に親クラスの引数なしコンストラクタが呼出される

  2. ローカル変数は初期化していないとエラーになるが、フィールドは明示的に初期化しなくてもデフォルト値を適用してくれる。

最終更新 7.15

Discussion