
简化版脑图
特性
- 简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释型、高性能、多线程、动态性
基础
注释
- 单行注释://
- 多行注释:/ /
- 文档型注释:/* /
数据类型
整型
| 类型 | 存储需求 | 取值范围 |
|---|---|---|
| int | 4字节 | -2^31 到 2^31 -1 |
| short | 2字节 | -2^15 到 2^15 -1 |
| long | 8字节 | -2^63 到 2^63 -1 |
| byte | 1字节 | -2^7 到 2^7 - 1 |
Tips:
- 长整型数值有一个后缀:大写或小写的L,如 4000000000L
- 十六进制数值有一个前缀 0x 或 0X,如 0xCAFE
- 八进制有一个前缀0,如 010对应八进制中的8
- Java7开始,加上前缀 0b 或 0B 可以写二进制数,如 0b1001表示9
- Java7开始,可为数字字面量加下划线,如 1_000_000 (或0b1111_0110_0010_0100_0000),表示一百万,Java编译器会去除这些下划线
浮点类型
| 类型 | 存储需求 | 取值范围 | | —- | —- | —- | | float | 4字节 | 约 ±3.4028235e+38f (有效位数为6~7位) | | double | 8字节 | 约 ±1.7976931348623157e+308 (有效位数为15位) |
特殊浮点值
- 正无穷大:Double.POSITIVE_INFINITY
- 负无穷大:Double.NEGATIVE_INFINITY
- NaN (不是一个数字):Double.NAN,可通过 Double.isNaN方法校验
Tips:
char c = ‘A’; // char类型的字面量值要用单引号括起来,’A’是编码值为65对应的字符常量,与字符串”A”不同,需要区分开
boolean类型
有两个值:true 和 false,常用于条件判断
变量
- 变量名:必须以字母开头,可由大小写字母、数字、下划线(_)、美元符($)构成;变量名不能为Java的保留字(如class, this, for, do等等)
- 初始化变量语法:类型 变量名;(如 int num;)
- 使用关键字final就变为常量:final 类型 常量名 = 常量值;(如 final int MAX_NUM = 1;)
- 常量名最好使用全大写加下划线分割
运算符
算数运算符
| 运算符 | 名称 | 备注 |
|---|---|---|
| + | 加 | |
| - | 减 | |
| * | 乘 | |
| / | 除 | 整数被0除将会产生异常,浮点数被0除将得到无穷大或NaN |
| % | 求余(取模) |
二元运算符
- 一般,把运算符放在 = 号左边,如 += 或 -= 或 *= 或 /= 或 %= 或 &= 或 |= 或 ^= 或 <<= 或 >>= 或 >>>=
-
自增与自减运算符
自增:++
- ++放变量左边,先自增后运算
- ++放变量右边,先运算后自增
- 示例:
- int a = 1; int b = a++; // 结果a为2,b为1
- int a = 1; int b = ++a; // 结果a为2,b为2
- 自减:—
- 同理自增
- Tips:
- 只适用于整型或是浮点类型的已进行赋值操作的变量
- good case:
int i = 1; i++; - bad case:
int i; i++; String s = "ok"; s++;关系运算符
| 关系运算符 | 名称 | 备注(以:a 关系运算符 b 说明) | | —- | —- | —- | | == | 校验相等 | a == b,当两边相等结果为true,否则为false | | != | 校验不等 | a != b,当两边不等结果为true,否则为false | | < | 小于 | a < b,当a小于b时结果为true,否则为false | | > | 大于 | a > b,当a大于b时结果为true,否则为false | | <= | 小于等于 | a <= b,当a小于或等于b时结果为true,否则为false | | >= | 大于等于 | a >= b,当a大于或等于b时结果为true,否则为false | | && | 与 | 条件1 && 条件2,当条件1,2都为true时结果为true,否则为false | | || | 或 | 条件1 || 条件2,当条件1,2有一个为true时结果为true,否则为false | | ! | 非 | !条件,当条件为true时,结果为false,否则为true |
- good case:
- 只适用于整型或是浮点类型的已进行赋值操作的变量
位运算符
| 位运算符 | 名称 | 备注(都作用于二进制数值) |
|---|---|---|
| & | 按位与运算符 | 1&1=1、1&0=0、0&1=0、0&0=0 |
| | | 按位或运算符 | 1|1=1、1|0=1、0|1=1、0|0=0 |
| ^ | 按位异或运算符 | 1^1=0、1^0=1、0^1=0、0^0=0 |
| ~ | 按位取反运算符 | ~1=0、~0=1 |
| << | 左移运算符 | |
| >> | 带符号右移运算符 | |
| >>> | 无符号右移运算符 |
括号与运算符优先级
| 运算符 | 结合性 |
|---|---|
| [] .()(方法调用) | 从左向右 |
| ! ~ ++ — +(一元运算) -(一元运算) ()(强制类型转换) new | 从右向左 |
| * / % | 从左向右 |
| + - | 从左向右 |
| << >> >>> | 从左向右 |
| < <= > >= instanceof | 从左向右 |
| == != | 从左向右 |
| & | 从左向右 |
| ^ | 从左向右 |
| | | 从左向右 |
| && | 从左向右 |
| || | 从左向右 |
| ? : | 从右向左 |
| = += -= *= /= %= &= |= ^= <<= >>= >>>- | 从右向左 |
字符串
String类
- 标准Java类库中提供,每个用双引号括起来的字符串都是String类的实例
-
子串
String类提供substring方法可以从一个字符串中提取出一个子串
- 如:String str = “hello”; String s = str.substring(0, 3);
substring第一个参数为开始复制的位置,第二参数为不想复制的第一个位置,因此上面要复制的为str的第0,1,2位
拼接
String str = “hello”; String str2 = “world”; String all = str + str2;
不可变字符串
-
检测字符串相等
使用equals()方法
-
空串与Null串
str.length() == 0 或 str.equals(“”)为true则为空串
-
码点与代码单元:
Java字符串由char值序列组成
- String str = “abc”;
- 本质上等同于:char data[] = {‘a’, ‘b’, ‘c’}; String str = new String(data)
可使用charAt(n)方法来访问位置n的代码单元(n介于0 ~ str.length - 1之间)
当出现需要多个短的字符串构建一个长的字符串时,使用字符串拼接方式效率太低(不断创建新的String对象),这种场景推荐使用StringBuilder
String str1 = "haha";String str2 = " ok!";StringBuilder builder = new StringBuilder();builder.append(str1); // 调用append方法拼接builder.append(str2);String longStr = builder.toString(); // 调用toString方法获得整串字符串
控制流程
块作用域
- 块(即复合语句)是指由一对大括号括起来的若干简单的Java语句
-
条件语句
if…else
-
循环
for
- for each:
for(variable : collection) statement - while
- do…while
- switch
- break, continue (中断流程)
大数值
当基本的整数和浮点精度无法满足需求时,可以考虑使用 java.math中的两个类:BigInteger 和 BigDecimal,这两个类可处理包含任意长度数字序列的数值
- BigInteger类实现了任意精度的整数运算
- BitDecimal类实现了任意精度的浮点数运算
通常使用静态的valueOf方法将普通数值转换成大数值
// BigInteger示例int a = 100;int b = 200;BigInteger bigA = BigInteger.valueOf(a);BigInteger bigB = BigInteger.valueOf(b);BigInteger c = bigA.add(bigB);// BigDecimal示例double a2 = 100.0;double b2 = 200.0;BigDecimal bigDecimalA = BigDecimal.valueOf(a2);BigDecimal bigDecimalB = BigDecimal.valueOf(b2);BigDecimal c2 = bigDecimalA.add(bigDecimalB);
数组
数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。如a是一个整型数组,a[i]就是数组下标为i的整数
- 声明语法:数据元素类型[] 变量名;
初始化语法:数据元素类型[] 变量名 = new 数据元素类型[数组长度]
int[] a; // 声明整型数组aint[] b = new int[100]; // 声明整型数组b并初始化
数组初始化以及匿名数组
直接创建数组对象并同时赋予初始值:
int smallPrimes = { 2, 3, 4 };- 直接初始化一个匿名数组:
new int[] { 2, 3, 4 }; 注意:Java允许数组长度为0,需要区分开数组长度为0以及null的区别
Arrays类的copyOf方法
int[] nums = { 1, 2, 3 };int[] copyNums = Arrays.copyOf(nums, nums.length);// Arrays.copyOf方法第一个参数时要拷贝的数组,第二个参数是新数组的长度
数组排序
Arrays类的sort方法(该方法使用了优化的快速排序算法)
多维数组
// 声明一个二维数组int[][] nums;// 初始化一个二维数组int[][] newNums = new int[3][3];// 初始化一个二维数组并赋值int[][] numbers = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 访问方法同一维数组类似,直接使用下标即可 numbers[行下标][列下标]int oneNumber = numbers[1][1]; // oneNumber值为5
不规则数组
// Java本质上只有一维数组,所谓的多维数组只是在一维数组中的每个位置再嵌套一个数组int[][] nums = new int[3][];for (int i = 0; i < 3; i++) {nums[i] = new int[i+1];}/* 以上面的程序为例,最后输出的是类似下面的不规则数组{{ 1 },{ 1, 2 },{ 1, 3, 3 },};*/
提问环节
- BigDecimal类是如何解决浮点类型数值的计算精度问题的?
- BigInteger类又是如何解决整型数值计算的精度问题的?
- 涉及多个短的字符串拼接成一个长字符串时,为什么推荐使用StringBuilder类?它又是怎么实现字符串拼接的呢?
- 数组拷贝中,Arrays类的copyOf方法是如何实现的?它是深克隆还是浅克隆呢?
- 数组排序中,Arrays类的sort方法又是如何实现的呢?
