天天看点

从JDK源码角度看Byte

Java的Byte类主要的作用就是对基本类型byte进行封装,提供了一些处理byte类型的方法,比如byte到String类型的转换方法或String类型到byte类型的转换方法,当然也包含与其他类型之间的转换方法。

主要实现代码如下:

<code>MIN_VALUE</code>静态变量表示byte能取的最小值,值为-128,被final修饰说明不可变;

类似的还有<code>MAX_VALUE</code>,表示byte的最大值为127。

<code>SIZE</code>用来表示于二进制补码形式的byte值的比特数,值为8,静态变量且不可变。

<code>BYTES</code>用来表示于二进制补码形式的byte值的字节数,值为1,静态变量且不可变。

由于是对byte的封装,所以必定要有一个变量来保存byte的值,即<code>value</code>,同样它也被final修饰说明不可变。

<code>TYPE</code>的toString的值是<code>byte</code>。

Class的<code>getPrimitiveClass</code>是一个native方法,在<code>Class.c</code>中有个<code>Java_java_lang_Class_getPrimitiveClass</code>方法与之对应,所以JVM层面会通过<code>JVM_FindPrimitiveClass</code>函数会根据”byte”字符串获得jclass,最终到Java层则为<code>Class&lt;Byte&gt;</code>。

当<code>TYPE</code>执行toString时,逻辑如下,则其实是<code>getName</code>函数决定其值,<code>getName</code>通过native方法<code>getName0</code>从JVM层获取名称,

<code>getName0</code>根据一个数组获得对应的名称,JVM根据Java层的Class可得到对应类型的数组下标,比如这里下标为8,则名称为”byte”。

两个parseByte方法,主要看第一个即可,第一个参数是待转换的字符串,第二个参数表示进制数,这里的转换其实是调了Integer的parseInt方法,返回值再判断是不是在byte的最小值和最大值之间。怎么更好理解这个参数呢?举个例子,<code>Byte.parseByte("100",10)</code>表示十进制的100,所以值为100,而<code>Byte.parseByte("100",2)</code>表示二进制的100,所以值为4。另外如果<code>Byte.parseByte("1000",10)</code>会抛出<code>java.lang.NumberFormatException</code>异常。

包含两种构造函数,分别可以传入byte和String类型。它是通过调用parseByte方法进行转换的,所以转换逻辑与上面的parseByte方法一样。

一个是静态方法一个是非静态方法,但两个方法转换的效果是一样的,都是以十进制形式转换。

ByteCache是Byte的一个内部类,它其实就是一个包含了byte所有可能值的Byte数组,对于byte来说其实它的可能值就是从-128到127,一共256个,所以我们只需要实例化256个Byte对象就可以表示所有可能的byte。而且这些都是静态且final的,避免重复的实例化和回收。

有三个valueOf方法,主要看下面这个,因为ByteCache包含了所有byte可能值的Byte对象,直接从ByteCache的数组中获取对应的Byte对象即可。

decode方法主要作用是解码字符串转成Byte型,比如<code>Byte.decode("11")</code>的结果为11,而<code>Byte.decode("0x11")</code>结果为17,因为后面的是十六进制,它会根据实际情况进行解码。

包括shortValue、intValue、longValue、floatValue和doubleValue等方法,其实就是转换成对应的类型。

hashCode方法很简单,就是直接返回int类型的值。

比较是否相同时先判断是不是Byte类型再比较值。

通过相减来比较,大于0则说明x大于y。

包括转成无符号int型和无符号long型。

以下是广告和相关阅读

========广告时间========

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74080321">为什么写《Tomcat内核设计剖析》</a>

=========================

相关阅读:

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/73743876">从JDK源码角度看Object</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/72933108">谈谈Java基础数据类型</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51455094">从JDK源码角度看并发锁的优化</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51468764">从JDK源码角度看线程的阻塞和唤醒</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51433204">从JDK源码角度看并发竞争的超时</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51397266">从JDK源码角度看java并发线程的中断</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51371416">从JDK源码角度看Java并发的公平性</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/51360228">从JDK源码角度看java并发的原子性如何保证</a>

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/73350488">从JDK源码角度看Boolean</a>

欢迎关注:

从JDK源码角度看Byte