网站首页 > java教程 正文
台上一分钟,台下十年功
每当看到资深工程师写代码或是分享自己的心得的时候,内心无比仰慕,惊叹大牛们为什么能把技术研究的如此之透彻。就好比,电视剧电影里,我们见过太多了武林高手一出场,那必定是能放出大招扭转乾坤,让人振奋不已。
但是坐下来静静想想,各个行业各路精英的每一次光彩绽放,背后应该都是有大量的练习和思考,这个过程并不那么光芒万丈,甚至还有些枯燥。
同样,如果想在Java这条路上封神,且不说封神,起码让自己对底层实现了解更加透彻,也是需要花费大量时间,下面就对今天看的内容做一个总结。主要看了java基本类库下的java.lang.Byte。
Byte
继承关系
可以看出,Byte继承了Number类,实现了Comparable接口
成员和方法:
Byte的取值范围从-128~127,为什么是这个区间,这是Java的基础。
小补充
概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。
正数补码为其本身;
负数补码为其绝对值各位取反加1;
例如:
+21,其二进制表示形式是00010101,则其补码同样为00010101
-21,按照概念其绝对值为00010101,各位取反为11101010,再加1为11101011,即-21的二进制表示形式为11101011
步骤:
byte为一字节8位,最高位是符号位,即最大值是01111111,因正数的补码是其本身,即此正数为01111111
十进制表示形式为127最大正数是01111111,那么最小负是10000000(最大的负数是11111111,即-1)
10000000是最小负数的补码表示形式,我们把补码计算步骤倒过来就即可。10000000减1得01111111然后取反10000000
因为负数的补码是其绝对值取反,即10000000为最小负数的绝对值,而10000000的十进制表示是128,所以最小负数是-128由此可以得出byte的取值范围是-128到+127
toString方法
public static String toString(byte b) { return Integer.toString((int)b, 10); }
该方法返回String类型的对象。默认将byte类型的参数强转为int类型,在10进制下的String类型的对象。
内部静态类ByteCache
private static class ByteCache { private ByteCache(){} static final Byte cache[] = new Byte[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Byte((byte)(i - 128)); } }
这个很有意思,这是将Byte的最小最大取值都装进一个Byte类型的缓存数组。
静态初始化代码块在第一次类被加载的时候执行,可以看到通过遍历cache的长度,分别将-128到127共256个长度的数值塞入数组
这个数组只会创建一次,后面每次使用都不用创建这个数组,这样做更加节省内存。
这个ByteCache是如何调用的。下面我们看看valueOf方法valueOf方法
public static Byte valueOf(byte b) { final int offset = 128; return ByteCache.cache[(int)b + offset]; }
该方法主要是返回一个byte类型对应的包装类型。
写一个测试方法,看看valueOf方法是如何使用巧妙使用ByteCache的private static void testByte() { System.out.println(Byte.toString(Byte.MAX_VALUE)); byte byteA = 1; byte byteB = 2; byte byteC = (byte)(byteA + byteB); System.out.println(Byte.valueOf(byteC)); }
通过调试我们可以发现
程序运行到Byte.valueOf方法后,内部就会调用ByteCache类的cache方法
进入ByteCache类,会初始化一个 static final类型的cache数组
在静态代码块中,为数组赋值
当cache数组赋值完成,这时候我们看到数组大概张这样
测试代码传入的参数是3,这时候在valueOf方法中会加入一个偏移量,因为cache数组是从0开始的,要想数组的下标和数组的值保持一致,需要加上偏移量128,[(int)b + offset]正好是131,而缓存数组cache[131]的值正好是3,所以返回Byte类型的3.
小补充:这里为什么使用[(int)b + offset]而不是[b + offset]
因为在Java中的byte,short,char进行计算时都会提升为int类型,所以这里需要强转为int类型。
如果你写下面一段代码是不能编译通过的byte a = 1; byte b = 2; byte c= a + b;
这里写成这样就可以通过编译byte c = (byte)(a + b);(a + b)在相加的时候会自动提升为int,需要强转为byte再赋值给c。
parseByte方法
与Integer中的valueOf和parseInt存在调用关系不同,Byte中的valueOf并没有调用parseByte方法,而是直接使用了缓存数组。
parseByte就是将String类型的字符转为byte基本类型,注意这里没有转为包装类型Byte。byteValue intValue longValue shortValue floatValue doubleValue
作为一个byte返回该byte的值。这些方法都是继承自Number类。进入Number类,我们发现这里并没有booleanValue,charValue。
因为进入Boolean和Character我们发现,这两个包装类都没有继承自Number。
猜你喜欢
- 2024-10-28 如何从100亿数据快速找到目标?--红黑树
- 2024-10-28 《Java语言程序设计》测试题及参考答案(第4部分)
- 2024-10-28 LeetCode 力扣官方题解 | 2013. 检测正方形
- 2024-10-28 全网把Map中的hash()分析的最透彻的文章,别无二家
- 2024-10-28 对一致性Hash算法,Java代码实现的深入研究
- 2024-10-28 我去,脸皮厚啊,你竟然使用==比较浮点数?
- 2024-10-28 Java中::这个符号是干嘛的(java /符号)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)