1.数据类型转换
在混合运算中 byte、short、char 之间不会相互转换,会自动转为int类型去运算。
其他类型的运算: 范围小的数据类型 会 自动转为 大的数据类型去运算。
byte、short、char ->int
iint -> long ->float ->double
2.强制转换超出类型的取值范围时 会出现不正确的结果
byte b = 125
byte c = (byte)(b + 30) (此处必须强转,否则编译不过,因为超出了byte取值范围)
c=?
byte: 一个字节,即8个bit,即8个二进制组成,它的取值范围: -127 ~ +128。
c = 125 + 30 = 155 已经超出了 byte的取值范围。
前面我们说过 byte会自动转为int去运算, int为4个字节,即32个二进制。
byte c = b +30 运算时: b会转为int 和 30相加,结果是int类型, 然后强转成int,运算过程如下:
b +30 = 155 为 int类型, 二进制如下
0000 0000 0000 0000 0000 0000 1001 1011 (int为4个字节,前面补0)
因为 byte是1个字节的,所以强转时 会去掉 前面的 32-8=24位, 结果为:1001 1001
1001 1001 明显是一个负数(最高位符号位是1 表明这是一个负数),因为是补码(运算过程中都是用补码),我们要将它变为原码 求结果。(要计算原码,必须先求反码)
补码: 1001 1001
反码: 1001 1000 (补码-1 即为反码)
原码: 1110 0111 (反码符号位不变,其余为取反 即为原码)
所以c最终输出的结果为: -(2^6 + 2^5 + 2^2 + 2^1 + 2^0) = -101
3.赋值中的强制转换
① byte a = 5;
a = a + 1;
② byte b = 5;
b += 1;
结果: ① 编译失败, ② 正确。
如我们之前所说: byte和int运算时,会自动提升为int去运算。
在① 中: a +1 结果为int类型,4个字节, 却赋值给一个 byte类型,就会出现精度缺失的错误,所以无法通过编译。
② 中: += 其实是做了个 强制转换, 可以看成是: b+=1 即为: b = (byte)(b+1) 所以正确。(当然这是在结果没有超出byte取值范围的基础上)
4.HashMap 和 HashTable 区别
HashMap: 线程不安全,所以效率高(因为不用考虑 在并发中 利用 锁去保证操作的原子化)。
并且可以存储 null键 和 null值。
HashTable: 线程安全,所以效率相对低。
不能存储 null键 ,也不能存贮null值。
5.TCP/IP 和 UDP 区别
TCP/IP : 面向连接,三次握手,通过ip和端口 传输数据,效率相对较慢。(因为必须确保连接上才行)
UDP: 面向无连接,传输效率相对较高。不关心对方是否连接,是否存在, 只管发送数据(比如发短信,可以给一个不存在的号码发送信息)。 缺点:容易丢包。
网友评论