Integer为什么要提供功能与new Integer(xx)一样的valueOf(xx)方法呢,看了源代码之后,我发现了惊人的内幕。
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); // 缓存里没有则new }
原来,Integer类里定义了一个静态内部类IntegerCache,
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }
该类加载后会在内存里缓存若个个Integer对象,默认从-128~127,high可配(XX:AutoBoxCacheMax=200)。调用valueOf(x),当x>=-128且x<=high时直接取缓存里的对象,不用new,不在这个范围的则在堆里new。(注:Long,Integer,Short,Byte,Character,Boolean均实现了常量池)
我们知道Integer a = 12会发生自动装箱(int->Integer),实际上是调用了Integer.valueOf(12),用javap验证如下:
localhost:tmp javahongxi$ javap -c T 警告: 二进制文件T包含tmp.T Compiled from "T.java" public class tmp.T { java.lang.Integer i; public tmp.T(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: bipush 12 7: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 10: putfield #3 // Field i:Ljava/lang/Integer; 13: return }
到此,我们可以得出一个重要的结论:-128~127范围内的整数,我们千万不要用new Integer来声明,请用自动装箱或Integer.valueOf。
最后我们看看equals方法,
private final int value; public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
现在,我们应该能应对各种关于Integer==判断的笔试题了。
关于字符串的比较请参考String创建详解
相关推荐
主要介绍了Java Integer.ValueOf()的一些了解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了Java Integer.valueOf()和Integer.parseInt()的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
先来分析选型A,Integer i01 = 59,是一个装箱的过程,在进行i01 == i02的比较过程中,因为右边是整型,发生了拆箱的动作,所以进行了值得比较,所以返回true。 在这里拿出Integer a = 59,Integer b = 59,这种又会...
本文通过代码给大家讲解了JAVA中Integer.valueOf, parsetInt() String.valueOf的区别和结果,需要的朋友可以参考下
适合应届生的java试题,很简单,但有些地方容易出错,请不要眼高手低。
i = Integer.valueOf(s).intValue(); tf1.setString(i*0.45359 + ""); } else if(!s.equals("") && tf2.getString().equals("")) { i = Integer.valueOf(s).intValue(); tf2.setString(i*2....
Java实现蜘蛛纸牌
HugeInteger.java
自定义viewpager,实现循环滑动,这是我自己的demo,可供参考
前端项目-big-integer,An arbitrary length integer library for Javascript
当 BigDecimal 值小于或等于 Integer.MAX_VALUE(2^31-1)时,intValue() 方法返回 BigDecimal 对象的整数值。例如,在上面的示例代码中,输入的 BigDecimal 值为 123.45,其返回的 intValue() 值为 123。 当 ...
import java.io.*; public class FirstPart{ public static void main(String[] ...int f = Integer.parseInt(br.readLine()); double c=5*(f-32); c=c/9; System.out.println("Changing it to Celsius is "+c); } }
嵌入式单片机文件系统需要的文件。ff.h、ff.c、integer.h。
int a= Math.round(Integer.parseInt(edit1.getText().toString().trim())); int b= Math.round(Integer.parseInt(edit2.getText().toString().trim())); // long a = Math.round(Math.random() * ...
VB调用C的DLL,用于数值装换,2字节装换为1个整数
int a= Math.round(Integer.parseInt(edit1.getText().toString().trim())); int b= Math.round(Integer.parseInt(edit2.getText().toString().trim())); // long a = Math.round(Math.random() * ...
Demo03Integer.java
long转int 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出...int ii = Integer.parseInt(String.valueOf(ll)); 这三种方法都比较简单明了。
在IBM JDK 8中, java.lang.Integer.toHexString(int)方法有时会返回以nul字符'\u0000'开头的字符串。 目前的项目在那里证明了这个问题。 重现步骤 获得IBM JDK8。我的情况是,确切的版本是 java -version java ...
We'll keep you posted by email about the progress of your build. In the meantime I suggest you take a look at the build stats to find out how your firmware configuration compares to others in the ...