美文网首页Java
Java基础进阶(二)

Java基础进阶(二)

作者: Agera丶K | 来源:发表于2019-02-12 21:54 被阅读0次

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: 面向无连接,传输效率相对较高。不关心对方是否连接,是否存在, 只管发送数据(比如发短信,可以给一个不存在的号码发送信息)。 缺点:容易丢包。

相关文章

网友评论

    本文标题:Java基础进阶(二)

    本文链接:https://www.haomeiwen.com/subject/kaqleqtx.html