# Day 02
## Char变量类型——单一字符
### 声明方式
```java
char c1 = 'A'; // 字符 A
char c2 = '中'; // 中文字符
char c3 = '\u0041'; // Unicode 表示的 'A'
char c4 = 65; // 数字 65 会转成 'A'
```
### 和‘String’有何不同?
char表示一个字符而Stirng表示一串字符(字符数据的封装)
```java
char c = 'A';
String s = "ABC";
```
### 常用转换
```java
char c = 'A';
int ascii = c; // 自动转成 int,结果是 65
int code = 66;
char ch = (char) code; // 转回 'B'
```
### 使用场景
1.处理单个字符('A')
2.遍历字符串
```java
String str = "Hello";
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
System.out.println(ch);
}
```
### 注意!
C语言里的char为1字节(ASCII),而Java里的char是2字节(Unicode),所以Java里的char能表示中文、日文等字符。
## 前置自增++x和后置自增x++
### ++x
```java
int x = 5;
int y = ++x; // 先 x = 6,再把 6 赋值给 y
// 结果:x = 6, y = 6
```
### --x
```java
int x = 5;
int y = x++; // 先把 5 赋值给 y,再 x = 6
// 结果:x = 6, y = 5
```
## 位运算符
### Java的常见位运算符
| 运算符 | 含义 | 作用 | 示例(以 8 位二进制为例) |
| ------ | ---------------------- | ---------------------------- | --------------------------------------------------- |
| `&` | 按位与 | 两位都为 1 结果才是 1 | `12 & 5 → 00001100 & 00000101 = 00000100 (4)` |
| ` | ` | 按位或 | 只要有一个为 1 结果就是 1 |
| `^` | 按位异或 | 相同为 0,不同为 1 | `12 ^ 5 → 00001100 ^ 00000101 = 00001001 (9)` |
| `~` | 按位取反 | 0 变 1,1 变 0(包括符号位) | `~12 → 11110011`(结果是 -13,见注意事项) |
| `<<` | 左移 | 向左移动指定位数,右边补 0 | `3 << 2 → 00000011 << 2 = 00001100 (12)` |
| `>>` | 右移(算术右移) | 向右移动,左边补符号位 | `-8 >> 2 → 11111000 >> 2 = 11111110 (-2)` |
| `>>>` | 无符号右移(逻辑右移) | 向右移动,左边补 0 | `-8 >>> 2 → 11111000 >>> 2 = 00111110 (1073741822)` |
## Swich-case选择结构
```java
switch(表达式){
case 常量值1:
语句块1;
//break;
case 常量值2:
语句块2;
//break;
// ...
[default:
语句块n+1;
break;
]
}
```

## Scanner从键盘输入
```
Scanner:键盘输入功能的实现
• 如何从键盘获取不同类型(基本数据类型、String类型)的变量:使用Scanner类。
• 键盘输入代码的四个步骤:
1. 导包:import java.util.Scanner;
2. 创建Scanner类型的对象:Scanner scan = new Scanner(System.in);
3. 调用Scanner类的相关方法(next() / nextXxx()),来获取指定类型的变量
4. 释放资源:scan.close();
• 注意:需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常 导致程序终止。
```
## 随机数获取
| 方法 | 范围 | 线程安全 | 性能 | 安全性 | 适用场景 |
| ------------------- | ---------- | -------- | ---- | ------ | ---------------- |
| `Math.random()` | [0.0, 1.0) | 否 | 高 | 低 | 普通随机数 |
| `Random` | 自定义 | 否 | 中 | 低 | 单线程游戏、模拟 |
| `ThreadLocalRandom` | 自定义 | 是 | 高 | 低 | 高并发环境 |
| `SecureRandom` | 自定义 | 是 | 低 | 高 | 加密、密码生成 |
## 数组
```java
//1. 声明并分配空间(默认值)
int[] arr = new int[5]; // 创建一个长度为5的int数组,默认每个元素为0
//2. 声明并直接赋值
int[] arr = {1, 2, 3, 4, 5}; // 声明并初始化数组
//3. 分开写(先声明,再赋值)
int[] arr;
arr = new int[]{1, 2, 3};
//4.二维数组
//1.创建空的二维数组(每个子数组长度相同)
int[][] matrix = new int[3][4]; // 3行4列的数组,默认值为0
//2,. 声明并初始化
int[][] matrix = {
{1, 2, 3},
{4, 5, 6}
};
//5.动态数组,不规定长度
// 创建 ArrayList,类型为整数
ArrayList<Integer> list = new ArrayList<>();
// 添加元素
list.add(10);
list.add(20);
list.add(30);
// 访问元素
System.out.println(list.get(1)); // 输出 20
// 修改元素
list.set(1, 25); // 将索引1的值改为25
// 删除元素
list.remove(0); // 删除索引0的元素(即10)
// 遍历
for (int num : list) {
System.out.println(num); // 输出 25, 30
}
// 获取大小
System.out.println("大小:" + list.size()); // 输出 2
}
```
