author:尚硅谷-宋红康
1.数据类型
类型名称 | 关键字 | 占用内存 | 取值范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128~127 |
短整型 | short | 2 字节 | -32768~32767 |
整型 | int | 4 字节 | -2147483648~2147483647 |
长整型 | long | 8 字节 | -9223372036854775808L~9223372036854775807L |
单精度浮点型 | float | 4 字节 | +/-3.4E+38F(6~7 个有效位) |
双精度浮点型 | double | 8 字节 | +/-1.8E+308 (15 个有效位) |
字符型 | char | 2 字节 | ISO 单一字符集 |
布尔型 | boolean | 1 字节 | true 或 false |
2.运算
:::info
可以做运算的基本数据类型有7种,不包含boolean类型
:::
运算规则包括
- 自动类型提升
- 强制类型转换
:::info
规则:
当容量小的变量与容量大的变量做运算时,结果自动转换为容量大的数据类型
byte–>short–>int–>long–>float–>double
特别的:
byte和byte、byte和short、short和short、char和int、char和short做运算,结 果都必须是int类型
规定:
整型常量,规定是int类型
浮点型常量,规定是double类型
:::
2.1 自动类型提升
class VariableTest{
public static void main(String[] args){
// int转long
int i1 = 10;
long l1 = i1;
// long转float
float f1 = l1;
// byte+int
byte b1 = 12;
int i2 = b1 + i1;
// 编译不通过-错误:从int转换到byte可能会有损失
byte b2 = b1 + i1;
// 特殊的***************************************
// 特殊情况1
byte b3 = 12;
short s1 = 10;
// 编译不通过-错误:从int转换到byte可能会有损失
//short s2 = b3 + s1;
int i3 = b3 + s1;
byte b4 = 10;
// 编译不通过-错误:从int转换到byte可能会有损失
//byte b5 = b3 + b4;
int i4 = b3 + b4;
// 特殊情况2
char c1 = 'a';
// 编译不通过
//char c2 = c1 + b3;
int i5 = c1 + b3;
}
}
class VariableTest{
public static void main(String[] args){
long l1 = 123L;
long l2 = 123; // 理解为:自动类型提升(int-->long)
long l3 = 123123123123; // 报错:过大的整数 超出了int类型范围
long l4 = 123123123123L;
float f1 = 12.3F;
float f2 = 12.3; // 报错 会认为是double
}
2.2 强制换转 (xxx)
3.String类型
3.1 String与基本数据类型变量间的运算
:::info
- String与基本数据类型变量间只能做连接运算,使用"+"表示。
- 运算的结果是String类型
- 只要开头是String类型,都能做连接运算
:::
class VariableTest{
public static void main(String[] args){
boolean b1 = true;
int num1 = 12;
String str1 = "hello";
// b1 + num1 boolean不能和int类型做连接运算
// 只有String跟除Boolean类型才做连接运算
String str2 = b1 + num1 + str1; // 编译不通过
}
3.2 如何将String类型的变量转换为基本数据类型
class VariableTest{
public static void main(String[] args){
String str1 = "10 ";
int num1 = Integer.parseInt(str1);// 10
}
4.运算符
分类 | 运算符 |
---|---|
算术运算符(7) | +、-、*、/、%、++、– |
赋值运算符(12) | =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^= |
比较运算符(6) | >、>=、<、<=、==、!= |
逻辑运算符(6) | &、|、^、!、&&、|| |
位运算符(7) | &、|、^、~、<<、>>、>>> |
条件运算符 | (条件表达式)?结果1:结果2 |
Lambda运算符 | ->(第18章) |
:::info
++、-- 运算符不会改变数据类型 (不会自动提升)
:::
4.1 位运算符的使用
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3<<2 = 12 [322=12] |
>> | 右移 | 3>>1 = 1 [3/2 = 1] |
>>> | 无符号右移 | 3>>>1 = 1 [3/2 = 1] |
& | 与运算 | 6 & 3 = 2 |
| | 或运算 | 6 | 3 = 7 |
^ | 异或运算 | 6 ^ 3 = 5 |
~ | 取反运算 | ~6 = -7 |
:::info
<<运算符:对于正数负数都一样
num = 7;
num << 1 = 14;
num << 2 = 28;
num << 3 = 56; [7* 2^1 * 2^2 * 2^3]
>>运算符:对于正数负数都一样
[7/ (2^1) / (2^2) / (2^3)]
:::
企业真题
高效的方式计算2 * 8的值
:::info
2 << 3
:::
&和&&的区别
:::info
&和&&的区别
&和&&都是逻辑运算符号,但&&又叫短路运算符。
因为当第一个表达式的值为false的时候,则不会再计算第二个表达式;
而&则不管第一个表达式是否为真都会执行两个表达式。
另外&还可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示 按位操作
:::
Java中计算金额时使用什么数据类型
:::info
不能使用float或double
使用BigDecimal类替换,可以实现任意精度的数据的计算
:::
代码分析
short s1 = 1;
s1 = s1 + 1;// =右边是int类型,需要强转
short s2 = 1;
s2 += 1; // 没错
int i = 0; i = i++; i变量的值为
:::info
0;
:::
boolean占几个字节
:::info
编译时不谈占几个字节
JVM在给boolean类型分配内存空间时,boolean类型的变量占据一个槽位(slot,等于4个字节)。
在内存中:
byte/short/char/boolean/int/float:占用1个slot
double/long:占用2个slot
:::
为什么Java中0.1+0.2结果不是0.3
:::info
小数并不能做到每个小数都有对应的二进制数字
:::