java 封装数据类型——Integer
  今天来学习整型 int 的封装数据类型,Integer 。
1. 定义
  ⾸先来看看定义。可以看到,Integer 继承 Number 抽象类,实现了 Comparable 接⼝。Number 类是常⽤数字类型类的公共⽗类,它规定了其⼦类(通常就是数字类)必须提供将其值转换成 int 、long 、float 、double 、byte 、short 类型数据的能⼒。实现 Comparable 接⼝⾃然是为了⽐较⼤⼩。另外,Integer 类型也是最终类,不可被继承(事实上,常⽤数据类型的封装类都是 final 类)。
2. 属性
  2.1. 表⽰ int 数据类型上下界值的字段:MIN_VALUE = -231 ,MAX_VALUE = 231-1 ;
  2.2. Integer 类型类对象的引⽤:TYPE ;   
3. 构造⽅法
  Integer 提供两个构造⽅法,分别接收⼀个 int 数据类型和⼀个 string 类型(不是整数会报错)。
public  Integer(int  value) {
this .value = value;
}
public  Integer(String s) throws NumberFormatException {
this .value = parseInt(s, 10);
}
4. 普通⽅法
static int
(int i)返回指定的int 值的⼆进制补码⼆进制表⽰中的 int 数。byte
()返回此值 Integer 为 byte 的基本收缩转换后。static int
(int x, int y)⽐较两个 int 数字值。int
( anotherInteger)数字⽐较两个 Integer 对象。static int
(int x, int y)⽐较两个 int 值,以数值⽅式将值视为⽆符号。static
( nm)将 String 解码成 Integer 。static int
(int dividend, int divisor)返回将第⼀个参数除以秒的⽆符号商,其中每个参数和结果被解释为⽆符号值。double
()返回此值 Integer 为 double ⼀个宽元转换后。boolean
( obj)将此对象与指定的对象进⾏⽐较。float
()返回此值 Integer 为 float ⼀个宽元转换后。static
( nm)确定具有指定名称的系统属性的整数值。static
( nm, int val)确定具有指定名称的系统属性的整数值。static
( nm,  val)返回具有指定名称的系统属性的整数值。int
()返回这个 Integer 的哈希码。static int
(int value)返回值为int 的哈希码; 兼容Integer.hashCode() 。static int (int i)
返回⼀个 int 值与⾄多⼀个单个1位,在最⾼阶(“最左侧”)的位置在指定的⼀个位 int 值。
int()
将 Integer的值作为 int 。
long ()
返回此值 Integer为 long⼀个宽元转换后。
static int (int i)
在指定的 int值中,以最低位(最右边)为1位返回⼀个最多为单个1位的 int值。
static int (int a, int b)
返回两个 int的较⼤值,就像调⽤。
static int (int a, int b)
返回两个 int的较⼩值,就像调⽤。
static int (int i)
返回的最⾼阶的(“最左边的”)中所指定的⼆进制补码表⽰的⼀个位前述零个⽐特的数量 int值。
static int (int i)
返回零位以下最低阶(“最右边的”)的数量在指定的⼆进制补码表⽰的⼀个位 int值。
static int ( s)
将字符串参数解析为带符号的⼗进制整数。
static int ( s, int radix)
将字符串参数解析为第⼆个参数指定的基数中的有符号整数。
static int ( s)
将字符串参数解析为⽆符号⼗进制整数。
static int ( s, int radix)
将字符串参数解析为第⼆个参数指定的基数中的⽆符号整数。
static int(int dividend, int divisor)
返回⽆符号余数,将第⼀个参数除以秒,其中每个参数和结果被解释为⽆符号值。
static int (int i)
返回由指定的⼆进制补码表⽰反转位的顺序⽽获得的值 int值。
static int (int i)
返回反转指定的⼆进制补码表⽰的字节顺序⽽获得的值 int值。
static int (int i, int distance)
返回通过旋转指定的⼆的补码的⼆进制表⽰⽽得到的值 int由位指定数⽬的左值。
static int (int i, int distance)
返回通过旋转指定的⼆的补码的⼆进制表⽰⽽得到的值 int右移位的指定数值。
short ()
返回此值 Integer为 short的基本收缩转换后。
static int (int i)
返回指定的 int值的 int函数。
static int (int a, int b)
根据+运算符将两个整数相加。
static (int i)
在基数2中返回整数参数的字符串表⽰形式为⽆符号整数。
static (int i)
返回整数参数的字符串表⽰形式,作为16位中的⽆符号整数。
static (int i)
在基数8中返回整数参数的字符串表⽰形式为⽆符号整数。()
返回 String表⽰此对象 Integer的价值。
static (int i)
java valueof返回⼀个 String指定整数的 String对象。
static (int i, int radix)
返回由第⼆个参数指定的基数中的第⼀个参数的字符串表⽰形式。
static long (int x)
参数给转换 long由⽆符号转换。
static (int i)
将参数的字符串表⽰形式返回为⽆符号⼗进制值。
static (int i, int radix)
以第⼆个参数指定的基数中的⽆符号整数值返回第⼀个参数的字符串表⽰形式。
static (int i)
返回⼀个 Integer指定的 int值的 Integer实例。
static ( s)
返回⼀个 Integer对象,保存指定的值为 String 。
static ( s, int radix)
返回⼀个 Integer对象,保存从指定的String中 String的值,当⽤第⼆个参数给出的基数进⾏解析时。
  4.1. byteValue()、shortValue()、intValue()、longValue()、floatValue()、doubleValue(),这些是继承⾃ Number 类的⽅法,返回当前 Integer 对象对应 int 值对应的各种数据类型值(通过强制类型转换,强转到低精度时可能丢失数据)
  4.2. compareTo(Integer) ⽅法
    该⽅法接收⼀个被⽐较的 Integer 类对象,并与之⽐较⼤⼩,遵循 Comparable 接⼝的常规约定:若当前值等于参数值,返回 0;若当前值⼩于参数值,返回 -1;若当前值⼤于参数值,返回 1;
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
/**
* Compares two {@code int} values numerically.
* The value returned is identical to what would be returned by:
* <pre>
*    Integer.valueOf(x)pareTo(Integer.valueOf(y))
* </pre>
*
* @param  x the first {@code int} to compare
* @param  y the second {@code int} to compare
* @return the value {@code 0} if {@code x == y};
*        a value less than {@code 0} if {@code x < y}; and
*        a value greater than {@code 0} if {@code x > y}
* @since 1.7
*/
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
  4.3. decode(String),解码⽅法,将参数字符串解码得到 Integer,该⽅法⾃动识别正负符号和进制符号(如:0x、0、# 等),如 -0xa1 = -161,默认是正数和⼗进制
public static Integer decode(String nm) throws NumberFormatException {
int radix = 10;
int index = 0;
boolean negative = false;
Integer result;
if (nm.length() == 0)
throw new NumberFormatException("Zero length string");
char firstChar = nm.charAt(0);
// Handle sign, if present
if (firstChar == '-') {
negative = true;
index++;
} else if (firstChar == '+')
index++;
// Handle radix specifier, if present
if (nm.startsWith("0x", index) || nm.startsWith("0X", index)) {
index += 2;
radix = 16;
}
else if (nm.startsWith("#", index)) {
index ++;
radix = 16;
}
else if (nm.startsWith("0", index) && nm.length() > 1 + index) {
index ++;
radix = 8;
}
if (nm.startsWith("-", index) || nm.startsWith("+", index))
throw new NumberFormatException("Sign character in wrong position");
try {
result = Integer.valueOf(nm.substring(index), radix);
result = negative ? Integer.valueOf(-result.intValue()) : result;
} catch (NumberFormatException e) {
// If number is Integer.MIN_VALUE, we'll end up here. The next line
// handles this case, and causes any genuine format error to be
/
/ rethrown.
String constant = negative ? ("-" + nm.substring(index))
: nm.substring(index);
result = Integer.valueOf(constant, radix);
}
return result;
}
    可以看到,decode ⽅法⾸先对正负号和进制符号进⾏识别判断,最后将剩下的纯数值部分和得到的进制数值调⽤静态⼯⼚⽅法 valueOf(string, int) 构造 Integer 对象。
  4.4. valueOf 静态⽅法
    Integer 类⽀持整型和字符串型参数的⼯⼚⽅法,其中字符串型的⼯⼚⽅法⽀持指定进制,并且会先使⽤ parseInt ⽅法解析出原始 int 数值,再通过 valueOf (int) ⽅法构造 Integer 对象。parseInt ⽅法就
是遍历字符串并使⽤进制值加权累加计算了。最值得注意的是 int 参数的 valueOf ⽅法,它体现了 Integer 类的缓存策略,后⾯单独讲。
public static Integer valueOf(String s, int radix) throws NumberFormatException {
return Integer.valueOf(parseInt(s,radix));
}
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
  4.4. getInteger ⽅法
    该⽅法返回 string 参数指定的系统属性值。⽀持指定默认值(通过第⼆个参数),若该属性不存在或者不是 int 类型,则返回默认值
public static Integer getInteger(String nm) {
return getInteger(nm, null);
}
public static Integer getInteger(String nm, int val) {
Integer result = getInteger(nm, null);
return (result == null) ? Integer.valueOf(val) : result;
}
public static Integer getInteger(String nm, Integer val) {
String v = null;
try {
v = Property(nm);
} catch (IllegalArgumentException | NullPointerException e) {
}
if (v != null) {
try {
return Integer.decode(v);
} catch (NumberFormatException e) {
}
}
return val;
}
  4.5. hashCode() ⽅法
    Integer 的 hashCode() 值就是它所保存的 int 型值。
/**
* Returns a hash code for this {@code Integer}.
*
* @return  a hash code value for this object, equal to the
*          primitive {@code int} value represented by this
*          {@code Integer} object.
*/
@Override
public int hashCode() {
return Integer.hashCode(value);
}
/**
* Returns a hash code for a {@code int} value; compatible with
* {@code Integer.hashCode()}.
*
* @param value the value to hash
* @since 1.8
*
* @return a hash code value for a {@code int} value.
*/
public static int hashCode(int value) {
return value;
}
  4.6. equals(Integer) ⽅法
    Integer 的 equals ⽅法⽐较的就是保存的 int 型值是否相等。很显然,hashCode 和 equals ⽅法遵循散列的常规约定。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
5. Integer 的缓存机制
  前⾯学习 Boolean 类保存两个对 true 和 false 值对象的静态引⽤,使⽤ valueOf 构造对象时会始终返回其⼀。Integer 类也同样使⽤了这种缓存机制。上⽂中提到了静态⼯⼚⽅法 valueOf(int) 使⽤了缓存策略,代码中使⽤了 IntegerCache 类,那么我们就来看看该类源码,这是 Integer 类的⼀个内部类,专门⽤于处理 Integer 缓存机制:
  可以看出,该类是私有内部类,开发者不可改变和初始化。该类通过静态代码块在类加载的时候,循环创建 Integer 缓存对象,并创建索引表进⾏引⽤,需要时使⽤索引表快速获取。缓存值范围最⼩是 -128,最⼤默认是 127(可以使⽤虚拟机参数指定,虚拟机默认⽆该参数)。缓存对象值和所在索引表位置偏移量即是 127。
  再回头看看 valueOf(int) ⽅法:当需要构造的 Integer 对象值在缓存范围之内时,就从索引表查缓存对象直接返回,否则构造新的对象返回。所以⼤家在开发中需要构建Integer 对象时,推荐使⽤静态⼯⼚⽅法,少⽤ new 以节省开⽀。
6. 总结
  6.1. Integer 是对 int 型的封装数据类型,能表⽰的范围是  -231 ~ 231-1 的所有整数;
  6.2. Integer 的 hashCode 值就是它所保存的 int 型值;
  6.3. Integer 提供了很多实⽤⽅法:min、max、sum、转换成⼆/⼋/⼗六进制的字符串表⽰等;
  6.4. Integer 使⽤了对象缓存机制,默认范围是  -128 ~ 127 ,推荐使⽤静态⼯⼚⽅法 valueOf 获取对象实例,⽽不是 new,因为 valueOf 使⽤缓存,⽽ new ⼀定会创建新的对象分配新的内存空间;
【附】
  Integer 缓存机制验证:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。