包装类&数学类&位运算
1 包装类
把基本数据类型包装成引用数据类型
byte | short | int | long | float | double | char | boolean | void |
---|---|---|---|---|---|---|---|---|
Byte | Short | Integer | Long | Float | Double | Character | Boolean | Void |
- Void
Void类构造方法是私有的,所以不能创建对象。并且Void是一个最终类,没有子类。
public static Void demo1(){
return null;
}
- 数值类型(Byte Short Integer Long Float Double)
Number是数值类型共同的父类
自动装箱:自动把基本数据类型转换成引用数据类型,是jdk5的特性。底层调用对应类型的valueOf方法
Byte 在-128到127范围内,返回同一个对象
Short/Integer/Long 在-128 到127范围内,返回同一个对象。超出范围返回新的对象
Float/Double 永远返回新的对象
Character 在0-127范围内返回同一个对象,超出范围返回新对象
Boolean就返回两个对象。
- 自动装箱
// 基本数据类型
int i = 10;
// 装箱:利用基本数据类型的变量来构建了对应的引用数据类型的对象
// Integer integer = new Integer(i);
// jdk5特性:自动装箱 自动把基本数据类型包装成引用数据类型
// 自动装箱底层自动调用对应类身上的valueOf方法
Integer integer = 10;
System.out.println(integer);
Double d = 3.14;
Character c = 'a';
Integer in1 = 98;
Integer in2 = 98;
System.out.println(in1 == in2);
- 自动拆箱
// 拆箱:将引用数据类型的对象转换成基本数据类型
// 自动拆箱:自动调用xxxValue()方法将引用数据类型转换成基本数据类型
// int a = in.intValue();
int a = in;
Double dou = 3.14;
// dou.doubleValue();
char c1 = c;
// 当引用数据类型的包装类和对应的基本数据类型进行运算时会自动拆箱
if (in1 > 100){
}
- 把字符串转换成对应的基本数据类型
// 把字符串转换成对应的基本数据类型 parseXxx("")
double v = Double.parseDouble("3.14");
int i1 = Integer.parseInt("2");
// Byte.parseByte("");
// Short.parseShort("")
// Long.parseLong("")
// Float.parseFloat("")
System.out.println(Boolean.parseBoolean("True"));
- 包装类的哈希值
包装类产生的对象的哈希码是固定不变的
null的哈希码规定是0
oct 八进制
bin 二进制
hex 十六进制
// NaN not a number 非数字
double d1= 0.0 / 0;
double d2= 0.0 / 0;
System.out.println(d1 == d2);
// 判断是否是非数字
System.out.println(Double.isNaN(d1));
// 将十进制转换成十六进制
String s = Integer.toHexString(15);
// 将十进制转换成二进制
String s1 = Integer.toBinaryString(3);
// 将十进制转换成八进制
String s2 = Integer.toOctalString(8);
System.out.println(s2);
System.out.println(s1);
System.out.println(s);
2 数学类
- Math
// 自然指数
System.out.println(Math.E);
// 圆周率
System.out.println(Math.PI);
// 求绝对值
System.out.println(Math.abs(-3));
// 求立方根
System.out.println(Math.cbrt(27));
// 向上取整
System.out.println(Math.ceil(-3.4));
// 向下取整
System.out.println(Math.floor(-3.7));
// 四舍五入
System.out.println(Math.round(3.57));
// 最大值
System.out.println(Math.max(10,20));
// 最小值
System.out.println(Math.min(10,20));
// 加权函数 a的b次方
System.out.println(Math.pow(2,10));
// 随机数 [0,1)
System.out.println(Math.random());
// 平方根
System.out.println(Math.sqrt(16));
- BigDecimal 用于精确计算的类。
需要精确计算时,要求参数以字符串形式传递,底层使用按位运算
public static void main(String[] args) {
// double d1 = 3.0;
// double d2 = 2.99;
// System.out.println(d1 - d2);
BigDecimal bigDecimal1 = new BigDecimal("3.0");
BigDecimal bigDecimal2 = new BigDecimal("1.5");
// 加法
System.out.println(bigDecimal1.add(bigDecimal2));
// 减法
System.out.println(bigDecimal1.subtract(bigDecimal2));
// 乘法
System.out.println(bigDecimal1.multiply(bigDecimal2));
// 除法
System.out.println(bigDecimal1.divide(bigDecimal2));
}
- BigInteger 用于存储和计算非常大的整数。
// 大十进制 大量数字的存储和计算
BigInteger bigInteger1 = new BigInteger("67555558");
BigInteger bigInteger2 = new BigInteger("675555586358");
System.out.println(bigInteger1.multiply(bigInteger2));
- DecimalFormat 数字格式化
double d = 100.09 * 0.85;
System.out.println(d);
// 创建对象并且指定数据显示格式
// 用0代表占位,表示一位数字。如果没有数字,用0代替
// DecimalFormat decimalFormat = new DecimalFormat("00.00");
// # 代表占位,表示一位数字。如果这一位没有数字,那么就不填充
// 0.#0 明显不符合常识,不能使用
// DecimalFormat decimalFormat = new DecimalFormat("#0.00");
// 科学计数法
DecimalFormat decimalFormat = new DecimalFormat("0.000E0");
System.out.println(decimalFormat.format(d));
3 位运算
3.1 进制
二进制: 0 - 1,满二进一 以0B开头作为标识 0b0101 0b0110
int i = 0b00100;
System.out.println(i);
八进制: 0 - 7 满八进一 07 015 以0开头作为标识
十进制:0 - 9 满十进一
十六进制: 0 -9 a - f 满15进1 以0x开头作为标识
-
进制的相互转换
-
十进制转二进制:
- 不断除以2,取余数,把余数倒排
-
二进制转十进制
- 从低位次 起,按位次乘以2的位次次幂,然后求和
1101 = 1 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 + 1 * 2 ^ 3 = 1 + 0 + 4 + 8 = 13
-
十进制向哪个进制转换,就除以哪个进制,然后余数倒排
-
二进制转八进制
- 从低位次 起,每三位看作一组,产生一个八进制数字。最高位不足三位,补0.三位以内,按照二进制向十进制的转换规则进行运算,产生的八进制数字按顺序排序
010 111 011 = 0273
-
八进制转二进制
- 每一位八进制转换成三位二进制的数字,然后按顺序排列
273 = 10 111 011
-
二进制转十六进制:四变一的过程
-
111 1110 1101 = 0x7ed
-
-
十六进制转二进制:一变四的过程
3.2 原码反码和补码
所有的数据在底层都是二进制数据的补码形式存储的
正数的原码反码和补码都一致
3.3 位运算
位运算使用的前提是要把数据转成二进制数据的补码形式进行运算。运算效率更高。
- 按位与 : & 两个位都是1,结果是1,否则结果就是0
- 任意一个数 & 一个偶数,结果一定是偶数
- 任意一个数 & 1,如果结果是0,就是一个偶数
- 按位或: | 两个位只要有一个是1,那么结果就是1,否则就是0
- 任意一个数 | 一个奇数,结果一定是奇数
- 任意一个数 | 0 ,结果还是本身
- 按位异或: ^ 两个位相同是0,不同是1
- 任何数异或自身结果是0,异或0就是自身
int a = 10;
int b = 20;
// int temp = a;
// a = b;
// b = temp;
// a = a ^ b;
// b = a ^ b;// a ^ b ^ b = a
// a = a ^ b;// a ^ b ^ a = b
a = b - a;
b = b - a;// b - (b - a) = a
a = b + a;// a + b - a = b
System.out.println(a);
System.out.println(b);
- 左移: << 左边丢弃,右边补0 左移n位就是乘以2的n次方
3 << 2
0000 0011
00 001100
12
- 右移: >> 右边丢弃,左边补位(正数补0,负数补1) 右移n位就是除以2的n次方
5 >> 2
00000101
00000001
1
课堂练习: -6 >> 2
原码: 10000110
反码: 11111001
补码; 11111010
右移之后的补码: 11111110
反码: 11111101
原码: 10000010
-
>>> 无符号右移 : 和右移类似 但是最高位一律补0
-
~ 取反
-
将数字转换成二进制后,1变0,0变1.最高位按照-128,其他位按照二进制转十进制的规则计算,然后加上-128
-
~3 = -4 0000 0011 1111 1100 -128 + 64 + 32 + 16 + 8 + 4 = - 4
-
~i = -i - 1;
-