进制-运算-数据类型
常量的概念及使用(掌握)
- 常量:在程序执行的过程中其值不可以发生改变
- 使用
-
system.out.println("abc"); //字符串常量 system.out.println(123); //整数常量 system.out.println(12.3); //小数常量 system.out.println('1'); //字符常量:用单引号括起来的内容,里面只能放单个数字、单个字母、或单个符号(可以放单个空格) System.out.println(true); //布尔常量:较为特殊,只有true和false
变量的概念(掌握)
- 变量:在程序执行的过程中,在某个范围内其值可以发生改变的量
Java语言基础(数据类型的概述和分类)(掌握)
- A:为什么有数据类型
- Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间
- B:Java中数据类型的分类
- 基本数据类型
- 引用数据类型
- C:基本数据类型分类(4类8种) (掌握)
- 整数型
- byte 占一个字节 -128到127
- short 占两个字 -215~215-1
- int 占四个字节 -231~231-1
- long 占八个字节 -263~263-1
- 浮点型
- float 占四个字节 -3.403E38~3.403E38 单精度 (注意:如果赋值的为小数,后面必须加f或F)
- double 占八个字节-1.798E308~1.798E308 双精度 (小数默认的数据类型就是double,所以后面可以不用加d或D)
- 注意: 实际上float取值范围比long的要大(可用转换验证)
- 字符型
- char 占两个字节 0~65535
- 布尔型
- boolean
- boolean理论上是占八分之一个字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定他的大小
- boolean理论上是占八分之一个字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定他的大小
- boolean
- 整数型
进制概述(掌握)
- 单位转换:
- 1 byte = 8 bit
- 1 k = 1024 b
- 1 M = 1024 k
- 1 G = 1024 M
- 1 T = 1024 G
- 数据表现形式:
- A:二进制:
- 由0,1组成。以0b或0B开头
- B:八进制:
- 由0,1,…7组成。以0开头
- C:十进制:
- 由0,1,…9组成。整数默认是十进制的
- D:十六进制:
- 由0,1,…9,a,b,c,d,e,f(大小写均可)。以0x开头
- A:二进制:
- 数据转换方法:
- 二进制转十进制:0b100 = 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0 = 4
- 八进制转十进制:0100 = 1 * 8 ^ 2 + 0 * 8 ^ 1 + 0 * 8 ^ 0 = 64
- 十六进制转十进制:0x100 = 1 * 16 ^ 2 + 0 * 16 ^ 1 + 0 * 16 ^ 0 = 256
进制转换问题(掌握)
- 小转大,自动提升,即隐式转换
- 大转小,加转换符,即强式转换 int = (int)(12.3 + 11.0)
char字符问题(了解)
char c = 'a';
System.out.println(c); //输出结果:97
char c1 = 100;
System.out.println(c1); //输出结果:a
char c3 = '中';
System.out.println(c3); //输出结果:中
/* Java语言中的字符char可以存储一个中文汉字的原因:
因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。
中文也是占的两个字节,所以,Java中的字符可以存储一个中文汉字。
*/
运算问题(掌握)
- 10/3 -------------整数相除结果只能是整数
- 10/3.0 ------------ 如果想得到小数,把其中一个数变成小数,另一个数在运算的时候回自动类型提升
符号问题
符号 | 名称 | 理解 | 运用 | 结果 |
---|---|---|---|---|
& | 逻辑与 | 并且(and) | a&b | true、false |
true & true = true
true & false = false
false & true = false
false & false = false
遇false则false(遇佛则佛)
符号 | 名称 | 理解 | 运用 | 结果 |
---|---|---|---|---|
| | 逻辑或 | 或(or) | a|b | true、false |
true & true = true
true & false = true
false & true = true
false & false = false
遇true则true
^ 逻辑异或
true & true = false
true & false = true
false & true = true
false & false = false
相同为false,不同为true
! 逻辑非
&&(短路与)与&的区别:
1、最终结果都是一样的
2、&&具有短路的效果。左边是false,右边就不执行
例如:
int x = 3;
int y = 4;
System.out.println((++x == 3) & (++y == 4)); //false & false = false
System.out.println("x = " + x); //x = 4
System.out.println("y = " + y); //y = 5
System.out.println((++x == 3) && (++y == 4)); //false & false = false
System.out.println("x = " + x); //x = 4
System.out.println("y = " + y); //y = 4
||与|的区别:
1、最终的效果都是一样的
2、||具有短路的效果,左边为true,右边不执行
System.out.println(6 & 3); //结果为2
解析:&运算规则:有0则0
110 6的二进制
& 011 3的二进制
-----------
010
System.out.println(6 | 3); //结果为7
解析:|运算规则:有1则1
110 6的二进制
| 011 3的二进制
-----------
111
System.out.println(6 ^ 3); //结果为5
解析:^运算规则:相同为0,不同为1
110 6的二进制
^ 011 3的二进制
-----------
101
特点:一个数据对另一个数据异或两次,该数据本身不变
System.out.println(5 ^ 2 ^ 5); //结果为2
System.out.println(5 ^ 2 ^ 5 ^ 5 ^ 5); //结果为2
面试题:在不使用第三方变量的前提下,交换两个数据
解析: int x = 10;
int y = 5;
x = x ^ y; // 10 ^ 5
y = x ^ y; // 10 ^ 5 ^ 5 , y = 10
x = x ^ y; // 10 ^ 5 ^ 10 , x = 5
System.out.println("x = " + x + ", y = " + y);
System.out.println(~6); //结果为-7
解析:~运算规则:按位取反
0000000 00000000 00000000 00000110 6的原码(补码是其本身)
1111111 11111111 11111111 11111001 对6取反
1000000 00000000 00000000 00000111 结果为-7(原码)
<<:左移 左边最高位丢弃,右边补0
举例://左移,向左移动几位就是乘以2的几次幂
System.out.println(12 << 1); // 24
System.out.println(12 << 2); // 48
过程:0000000 00000000 00000000 00001100 12的补码
(0)000000 00000000 00000000 000011000 24的补码
(00)00000 00000000 00000000 0000110000 48的补码
面试题:最有效率算出2*8的结果
System.out.println(2 << 3);
>>:右移 最高位是0,左边补0;最高位是1,左边补1
举例://右移,向右移动几位就是除以2的几次幂
System.out.println(12 >> 1); // 6
System.out.println(12 >> 2); // 3
过程:0000000 00000000 00000000 00001100 12的补码
00000000 00000000 00000000 0000110(0) 6的补码
000000000 00000000 00000000 000011(00) 3的补码
>>>:无符号右移 无论最高位是0还是1,左边补0
面试题
-
面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
byte b1 = 3; byte b2 = 4; byte b3 = b1 + b2; /* 从两方面 b1和b2是两个变量,变量里面存储的值都是变化的,所以在程序运行中JVM是无法判断里面具体的值 byte类型(或short,char)的变量在进行运算的时候,会自动类型提升为int类型,相加或的结果也是int类型 */ byte b4 = 3 + 4; /* 3和4都是常量,java有常量优化机制,就是在编译的的时候直接把3和4的结果赋值给b4了*/
-
判断输出结果
System.out.println("5 + 5 = " + 5 + 5 ); //输出结果为 5 + 5 = 55 System.out.println("5 + 5 = " + (5 + 5)); //输出结果为 5 + 5 = 10
-
判断语句报错
byte b = 10; b++; //结果为:11 ++运算符会在底层自动补全强制转换符 b = (byte)(b + 1) b = b + 1; //当byte与int进行混合运算时,会提升为int类型,两个int相加仍然为int System.out.println(b);
-
判断语句报错
short s = 1; s = s + 1; //结果报错。当short与int进行与运算时,会自动提升为int类型,结果也是int类型。 short s = 1; s += 1; //结果不报错。运行时,底层自动补全并运行s = (short)(s + 1)