Java Silver SE11 2章

# Java Silver SE11 2章
[黒本](https://www.amazon.co.jp/gp/product/4295007625/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。

## データ型
プリミティブ型と参照型の2種類のデータ型が存在する。
プリミティブ型: 数値、真偽値、文字などのデータそのもの。
参照型: オブジェクト型、配列型など

### Javaで使用されるプリミティブ型

| データ型   | 値 |
|:--------:|:--|
| boolean | true, false  |
| char     | 16ビットUnicode文字 ¥u0000~¥uFFFF |
| byte     | 8ビット整数 -128~127 |
| short    | 16ビット -32768~32767 |
| int      | 32ビット (省略) |
| long     | 64ビット (省略) |
| float    | 32ビット 末尾にfを付ける  1.2F |
| double   | 64ビット 通常の少数と同じ 1.2 |


## リテラル
ソース内に記述する値のこと。
Javaでは４つのリテラルがあり、デフォルトの型がある。

| 値 | デフォルトの型 |
|:--:|:----------:|
| 整数値        | int     |
| 浮動小数点数値 | double  |
| 真偽値        | boolean |
| 文字         | char     |

他のデータ型で表示したい場合は、接尾辞を付ける。
例
long型 `100L`
float型 `5.0F`
byteやshortは接尾辞はなく、自動的に型変換される。

※```null```は、変数が何も参照していないことを表すリテラルである。
この時、```null```は文字列として出力されるので、文字列結合ができる。

### 整数リテラル 
整数リテラルは、2進数、8進数、16進数のリテラルで表記できる。
この場合は接頭辞として、それぞれ「0b」「0」「0x」を付ける。

| n進数 | 例 |
|:---:|:--:|
| 2進数  | 0b100001011  |
| 8進数  | 0413  |
| 16進数 | 0x10B |

アンダースコア（_）を利用し、桁数の多いリテラルを見やすくすることができる。

* リテラルの先頭と末尾には記述できない
* 記号の前後には記述できない<br>（記号: L F 0b 0x . ）　

この２つのルールがある。

```java:アンダースコア
public class Main {
	public static void main(String[] args) {
		int a  = 123_456; // aのみ問題なし
		int b  = _123456;
		int c  = 123456_;
		float d  = 3._14F;
		float d  = 3.14_F;
	}
}
// 変数b~dは全てコンパイルエラーになる
```

### 文字リテラル
「あ」などの文字の１文字のこと。
(文字列リテラルと間違えやすい。)
標準の文字コードとして、Unicodeが採用されており、
文字は ¥uから始まるUnicode番号によって管理されている。


| 文字 | 文字列 |
|:---|:-----|
| char  | String  |
| シングルクォーテーション　'a' | ダブルクォーテーション "abc" |
| × 'abc' | ○ "abc" |
| × null | ○ null |
| ○ 0~65535 数値リテラル | × あくまで文字列 |

※ nullは、参照型変数が何も参照しないことを表現するためのデータである。
そのため、値を保持するためのプリミティブ型ではnullを代入できない。

## 識別子
変数やメソッド、クラス名などの名前のこと。

* 予約語を使用できない
* 記号は、アンダースコア「_」と通貨記号のみ使用可能
* １文字目に数字は使用できない

```java:識別子
int _0 = 100; // 問題なし
int $a = 200; // 同上
```

## 型推論 (var)
コンパイラが右辺から変数のデータ型を推論し、そのデータ型に置き換える。

* データ型を特定できない場合は、コンパイルエラーになる
* ローカル変数の宣言にしか使用できない
* コンパイルする時に型が決まる
* 変数宣言以降の行で、その変数がどのように使われているかは考慮していない

 例

```java
var a; //×初期化していない
var b = {1, 2, 3}; // ×何型の配列インスタンスかわからない

public class sample(){
  // ×フィールドの宣言には使用できない
  var name = "";

  // ×引数の宣言にも使えない
  public void sample(var value){
    System.out.println(value);
  }
}
```

## Stringオブジェクト
java.lang.Stringクラスのこと。

* newでインスタンスを生成
* ""を用いた文字列リテラルを記述する
* Stringは不変なオブジェクトであるため、文字列を変更するには新しくインスタンスを作成する必要がある

```java:String
	public static void main(String[] args) {

		String str2 = "hoge, world";

		str2.replaceAll("hoge", "hello");
		System.out.println(str2); //hoge, world


		String str3 = "hoge, world";

		str3 = str3.replaceAll("hoge", "hello");
		System.out.println(str3); //hello, world
	}
```

補足：replaceAllメソッドは、置換後の文字列インスタンスを生成し、その参照を戻す。


### Stringクラスのメソッド
java.lang.Stringクラスには様々なメソッドが用意されている。
以下問題に出てきたものを抜粋。

| メソッド名 | 処理内容 |
|:-------:|:------|
| charAt | 引数で指定した位置にある文字を抜き出す  |
| indexOf | 引数で指定した文字がどの位置にあるのかを調べる |
| substring | 任意の文字列を抽出する  |
| replace | 文字列を置換する  |
| length | 文字数を返す |
| concat | 文字列を結合させる |


## StringBuilder
内部にバッファを持った文字列を扱うクラス。
Stringは、文字列と同じchar型を扱うのに対して、
「保持している文字列＋余分のバッファ（16文字分）」を持っている。

### StringBuilderのメソッド
以下問題に出てきたものを抜粋。

| メソッド名 | 処理内容 |
|:-------:|:------|
| append | 新しい文字列を追加する |
| reverse | 反転させる |


## 実際に検証

```java
package chapter2;

public class Main {

	public static void main(String[] args) {

		//文字番号は0から初まる
		String str = "abcde";

		//charAt
		//引数で指定した位置にある文字を抜き出す
		System.out.println(str.charAt(4)); //e
		//System.out.println(str.charAt(5)); //例外がスローされる

		//indexOf
		//文字列が初まる最初の文字位置が表示される
		System.out.println(str.indexOf("d")); //3
		System.out.println(str.indexOf("bc")); //1 開始位置を表示
		System.out.println(str.indexOf("abcdef")); //-1

		//substring
		//任意の文字列を抽出する
		System.out.println(str.substring(2, 4)); //cd
		System.out.println(str.substring(2)); //cde 開始から最後まで

		//replace
		//第１から第２引数に置換する
		System.out.println(str.replace("a", "b")); //bbcde
		String str2 = "aaaa";
		System.out.println(str2.replace("aa", "b")); //bb 1.baa -> 2.bb

		//length
		//文字数を返す
		System.out.println(str.length()); //5

		//startsWish
		//引数で指定された文字で初まるかを調べる
		System.out.println(str.startsWith("a")); //true

		//concat
		//引数と文字列を連結させる
		String str3 = "hello ".concat("Java");
		System.out.println(str3); //hello Java

		//StringBuilder
		StringBuilder sb = new StringBuilder();
		sb.append("abcde"); //新しい文字列を追加
		sb.reverse(); //反転
		sb.replace(1, 3, "a"); //第1〜第2引数の範囲の文字列を置換する
		System.out.println(sb); // eaba
	}

}

```

## 宣言と初期化

### 宣言
変数名とデータ型を指定する。

```java:宣言
int num;
```

### 代入
変数に値を格納すること。

```java:代入
num = 10;
```

### 初期化
変数を宣言するのと同時に、値を代入すること。
```java:初期化
int num = 100;
```