美文网首页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