Java基础语法
一. Java数据类型及运算符
1. 基本数据类型
数据类型 | 大小(字节) | 备注 |
---|---|---|
byte | 1 | |
short | 2 | |
int | 4 | 整型常量默认为int |
long | 8 | 定义变量时,以“l”或“L”结束;不加默认为int,会自己进行类型提升,如果超过int,会报错; |
float | 4 | 定义变量时,要以“f”或“F”结束(不加编译失败);**同为四位,但是比long表示范围大,**因为在一块区间中分为两部分:一部分表示数值,一部分表示10的指数。 |
double | 8 | 浮点型常量,默认为double |
char | 2 | 只能写一个字符;转义字符;或者Unicode值表示的字符型常量 |
boolean | Jvm决定 | 只能取 true/false |
- 转移字符“ \\n”,"\""
2. 引用数据类型
- 类
- 接口
- 数组
3. 运算规格(不包含boolean)
3.1 自动类型提升
- 容量小的和容量大的进行运算时,自动提升为容量大的数据类型;
- 此时的容量大小,指的是表示数的范围的大小。
- byte、char、short<int<long<float<double
3.2 强制类型转换
-
自动类型提升的逆运算
- 可能精度丢失
double d = 14.9; int i = (double)d; //14,精度丢失 int i2 = 128; byte b = (byte)i2; // -128
4. String
-
“”,双引号字符串;‘’单引号char类型,用+号时,切记出错。
-
引用数据类型
String s = “hello world”; //长度不要超过内存大小就好了
-
可以和八种基本数据类型做运算,只能用连接符号 + ,结果为String
char c = 'a'; // 97 A:65 int num = 10; String str = "hello" System.out.printf(c+num+str); // 107hello System.out.printf(c+str+num); // ahello System.out.printf(c+(num+str)); // a10hello System.out.printf((c+num)+str); // 107hello System.out.printf(str+num+c); // hello10a
5. 进制
进制 | 开头 |
---|---|
二进制 | 0b/0B |
十进制 | |
八进制 | 0 |
十六进制 | 0x/0X |
6. 三码
- 原码(正数三码合一,负数不同)
- 反码:除了符号位外,其余位取反
- 补码:反码+1
- 计算机底层都以补码的方式来存储数据
- 如果是负数补码,即最高位位1,求原码:按位取反,末尾+1(进位)
7. 运算符
7.1 逻辑运算符
- 操作的都是布尔值
- &&与||都有短路特性
a | b | a&b | a&&b | a|b | a||b | !a | a^b |
---|---|---|---|---|---|---|---|
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | true | true | true |
false | false | false | false | false | false | true | false |
7.2 位运算符
运算符 | 运算 | 解释 |
---|---|---|
<< | 左移 | 在一定范围内,往左移n位,值扩大2^n,剩余用0补;移位过多,会变成负数 |
>> | 右移 | 即在右移的基础上,补空缺位时**,如果原最高位为1,则最高位补1;否补0;** |
>>> | 无符号右移 | 即右移直接补0,不考虑原数的正负,即原数的最高位 |
& | 与运算 | 只有同为1时,结果为1 |
| | 或运算 | 只有同为0时,结果为0 |
^ | 异或 | 两个不同为1 |
~ | 取反 | 包括符号位在内,按位取反 |
-
面试题:如何高效的计算 2 * 8
- 2<<3
- 8<<1
-
练习:交换两个变量的值
int num1 = 10; int num2 = 20; // 1. 定义中间变量 // 2. // 2.1 优:不用定义临时变量 // 缺: 1.相加操作可能超出存储范围 // 2.有局限性:只可以适用于数值类型 num1 = num1 + num2; num2 = num1 - num2; num1 = num1 - num2; //3. 使用位运算符 num1 = num1 ^ num2; num2 = num1 ^ num2; num1 = num1 ^ num2;
7.3 三元运算符
- 结构:(条件表达式)?表达式1:表达式2
- 表达式1与表达式2 要求是可以统一为一个类型,用于返回值接收
- 三元运算符可以转为if-else,反之并不恒成立
- 优先使用三元运算符,简洁执行效率高
7.4 赋值运算符
- – 、 ++ 、+= …
- 不会改变数据类型
7.5 比较运算符
- “>” 、<、 >=、<=、
- instanceof
7.6 运算符优先级
二. 流程控制
1. 顺序结构
2. 分支结构
2.1 if-else
2.2 switch-case
- switch结构中的表达式,只能是如下6种数据类型之一:
- byte
- short
- char
- int
- 枚举类型(JDK5.0)
- String(JDK7.0)
- case之后只能声明常量,而不能声明范围
- [default] 默认,最终如果无匹配,则执行
3. 循环结构
3.1 for
- 执行顺序是 A-B-D-C-B-D-C-B
- B必须是布尔类型
for(A;B;C){
D
}
3.2 while
- for循环与while循环的初始化条件作用范围不同
3.3 do-while
- 至少会执行一次循环体
3.4 break-continue
-
break
-
默认跳出包裹此关键字最近的一层循环
-
带标签的break:
label:for(;;){ for(;;){ break label; } }
-
-
continue
- 同break默认
- 带标签的continue,同上
3.5 获取100以内的质数
label:for(int i=2;i<100;i++){
for(int j=2;j<=Math.sqrt(i);i++){
if(i%j == 0){
continue label;
}
}
System.out.printf(i);
}
- 同break默认
- 带标签的continue,同上
3.5 获取100以内的质数
label:for(int i=2;i<100;i++){
for(int j=2;j<=Math.sqrt(i);i++){
if(i%j == 0){
continue label;
}
}
System.out.printf(i);
}