1. JDK、JRE、JVM之间的关系
JDK(JavaDevelopmentKit):Java开发工具集
JRE(JavaRuntimeEnvironment):Java运行环境
JVM(JavaVirtualMachine):Java虚拟机
我们想要运行一个已有的Java程序,那么只需安装JRE
即可。
我们想要开发一个全新的Java程序,那么必须安装JDK
,其内部包含JRE
。
2. 基本语法
2.1数据类型
基本数据类型:四类八种
是否加 l/L以及F
- long类型的值,可以加 l/L 也可以不加
long x1 = 2147483647; // 如果数字没有超出 int的范围,l/L可以不加
long x2 = 2147483648L; // 如果数字超出了 int的范围,l/L必须要加
- float类型的浮点数,后面要加 f/F
浮点数有两个类型 float/double, 默认是 double
计算机存储单位:
- 位(bit): 数据存储的最小单位
- 字节(Byte):计算机的基本存储单位(是计算机信息技术用于计量存储容量的一种计量单位 )
- 1 Byte = 8 bit
2.2 各数据类型的取值范围:
进制之间的转换:
/*
不同进制数字的表示方式
java里可以表示 二进制 / 八进制 / 十进制 以及 十六进制
System.out.println() 如果打印的是数字,都是以 十进制 的形式输出
*/
class IntDemo2 {
public static void main(String[] args) {
int a = 17; // 如果没有特殊说明,数字默认都是十进制
System.out.println(a);
int b = 0b10101010; // 以0b/0B开头的数字是二进制
System.out.println(b); // 170
int c = 045; // 以 0 开头的数字是 八进制
System.out.println(c); // 37
int d = 0xA; // 以 0x开头的数字是 十六进制
System.out.println(d); // 10
}
}
2.3 基本数据类型转换
byte / short / char 之间做运算,得到的结果是int类型.
// 强制类型转换
int i4 = 18;
byte x1 = (byte)i4; // 强制将 int类型的i4转换称为byte类型的x1
System.out.println(x1); // 18 把int强制转换称为byte以后,精度没有丢失
int i5 = 138; // i5的二进制表示形式 00000000 00000000 00000000 10001010
byte x2 = (byte)i5; // 10001010
System.out.println(x2); // -118 int强制转换称为byte以后,精度丢失了
int i6 = 259; // i6的二进制表示形式 00000000 00000000 00000001 00000011
byte x3 = (byte)i6; // 00000011
System.out.println(x3); // 3
int i7 = 10;
int i8 = 3;
System.out.println(i7 / i8); // 3
// 范围大的数据和范围小的数据做运算,得到的结果是范围大的
System.out.println( ((double)i7) / i8);
int i9 = 123456786;
System.out.println((float)i9);
3.运算符
- 按照功能分:
算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符...
- 按照操作数个数分:
-
一元运算符:操作数只有一个,例如:正号(+a),负号(-a),自增(++a,a++),自减(--a,a--),逻辑取反(!true)等
-
二元运算符:操作数有两个,例如:加(a+b),减(a-b),乘(a*b)等
-
三元运算符:条件 ? 结果1 : 结果2
-
自增(减)运算符:
相同点: 无论是前自增还是后自增,a的值都会加1
前自增运算符 ++a 先自增,后赋值
后自增运算符 a++ 先赋值,后自增
3.1 位运算符
位运算符 | 运算规则 |
---|---|
& | 按位与,同为1则为1,否则为0 |
| | 按位或,只要有一个为1则为1,否则为0 |
~ | 按位取反,将操作数的每个位(包括符号位)全部取反 |
^ | 按位异或,相同时返回0,不同时返回1 |
<< | 左移运算符 |
>> | 右移运算符 |
>>> | 无符号右移运算符 |
位运算符:用于数字的
如何区分&,|,^是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。
按位取反: 0变成1,1变成0 ~a 的结果是 -(a + 1)
左移运算: m << n 结果是 m 乘以 2 的 n 次方
右移运算: m >> n 结果是 m 除以 2 的 n 次方
无符号右移: m >>> n 对于正数来说,右移和无符号右移结果是一样的
负数的无符号右移
System.out.println(~4); // 按位取反-5
System.out.println(3 << 2); // 12 3*2^2
// 正数的 >> 和 >>> 效果是一样的
System.out.println(46 >> 3); // 5 46/(2^2)
System.out.println(46 >>> 3); // 5
// 对于负数来说,无符号右移左边会使用 0 来补齐
System.out.println(-46 >> 3); // -6
System.out.println(-46 >>> 3); // 536870906
3.1.1 左移
运算规则:左移几位就相当于乘以2的几次方
注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
3<<4 类似于 3*2的4次= 3*16 = 48
-3<<4 类似于 -3*2的4次= -3*16 = -48
3.1.2 右移
快速运算:类似于除以2的n次,如果不能整除,向下取整
69>>4 类似于 69/2的4次 = 69/16 =4
-69>>4 类似于 -69/2的4次 = -69/16 = -5
3.1.3 无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不看符号位
正数:和右移一样
负数:右边移出去几位,左边补几个0,结果变为正数
69>>>4 类似于 69/2的4次 = 69/16 =4
-69>>>4 结果:268435451
3.1.4 按位与:&
运算规则:对应位都是1才为1
1 & 1 结果为1
1 & 0 结果为0
0 & 1 结果为0
0 & 0 结果为0
9&7 = 1
-9&7 = 7
3.1.5 按位或:|
运算规则:对应位只要有1即为1
1 | 1 结果为1
1 | 0 结果为1
0 | 1 结果为1
0 & 0 结果为0
9|7 结果: 15
-9|7 结果: -9
3.1.6 按位异或:^
运算规则:对应位一个为1一个为0,才为1
1 ^ 1 结果为0
1 ^ 0 结果为1
0 ^ 1 结果为1
0 ^ 0 结果为0
9^7 结果为14
-9^7 结果为-16
3.1.7 按位取反
运算规则:
~0就是1
~1就是0
~9 结果:-10
~-9 结果:8
案例:
人类能够感知到的颜色几乎都是由红绿蓝(RGB)三种颜色调和而成的,在计算机里使用 [0,255] 的十六进制来表示颜色。例如 0xFF0000,0x00FF00,0x0000FF分别表示纯红,纯绿和纯蓝色。
思考: 已知颜色 int color = 0xEFAC3D; 使用代码分别获取代码里的RGB值。
class OperatorTest2 {
public static void main(String[] args) {
int color = 0xEFAC3D;
// 通过算法从 color 里得到 RGB 的值
int red = color >> 16;
// int green = (color >> 8) & 0xFF;
int green = (color & 0xFF00) >> 8;
int blue = color & 0xFF;
System.out.println("red = " + red + ",green = " + green + ",blue = " + blue);
}
}