Java力をあげるための指針

また「プロになるJava」の宣伝か、と思われるので、今回は「プロになるJava」の宣伝は自粛します。
Java力をあげるためには最適な「プロになるJava」がオススメなんですが、そうするとこのエントリもこのあたりで終わってしまうので、今回は自重します。

ということで、よく「Java力をあげるにはどうしたらいいか」という質問をみかけます。どうしましょうね、という話。
ここで、「Java力をあげたい」と言ってるときの大半はプログラミング力をあげたいという話です。
もちろん「プロになるJava」もプログラミング力をあげるのにとても役に立つのですが、今回は「プロになるJava」以外で攻めてみましょう。

そうすると実のところJavaにこだわる必要がなくて、そして最近はPythonで無償のテキストがたくさん手に入るので、そういうのを見るといいんではないかと思います。
たとえば「Think Python: How to Think Like a Computer Scientist」の日本語訳「Think Python:コンピュータサイエンティストのように考えてみよう」が公開されています。
https://cauldron.sakura.ne.jp/thinkpython/thinkpython/ThinkPython.pdf

売ってる書籍だと「独学プログラマー」とか。面接対策みたいな話まであっておもしろいです。

あとは手を動かすんですが、LeetCodeやりましょう。
https://leetcode.com/
easyをたくさんやるのがいいです。英語が苦手であれば、問題をみるとExampleとして入出力例があるので、そこから何をやるか想像できるものをやりましょう。想像できなければ飛ばして別の問題を見ます。

と、Java力をあげたいといいつつ実はプログラミング力をあげたいという想定で話を進めましたが、ほんとにJava力をあげたいという場合もあると思います。
文法については何か本を一冊読みましょう。 「プロになるJava」がオススメなんですが、今回は禁じ手なので別の本・・・まあなにか読んでください。

文法はわかったとして、見るといいと思うのは標準APIJavadocです。
java.langパッケージとjava.utilパッケージにあるものは一通り見て、用途がぜんぜんわからないものは無視するとして、なんとなくわかるものは全部確認しておきましょう。
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/package-summary.html
https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/package-summary.html

文法とAPIがひととおりわかったら、バイトコードもちょっとは知っておくといいです。簡単なコンパイラを作りましょう。コンパイラというと腰が引けるかもしれませんが、「数字単体か足し算だけ」とすればそこまで難しくないと思います。
数字だけ出力するものはここにあるので、ここに足し算の処理を付け加えてみましょう。
https://nowokay.hatenablog.com/entry/20080609/1213025229

これで言語とAPIバイトコードがわかったので、あとはJVMのふるまいです。
JVMのふるまいは、JITコンパイラGCがわかればとりあえずいいと思うので、これらが何をしているかくらいは勉強するといいと思います。
ただ、このあたりに関して手頃な資料がすぐには思い浮かばなかったので、探してそのうち追記します。

追記: 「Javaパフォーマンス」がよさそう。スレッドの話も載っているし