程序基础
基本结构
public class Hello {
public static void main(String[] args) { // 方法名是main
// 方法代码...
} // 方法定义结束
}
class
类名关键字
public
访问修饰符, 表示公开; 修饰类, 也修饰方法
- 返回值
void
, 表示没有任何返回值
static
, 修饰符, 表示静态方法
- 括号内的参数, 表示必须是Sting数组
变量
基本数据类型
- 整数类型: byte(1), short(2), int(4), long(8)
- 浮点数类型: float(4), double(8)
- 字符类型: char(2)
- 布尔类型: boolean(1)
- 计算机知识: 最小存储单位字节: 一个字节8个bit(二进制), 换成十进制就是(0 ~ 255)
整型
- java只定义了带符号的整型
- 最高位bit表示正负
浮点型
- 浮点型表示小数
- 对于float型, 需要加上f后缀
布尔型
- true 和 false
- 理论上1bit, JVM通常存为4bit
字符型
常量
变量作用范围
整数运算
- 整数永远是精确的, 计算结果页永远是精确的
- 整数计算结果超过范围会溢出, 溢出不会报错, 一个错误的结果
- 如果参与运算双方类型不一致, 计算结果为较大类型的整型
int i = 12345;
short s = (short) i; // 12345
- i 强制转换为
short
类型. (强制转换的结果可能是错的)
浮点数运算
- 浮点数的计算存在误差
- 浮点数在内存中的表示很复杂
- 整数和浮点数计算, 整数提升为浮点数
- 解决办法: "整数和小数部分分开计算"
布尔运算
字符类型和字符串类型
- 字符类型
char
是基本数据类型, 占用两个字符. 单引号表示
- 字符串类型
String
是引用类型, 双引号表示
- 无法表示的时候, 使用
进行转义.
- 编译器允许使用
+
链接任何字符串和其他类型
- 使用
""...""
表示多行字符串
- 字符串不可变, 改变不了本质, 只能改变指针指向的内存
- 引用类型的变量可以指向一个空
null
数组类型
- 定义使用
类型[]
, 初始化new int[5]
必须确定需要包含的数量
- 所有元素初始化后的默认值, 整型是0, 浮点型为0.0, 布尔型为false
- 数组一旦创建后, 大小不可改变
- 访问数组, 使用索引. 索引超过范围, 将会报错
public static void main(String[] args) {
int[] ns = new int[] {1, 2, 3, 4, 5, 6};
System.out.println(ns[5]);
}
int[] ns = new int[] {1, 2, 3, 4, 5, 6};
ns = new int[] {1, 2, 4};
流程控制
输出
- 格式化输出
printf()
, 通过使用占位符%?
, 可以格式化后面的参数为指定格式
%%
表示%
本身
- 两个
%
占位符, 必须传入两个参数
输入
System.in
代表标准输入流
- 可以使用java提供的
scanner
来方便输入
if判断
- 注意if的判断顺序与边界问题
- 浮点数使用
==
并不靠谱
- 引用类型的
==
用来判断是否指向同一个对象
String s1 = "hello";
String s2 = "HELLO".toLowerCase();
System.out.println(s1.equals(s2));
- 使用
equals()
判断值是否相等
- 避免NullPointerException错误, 可以使用短路运算
&&
switch多重选择
- 漏写
break
会导致意想不到的结果
- 字符串匹配时, 是比较的内容相等
- 不要忘记
default
, 不要忘记break
public static void main(String[] args) {
String fruit = "mango";
switch (fruit) {
case "apple" -> System.out.print("apple");
case "pear" -> System.out.print("pear");
case "mango" -> {
System.out.print("aaa");
System.out.print("bbbb");
}
default -> System.out.print("No fruit");
}
}
public static void main(String[] args) {
String fruit = "apple";
int opt = switch (fruit) {
case "apple" -> 1;
case "pear" -> 2;
default -> {
int code = fruit.hashCode();
yield code;
}
};
System.out.print(opt);
}
while和do while
for循环
int[] ns = {2, 199, 32, 4123};
for (int n : ns) {
System.out.println(n);
}
- 使用
for each
可以遍历可迭代的数据类型. 例如List
, Map
等
break和continue
- 在循环过程中, 使用
break
跳出循环
break
只跳出自己的这层循环
continue
提前结束本次循环, 继续执行下次循环
数组操作
遍历数组
- 直接打印地址, 打印的是在JVM中的引用地址
Arrays.toString(ns)
可以打印出数组
数组排序
Arrays.sort(ns)
可以进行排序
- 对数组排序改变的是数组本身
- 其实原来内存中的值并未改变, 但是数组索引每个值的指向改变了
多维数组
命令行参数