包装类解析

参考自《java的编程逻辑》

1.自动装拆箱

       每个包装类都有静态方法ValueOf()可以输入一个基本数据类型返回一个对应的包装类的对象引用,而每个对象也有对应的实例方法xxxValue()来取得对应的包装类对象的基本数据类型.

      

       2..ValueOf()与xxxValue()的实现细节

       通过new 关键之创建对象时,会把给的值用类中的Value变量保存,而xxxValue()就会返回这个value,ValueOf()则会先判断是否是在缓存范围内,如果在就从缓存数组中取出并返回这个值,如果没有再用new关键字实例化出一个对象.除了float与double没有缓存,其他的包装类都有缓存机制,所以建议用ValueOf()方法来创建对象而不是通过new直接创建.

       3.equals()详解

每个包装类都重写了Object的equals()方法,Object类的equals方法是直接通过==号来比较的,所以是比较地址,  就拿Integer类重写的equals来看,他会先判断是否是Integr类的对象,如果是就会调用这个对象的IntValue()方来获取他的Value值,再判断这两个value是否相同.

      

4.为什么小数计算不准确

因为小数点后的数转换为二进制是通过先乘二如果整数位出现数字则把这个整数转换为二进制,然后再把乘二后的数再乘二直到小数部分没有为止,但这个可能是无限循环的,所以只可以截取部分,这也即是误差产生的地方.        然后就是float的存储格式,第一位是符号位,第二位是指数的符号位,接着7位是指数部分,再后面是底数部分.      Float的最大值比int大是因为flaot是用指数加底数表示的,最大就是底数扩大2^127次方的值,也就是小数点右移127位,不过这个最大数显然是整数的,也就是最多只有22个小数位,整数越多,小数位就越少。

       5.Float的floatToIntBits作用

其实就是把float的二进制表现形式直接用int读取方式读取并展示,而不是用float的方式读取这些二进制数据

6.HashCode

每个包装类都重写了HashCode方法来判断两个包装类对象是否相同

具体的方式有点看不懂

7.每个包装类都实现了Comparable接口

              Float比较的就是float值的大小

       8.parseFloat(String s)

              把一个字符串格式的转换为基本数据类型

       9.toString()

              返回基本数据类型的字符串表示形式,与parseFloat(String s)刚好是一对

       10.Integer.toBiararyStirng()

              可以以二进制格式输出,还有其他的格式自己尝试

       11.Number类

              intValue,floatValue,DoubleValue,byteValue,shortValue,longValue

      这些子类实现的父类的方法可以把当前类型转换为上述几种类型,很方便.

       12.Integer类对二进制的操作

              Reverse(),把整数当作二进制按位左右翻转

              ReverseBytes()把整数当作二进制按字节左右翻转

              00010010001101000101011001111000原数据

        00011110011010100010110001001000按位翻转

              01001000001011000110101000011110按字节翻转

ReversejBits实现

305419896

00010010001101000101011001111000

                     ((i >>> 24))  |  ((i >>8) & 0xFF00)  |  ((i << 8) & 0xFF0000) | ((i << 24))

i>>>24 => 10010

i>>8  100100011010001010110 1111111100000000=>11010001000000

i<<8  1101000101011001111000  110100  =>  110100

i<<24 01111000 

这样组合起来就是字节移动了

Reversej的实现

       不好意思看不下去了,以后再研究吧

       13.循环移位

              Integer.roateLeft(),顾名思义,如果向左移位,那么溢出的位会补在右边的空位上,

              具体实现:

                     (i << distance) | (i >>> -distance)

                     1234<< 2

00000000 00000000 00000000 00001100 << 2  |  00000000 00000000 00000000 00001100 >>>-2

              其实移位不是>>这个符号后的直接数字,而是这个直接数字&11111后的结果,也就是说只取第位的值,因为多出就超过了31位了就没有意义了,

              00000000 00000000 00000000 00000100 &11111

              10000000 00000000 00000000 00000010原码

                 11111111 11111111 11111111 11111101反码

                 11111111 11111111 11111111 11111110补码

11111111 11111111 11111111 11111100 &00000000 00000000 00000000 00011111=00000000 00000000 00000000 00011110=30

所以1234>>>-2 == 1234>>>30

00000000 00000000 00000100 11010010 = 1234

00000000 00000000 00010011 01001000

所以(1234 << 4) | (1234 >>> -4) == 1234<<2=4936

好像有错,但我现在懒得改了

14. Char的包装类,有点复杂现在懒得看,以后看吧

猜你喜欢

转载自www.cnblogs.com/lollong/p/10659661.html