Short是基本数据类型short的包装类。

  1)声明部:

public final class Short extends Number implements Comparable<Short>

  extends Number,override methods:

public abstract int intValue();
public abstract float floatValue();
public abstract long longValue();
public abstract double doubleValue();
public byte byteValue() {
return (byte)intValue();
}
public short shortValue() {
return (short)intValue();
}

  implements Comparable<Short> :

public int compareTo(Short anotherShort) {
return compare(this.value, anotherShort.value);
}
public static int compare(short x, short y) {
return x - y;
}

  2)私有静态内部类

private static class ShortCache {
private ShortCache(){} static final Short cache[] = new Short[-(-128) + 127 + 1]; static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Short((short)(i - 128));
}
}

  Short类加载的时候,加载该内部类,内部类静态模块代码执行,初始化缓存对象数组。

  3)Short初始化方法:

  通过构造函数初始化,构造函数如下:

//构造函数方法重载
public Short(String s) throws NumberFormatException {
this.value = parseShort(s, 10);
}
//构造函数方法重载
public Short(short value) {
this.value = value;
}

  通过调用转换的方法,该系列方法如下:

public static short parseShort(String s, int radix)
throws NumberFormatException {
int i = Integer.parseInt(s, radix);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value out of range. Value:\"" + s + "\" Radix:" + radix);
return (short)i;
}
public static short parseShort(String s) throws NumberFormatException {
return parseShort(s, 10);
}
public static Short valueOf(String s, int radix)
throws NumberFormatException {
return valueOf(parseShort(s, radix));
}
public static Short valueOf(String s) throws NumberFormatException {
return valueOf(s, 10);
}
public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset];
}
return new Short(s);
}

  观察代码之间的调用关系。第一个方法返回short类型,第五个方法通过取缓存获得Short对象。

  初始化例子:

short  s_1 = 1;
String str_1 = "1";
Short s1 = new Short(str_1);
Short s2 = new Short(s_1);
Short s3 = s_1;
Short s4 = Short.parseShort(str_1);
Short s5 = Short.valueOf(str_1);
s1 == s2;//fasle
s1 == s3;//fasle
s2 == s3;//fasle
s4 == s3;//true
s5 == s3;//true

  结论:同Byte.class分析,short类型自动装箱会去获取缓存的对象(-128~127);使用构造函数初始化new,是一个新的对象,不从缓存里去获取对象。

  4)其他方法

//解码,将short范围内的二进制,八进制,十六进制转换为十进制
public static Short decode(String nm) throws NumberFormatException {
int i = Integer.decode(nm);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value " + i + " out of range from input " + nm);
return valueOf((short)i);
} public static String toString(short s) {
return Integer.toString((int)s, 10);
}
public String toString() {
return Integer.toString((int)value);
} @Override
public int hashCode() {
return Short.hashCode(value);
}
public static int hashCode(short value) {
return (int)value;
}
public boolean equals(Object obj) {
if (obj instanceof Short) {
return value == ((Short)obj).shortValue();
}
return false;
} public static int toUnsignedInt(short x) {
return ((int) x) & 0xffff;
}
public static long toUnsignedLong(short x) {
return ((long) x) & 0xffffL;
}
//Returns the value obtained by reversing the order of the bytes in the two's
//complement representation of the specified {@code short} value.
public static short reverseBytes(short i) {
return (short) (((i & 0xFF00) >> 8) | (i << 8));
}

  e.g:

short  s_1 = 1;
short s_2 = -1;
String str_2 = "0x21";
Short s6 = Short.decode(str_2);//33
Out.println(s6.toString());//33
Out.println(Short.toString(s6.shortValue()));//33
Out.println(s6.hashCode());//33
Out.println(Short.toUnsignedInt(s_1));//1
Out.println(Short.toUnsignedInt(s_2));//65535
Out.println(Short.toUnsignedLong(s_1));//1
Out.println(Short.toUnsignedLong(s_2));//65535
Out.println(s4.equals(s1));//true
//高位低位反转 正数
Short s7 = 2;
Short s8 = Short.reverseBytes(s7);
Out.println(s8);//512
//负数
short s_3 = (short)-0B000000000000011;//符号位直接使用符号替代,声明使用原码,运算时候使用补码,根据运算结果得出补码,再转为原码
short s_4 = (short)-0B000001000000001;
Out.println(s_4 == Short.reverseBytes(s_3));//true

  5)属性:

