Java雑記

⚠️ 初心者の学習メモです。技術的に正確でない部分があるかもしれません。というか多分正確でない部分の方が多いかもです。注意ください。

学習サイトを使っての勉強中につまずいたとこ、やってる中で気になったけどサイトにはまだ書いてなかったことを調べたり聞いて書きなぐり　人に読んでもらうことあんまり考えずに書いているので読みにくい箇所多いかもです。
ならなぜ公開しているかというと、勉強してますアピールです。少しでも就活で有利になってほしいからです。

気になったことは大体AIに聞くかGoogleで検索してます。
もし読んだ人で、ここ違うよ等あれば教えていただけると凄く助かります。

---
`6/5`

; 書き忘れます　癖付けましょう　なるべく


最初のこれ↓
public class Main{
    public static void main(String[] arg){
          }
}

public class Main{
public は全体で使えるクラスですよって感じ？
class クラス定義
Mainは　自由だけどファイル名と一致させる必要がある

public static void main(String[] arg)

static JVMではインスタンス化（呼び出し（Main.main()）って後からすること）不要で実行してくれる？
結構あいまいにとらえてる　なかったら後から呼び出さないと動かない　JVMだと探して勝手に実行してくれる？みたいな感じらしい

void 戻り値がないよ～って話みたい　おつりいりません的な　知らんけど

main　JVMだとこれをスタート地点にするみたい　これが二個ある（class A ~~~main()とclass B ~~~main）ってなってるとコマンドラインだとJava A とか Java B みたいに指定しないとみたい　もしくは選択させられるかバグる

String[] arg　Java　Main あれ　これ　それ　ってコマンドラインで実行すると　あれ、これ、それを保持？しといてくれるみたい

---
`6/6`

if文　数値は　number == 数値　文字？数値以外？だと　notnumber.equals("対象")で一致判定するみたい
一致以外はどうなるんだろとは思ったものの数値以外の大小ってどうやって判別すんねんではある　もじすうとかではんていされるんかな　後で調べます

else if  手癖ポイント　elifでもelseifでもなく　else if

Scanner scan = new Scanner(System.in);
int or String 名前　= scan.next()or scan.nextInt 
scanはなんか短縮してscって書いてるの見る
intはIntegerの略称っぽいのにStringだけ毎回書くのめんど～って思ったらstrじゃダメ見たい
プリミティブ型（int）とラッパークラス（Integer）っていう違いみたい　ほかにも何個かある
プリミティブは軽い代わりにnullが入らない、.toString（文字扱いするメソッド）とかのメソッド（便利機能？）が使えない、リストに入れることができないみたいな感じみたい　取り回し〇　応用×みたいな　計算用って認識がよさそう

nextIntのIが大文字なのは複合（nextとint）みたいな感じでその時はnextintだと何言ってるかわかりにくいから一文字目を大文字にするみたい

new 演算子
Integer x = 数値　とか　String x = 文字　みたいな感じの時はなんも考えずにやってますがちゃんとやると
Integer x = new Integer(数値)　とか　String x ＝ new String(文字) みたいな感じで毎回newが要るっぽい　よく使うからなのかわからんけどIntegerとかStringはなくていいらしい

---

`6/7`

ArrayList<型> リスト名 = new ArrayList<型(省略可)>(); 


ArrayList<データの種類>ってやるとリストに入れるデータの種類(整数かとか文字かとか)を決めれるらしい？ 違う型のを入れようとするとエラー起きた（コンパイルエラー）

indexOf　メソッド
ArryList.indexOf(インデックス取得したい要素名);でそれのインデクッスを取得できる
リストにないものを指定したときはエラーじゃなくて-1が取得される


booleanについて
.contains(名前);のメソッドやっててint Stringみたいに入れ物あるのかなって聞いたらbooleanっていうのに入れるらしい

GPTが例で挙げてくれたやつ自分なりに書き換えたやつがこれ 篠澤広出てきてるのはGPTの口調を篠澤広風にしてるから　面白そうなので

```java:test.java
if (体感温度 > 熱いと感じる基準){
    boolean ishot = true;
}else{
    boolean ishot = false;
}

if (ArrayList形式の目から受け取ったデータ.contains("脳のデータ内の記憶の中の篠澤広")){
    boolean meet_hiro = true;
}else{
    boolean meet_hiro = true;
}

if (ishot && meet_hiro){
    System.out.println("今日は暑かったが、篠澤広さんに会った(見かけた)。")
}else if(ishot && meet_hiro == false){
    System.out.println("今日は暑い上に、篠澤広さんに会えなかった(見かけなかった)。")
}else if(ishot == false && meet_hiro){
    System.out.println("今日は暑くない上に、篠澤広さんに会った(見かけた)。")
}else{
    System.out.println("今日は暑くはなかったが、篠澤広さんに会えなかった(見かけなかった)。")
}
```
直してもらったのがこれ
```java:fix.java
boolean ishot;
if (体感温度 > 熱いと感じる基準) {
    ishot = true;
} else {
    ishot = false;
}

boolean meet_hiro;
if (目から受け取ったデータ.contains("篠澤広")) {
    meet_hiro = true;
} else {
    meet_hiro = false;
}

// ここから結果判定
if (ishot && meet_hiro) {
    System.out.println("今日は暑かったが、篠澤広さんに会った(見かけた)。");
} else if (ishot && !meet_hiro) {
    System.out.println("今日は暑い上に、篠澤広さんに会えなかった(見かけなかった)。");
} else if (!ishot && meet_hiro) {
    System.out.println("今日は暑くない上に、篠澤広さんに会った(見かけた)。");
} else {
    System.out.println("今日は暑くはなかったが、篠澤広さんに会えなかった(見かけなかった)。");
}
```

直してもらって学べたのは
1.データ型 変数名;だけでもエラー起きないんだってこと
2.if内で真偽判定するとき、真はそのままで偽は!変数名だってこと

2はそのうち学ぶとは思ってたけど、1は試したこともなかったから驚いた。

データ型 変数名;ってすると何も入ってない(nullがあるとかでもない)変数が作れる　その状態で使おうとしてもエラー起きるみたい
あとから　変数名 = データ　ってやる必要があってこれが初期化らしい　int x = 9 とかは変数作るのと同時にでーたしてるって意味だったらしい　お得なことしてたんだね
今まで自分が結構やってたあとからデータ入れる用だけどループの外でやりたいからとりあえずでやってたのがint x = 0 ;(Integer xだったら0じゃなくてnull入れることができる)

int x = 0;とint x;の違いは0っていう数字を使うのかどうかみたい
例えば値段を決めるときint 値段 = 0;ってやってもし値段入れ忘れたら0円で売ることになって大事故になるけどint 値段;だけにしといたら忘れてもエラー起きるからまぁ事故は起こらないみたいな感じっぽい

ほな0入ってないInteger x = null;とint x;はほぼ一緒かぁ~って思ったらそうでもないっぽい

Integer x = null;とint x;の違いもnullを使うかどうかみたいな感じ？　もし要素がnullならみたいなことするならnullの方がいいらしい

まちがって System.out.println(変数名.remove(削除対象));ってやった時に気づいたけどメソッドをprintするとtrue/falseが出力された(実行できたかできてないの真偽っぽい)　知らんかった　だから何感はちょっとある　
※追記 自分でなんか作った時、テストの時にこれちゃんと消えとるよなって時毎回処理前と処理後printしてたからその手間省けるかも　って思ったけどちゃんと想定してるのが消えたりしてるかとか見たいときもありそうだから結局あんまいらなそう

false出るか確かめるためにSystem.out.println(変数名.remove(データのインデックス数より外の数値));ってやったらエラー起きた　それはそう　って思ったけどSystem.out.println(変数名.remove(リストに存在しない削除対象));ってやったらfalseでエラー起きなかった　なんかでちょっと使えそう

6/9
import java.util.＊;
便利だからこのインポートしとけって書いてあったけどどういう理屈なのか気になった
.＊; はimport文が　import java.~~~~;みたいなやつの時は行けてimport java.~~~~.~~~~;みたいに.*より先にまだ.があるとうまくいかないみたい　クラスをインポートする感じなのに~~~~.~~~~ってなってるサブフォルダ―の名前入れると怒られるみたい　
Aって名前のプリントもってこいって言われたのにAってペンで書いてあるクリアファイルごと渡して はぁ？って言われてるみたいな感じっぽい　ちゃんとAって書いてあるクリアファイルの中にあるAっていうプリントを持ってくる(インポート)よ～ってしないと繊細なのでヘンになる

ついでに色々utilのやつを教えてもらった
Scannner は大きい製作物とかだと使い終わったらclose()で閉めてほしいらしい　でもループするときはScanner関連の処理が終わってからループの外でclose()しないと逆に重くなったりエラー吐くらしい　開け閉めしすぎには注意


forEach
短縮
        リスト.forEach((String 変数) -> {
            System.out.println(変数);
        });    
(String x)は参照が一個だけなら一個分の括弧なしでEach(x ->ってやっていいみたい
->{処理内容}は処理内容が一行だけなら{}なしでいい　消すときは処理の後の；も消す
つまり短縮すると
リスト.forEach(変数 -> System.out.println(変数))になるみたい　すっきりしてる？


---
6/10
== と equals 
String 変数名 = "文字列";とString 変数名 = new String ("文字列");

今までで一番時間かかったかも
最初は文字列の比較の章で文字列の比較っていうのが出てきたときに　あ～equalsね、知ってますよ^^　って思ってたら ==で比較しだしてしかもエラー起きなかったので ??????　ってなった

最終的に
```java:java
    public class Main {
    public static void main(String[] args) {
        String a = "コロッケ";
        String b = new String("コロッケ");
        String c = b.intern();

        System.out.println(a == b); // A
        System.out.println(a == c); // B
        System.out.println(b == c); // C
    }
}
```
このA,B,Cがどういう理由でTrue falseになるかまで一応理解できた。
気が向いたらその時のこと書き起こすかも　めっちゃ長くなってた。

---
6/11
入力
Scanner sc = new Scanner (System.in); ←Scannerの綴り注意　nは二個
型名 変数名 sc.next~~(); ←~~は型によって変える int boolean Stringとか


while 
while (i <既定の値とか)
みたいな感じでやる　既定値に行く処理をwhileの中に置いとかないと無限ループしそう　注意
決まったものが来るまで無制限に繰り返すのがwhile ゲームでメニュー画面表示とかも多分これ？
for if との違いは回数制限があるかとかかな

コレクション型
list そのままリスト　
set　重複がないリスト　あとから同じの入れてもすでにあると追加できない　あとから入れたほうが消える　インデックスがない？

.add(追加対象) .size() .contains(検索対象) .remove(削除対象) .clear() .isEmpty()



map　辞書型みたいな感じ　key valueで紐付けられるみたい

.size()
map名.put(追加するkey,追加するkeyに対応したvalue) .get(検索対象) .containsKey(存在確認対象)
.remove(削除する対象のkey) .keySet()

map名.forEach((keyの受け場所,keyの受け場所)->{処理});

---
6/12
二十ループ

if (条件){continue;}条件を満たしたときだけ飛ばすみたいな感じ 
if (条件){break;}条件を満たした時点でループが終わり外に出る


switch いっぱい条件書かなくてよくて==だけ使えるifみたいなイメージ
switch(引数){
    case 条件:
        処理;
        break;
    case 条件1,条件2,条件3・・・:
        処理;
        break;
    case 条件4,条件5,条件6 -> 処理;
    default :
        caseに当てはまらないものの処理;
        break;
毎回breakしないと次の処理も実行するみたい


変数の型 変数名 = switch(引数){
    case 条件A -> 条件Aで変数に入れたいもの
    case 条件B,C -> 条件BかCの時変数に入れたいもの
    default -> 当てはまらなかった時に入れるもの
}
値を返す必要があるのでdefaultが必須