博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
包装类解析
阅读量:5172 次
发布时间:2019-06-13

本文共 2483 字,大约阅读时间需要 8 分钟。

参考自《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的包装类,有点复杂现在懒得看,以后看吧

转载于:https://www.cnblogs.com/lollong/p/10659661.html

你可能感兴趣的文章
特定字符序列的判断(1028)
查看>>
华为面试
查看>>
平衡二叉树(AVL Tree)
查看>>
【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
查看>>
【CF799E】Aquarium decoration 线段树
查看>>
大运飞天 鲲鹏展翅
查看>>
从ECMA到W3C
查看>>
软件工程--第十六周学习进度
查看>>
yii2 ActiveRecord多表关联以及多表关联搜索的实现
查看>>
搜狗输入法安装--ubuntu
查看>>
ps/2接口键盘的输入及显示
查看>>
Swift———a Glance(极客学院)笔记
查看>>
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>
c# for 和 foreach 的区别
查看>>
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>