Out.println("MAX:" + Short.MAX_VALUE);
Out.println("MIN:" + Short.MIN_VALUE);
Out.println("BYTES:" + Short.BYTES);
Out.println("bit size:" + Short.SIZE);
Out.println("primitive type:" + Short.TYPE); MAX:32767
MIN:-32768
BYTES:2
bit size:16
primitive type:short

  

JDK源码分析:Short.java的更多相关文章

  1. 【jdk源码分析】java.lang.Appendable

    1.概述 public interface Appendable 能够被添加 char 序列和值的对象.如果某个类的实例打算接收取自 Formatter 的格式化输出,那么该类必须实现 Appenda ...

  2. 【jdk源码分析】java多线程开启的三种方式

    1.继承Thread类,新建一个当前类对象,并且运行其start()方法 package com.xiaostudy.thread; /** * @desc 第一种开启线程的方式 * @author ...

  3. JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue

    JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlocki ...

  4. JDK 源码分析(4)—— HashMap/LinkedHashMap/Hashtable

    JDK 源码分析(4)-- HashMap/LinkedHashMap/Hashtable HashMap HashMap采用的是哈希算法+链表冲突解决,table的大小永远为2次幂,因为在初始化的时 ...

  5. JDK源码分析(5)Vector

    JDK版本 Vector简介 /** * The {@code Vector} class implements a growable array of * objects. Like an arra ...

  6. JDK源码分析(2)LinkedList

    JDK版本 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 ...

  7. 【JDK】JDK源码分析-HashMap(1)

    概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是“链表法”,并且在 JDK 1.8 做了优 ...

  8. 【JDK】JDK源码分析-ArrayList

    概述 ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」. 我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变. ...

  9. 【JDK】JDK源码分析-AbstractQueuedSynchronizer(1)

    概述 前文「JDK源码分析-Lock&Condition」简要分析了 Lock 接口,它在 JDK 中的实现类主要是 ReentrantLock (可译为“重入锁”).ReentrantLoc ...

  10. 【JDK】JDK源码分析-ReentrantLock

    概述 在 JDK 1.5 以前,锁的实现只能用 synchronized 关键字:1.5 开始提供了 ReentrantLock,它是 API 层面的锁.先看下 ReentrantLock 的类签名以 ...

随机推荐

  1. 『ACM C++』 Codeforces | 1066B - Heaters

    今日不写日感,直接扔上今日兴趣点: 新研究称火星曾经有一个巨大的地下水系统 链接:https://mbd.baidu.com/newspage/data/landingsuper?context=%7 ...

  2. chromium之at_exit

    // This class provides a facility similar to the CRT atexit(), except that // we control when the ca ...

  3. ORACLE GOLDEN GATE oracle同步数据至kafka

    一.服务器信息 ip   软件版本 ogg版本 软件包 操作系统版本 OGG安装路径 10.1.50.52 源 oracle11.2.0.4 12.2.0.1.1 V100692-01.zip cen ...

  4. mysql使用数据库

    哈哈 只能怪自己太菜哈 刚接触这个MySQL没多久 今天用终端登陆MySQL的时候mysql -u root -p 然后就想看看自己的数据库 我用的MySQL的客户端是navicat for mysq ...

  5. Linux 学习第五天

    一.重定向.管道符.通配符 1.重定向.管道符使用 重定向: 命令文件 管道符: 命令A:命令B  (管道符  |  别称 “任意门”) 二.常用命令 1.ls /etc | wc -l  (查看目录 ...

  6. Vue清除所有JS定时器

    Vue清除所有JS定时器 在webpack + vue 的项目中如何在页面跳转的时候清除所有的定时器 JS定时器会有一个返回值(数字),通过这个返回值我们可以找到这个定时器 在vue项目中可以使用路由 ...

  7. 关于js复制的那些事儿

    window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataForma ...

  8. ...续上文(一个小萌新的C语言之旅)

    我们继续上次没介绍完的继续讲: 下面我们说一下二进制,二进制是计算技术中广泛采用的一种 数制. 二进制数据是用0和1两个 数码来表示的数.它的基数为2,进位规则是“逢二进一”.那么二进制怎么转化为十进 ...

  9. HyperLedger Fabric 1.4 问题汇总(16)

    16.1 在运行e2e_cli例子时,执行./network_setup.sh up,出现错误:网络搭建之network e2ecli_default not found 问题原因: End-2-En ...

  10. vim 智能提示插件 YouCompleteMe安装

    按照网上的教程安装该软件,没有一篇是成功的(也有可能是没找对).自己从网上东拼西凑的,终于让自己的vim智能识别了. 1. 升级 vim: (ubuntu) sudo add-apt-reposito ...