Java勉強しよう

##全体像
https://www.guru99.com/java-tutorial.html
偶然見つけ、読んでみたらめっちゃわかりやすかったので勝手に紹介[^1]。

[^1]: java教えて！って言われたらURLを投げるため作った

インストール作業だけスキップしつつ、普段からSpring系のシステム保守やってる
自分の場合でだいたい10時間くらいかかる講義量。
英語を翻訳かけずにすらすら読める人なら、もっと早く終わるかも。

###まずはここから
https://www.guru99.com/java-platform.html

以下の２つは環境構築のため、飛ばしてもよい
「Guide to Download & Install Java」
「How to Download & Install Java in Linux(Ubuntu)」

以下の５つは、気になったら見る程度でよい
「Groovy Script Tutorial for Beginners」
「C++ Vs JAVA: What’s the Difference?」
「Java vs C# - 10 Key Differences between Java and C#」
「Java vs Scala: What is the Difference?」
「JAVA Programming Tutorial for Beginners PDF」

###環境構築を飛ばす場合
自分のPCが容量ぎりぎりだったりとかするならオンラインで済ませよう。[^2]
https://www.mycompiler.io/new/java

[^2]: 低価格PCのeMMCの容量不足で悩まされてたり、そもそもPCは設定方法一切わからん！ってレベルの人が多くて、ここで詰まる人ほんま多い

ここ使うなら、サンプルコードのクラス名をMainに直そう。
そうじゃないと動かないので注意。

```java:この場合は
class Demo {
 public static void main(String args[]){
     System.out.println("Hello World");
 }
}
```
↓↓↓

```java:こうする
// DemoからMainに変更
class Main {
 public static void main(String args[]){
     System.out.println("Hello World");
 }
}
```

##なぜこのサイト
バリバリ英語のサイトだけどそんなに難しい構文もないし
今後開発をやっていくには英文に慣れる必要があるので、むしろちょうど良い。
もちろんgoogle翻訳もバシバシ使おう。

めっちゃ良い記事だらけなのに、時折コードのインデント崩れてたり
画像の編集が雑かったりするのが笑いを誘うｗ[^3]

[^3]: ペイントで頑張った感満載である

特に気に入ったのは、講義の順番。
そもそもプログラムってPCでどう動くの？
いろんな言語あるけど、なんでJava？などなど
順を追って徐々に疑問解決していくので、理解しやすい。

「その時点で必要な事だけを伝える」というのが徹底されていると思う。

ここでは、ifとかforといった基本文法の説明はなくて、しれっとサンプルコードの中に登場してるだけ。
サンプルコードを動かしてみて、結果から動きを学んでねって感じかな？

##気になった記事
以降は個人的にためになったものや気になったもの
###Static variable
https://www.guru99.com/java-static-variable-methods.html

staticはクラス生成時に一回生成されるもの。
インスタンス化しなくても初期化されてる。

###Stack & Heap
https://www.guru99.com/java-stack-heap.html

Heap…オブジェクト
Stack…メソッド、ローカル変数、参照変数
Code...バイトコード(プログラム)
Static...静的データ、静的メソッド

###Java switch Statement
https://www.guru99.com/switch-java.html

反復が多い場合、if~elseのネストよりは高速に処理できるという結果が出てるらしい。

###Multithreading in Java
https://www.guru99.com/multithreading-java.html
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html

スレッドは個別のメモリ領域を割り当てない。
ただしスレッドは独立してるので、例外が起きても他に影響はない。

唯一わからないのが以下の挙動
setPriorityしてるのに、得られる結果は5だという。
guru99にもoracleにもそんな動きするとは書いてないけど
検証結果から察するに、TERMINATED状態になったスレッドへのsetPriority()は何を設定しても無視されるのかな。

```java:サンプルコード
public class Main implements Runnable {
    @Override
    public void run() {
    }
    public static void main(String[] args) {
        Thread guruthread1 = new Thread();
        guruthread1.start();
        try {
            guruthread1.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        guruthread1.setPriority(1);
        int gurupriority = guruthread1.getPriority();
        System.out.println(gurupriority);
        System.out.println("Thread Running");
  }
}
```

```txt:出力
5
Thread Running
```

```java:試験用
public class Main implements Runnable {
    @Override
    public void run() {
    }
    public static void main(String[] args) {
        // CHECK DEFAULT PRIORITY
        System.out.println("MIN:" + Thread.MIN_PRIORITY);
        System.out.println("NORMAL:" + Thread.NORM_PRIORITY);
        System.out.println("MAX:" + Thread.MAX_PRIORITY);
        
        Thread guruthread1 = new Thread();

        System.out.println("STATE/PRIORITY:" + guruthread1.getState() + "/" + guruthread1.getPriority());
        guruthread1.setPriority(1);
        System.out.println("STATE/PRIORITY:" + guruthread1.getState() + "/" + guruthread1.getPriority());
        
        guruthread1.start();
        
        try {
            guruthread1.setPriority(2);
            System.out.println("STATE/PRIORITY:" + guruthread1.getState() + "/" + guruthread1.getPriority());

            guruthread1.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        guruthread1.setPriority(3);
        System.out.println("STATE/PRIORITY:" + guruthread1.getState() + "/" + guruthread1.getPriority());

        System.out.println("Thread Running");
  }
}
```

```txt:出力
MIN:1
NORMAL:5
MAX:10
STATE/PRIORITY:NEW/5
STATE/PRIORITY:NEW/1
STATE/PRIORITY:RUNNABLE/2
STATE/PRIORITY:TERMINATED/2
Thread Running

```

###Convert JSON to XML using Gson and JAXB: JAVA Example
https://www.guru99.com/json-to-xml-gson-jaxb.html

ほー、こんなライブラリあったんや。
https://github.com/google/gson


###How to Reverse a String in Java using Recursion
https://www.guru99.com/java-program-reverse-string.html

うおお、javaのStringって標準でreverse()持ってないのか・・・。
サンプルでは再帰使ってるけど、普通はforの逆方向で回すんじゃないかなぁ。

```java
String myStr = "Guru99";
String reverseStr = "";

for(int i = myStr.length() - 1; i > -1; i--){
	reverseStr += myStr.charAt(i);
}

System.out.println("The reversed string is: " + reverseStr);

```

でもこれ、-1が気持ち悪いので配列からCollections.reverse()使おうとか
思って書いてたらjavaだとすげぇ大変だった。

最適解はこれだろうなぁ。

```java
String myStr = "Guru99";

StringBuffer sb = new StringBuffer(myStr);
String reverseStr = sb.reverse().toString();

System.out.println("The reversed string is: " + reverseStr);
```

###20 Best Java Tools for Developers in 2020
https://www.guru99.com/java-tools.html

しれっとGroovyが入ってるんだけどJavaのツールって表現でええんやろかｗ

###Java Spring Tutorial
https://www.guru99.com/spring-tutorial.html

>Spring is a lightweight framework which can be thought of as a framework of frameworks because it offers support for various frameworks such as Hibernate, Struts, Tapestry, JSF, etc.

軽量、だと…？
Springの概念についてはよくまとまってるけど、この記事単体ではSpringでどう開発するかはわからないかな。
Springについては公式が良い気がするけど、gitとかいるから初学者には厳しいかも。
https://spring.io/guides/gs/spring-boot/

###JasperReports Tutorial
https://www.guru99.com/jasperreports-tutorial.html

なるほど、これ帳票作成ツールか。
今まで日本ベンダー謹製の有料ツールしか使ったことなかったから知らんかった。