我会告诉你我为什么用Integer.ValueOf()而不用new Integer()吗?
问题:当你需要产生一个整形的包装类的实例的时候(比如整数10),有两种方式:
第一种,使用构造函数new 一个对象:
Integer i=new Integer(10);
第二种,使用静态工厂方法产生实例(我会告诉你其实java里所有的ValueOf都是静态工厂方法吗?):
Integer i=Integer.ValueOf(10);
你选哪种?
我选第二种,为什么?因为,当你用第一种方式时每次都会产生一个新的实例,而当你使用静态工厂方法时,不一定会产生一个新的实例,注意我说的是不一定,至少这里没有产生一个新的实例,为什么,我们看源码:
/**
* Returns a <tt>Integer</tt> instance representing the specified
* <tt>int</tt> value.
* If a new <tt>Integer</tt> instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Integer(int)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param i an <code>int</code> value.
* @return a <tt>Integer</tt> instance representing <tt>i</tt>.
* @since 1.5
*/
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
这是Integer.ValueOf(int i)的源码,原来IntegerCache相当于做了一个缓存,在第一次被调用时,首先初始化生成了从-128到127共256个对象的数组,在以后凡是在这个范围内的int值都可以直接从此缓存中取,而不在再次生成Integer对象,大大提高了对象的利用率。
下面是IntegerCache的源码,这个就不解释了:
private static class IntegerCache {
static final int high;
static final Integer cache[];
static {
final int low = -128;
// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
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() {}
}
好了,很清楚了,之前我为什么说不一定不会new 一个新的对象,现在明白了,当你产生的数是-128到127时,不会new一个新的对象,超过这个范围时,同样是new 一个新的对象。
分享到:
相关推荐
- `int` 转 `String`:使用 `String.valueOf()` 方法,例如 `String sub1=String.valueOf(sub);` - 注意:在进行类型转换时需确保字符串能正确解析为数字,否则会抛出 `NumberFormatException`。 2. **获取本地IP...
licenseNum = nf.format(Integer.valueOf(licenseNum)); String verTime = new StringBuilder("-").append( new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime())).append("0").toString(); String ...
Date enterDate = Date.valueOf(strDate); //util.Date SimpleDateFormat //判断两次密码是否相同 if(pwd == null || !pwd.equals(rePwd)){ request.setAttribute("error","两次密码必须相同"); request....
- 基本数据类型转字符串:使用 `String.valueOf()`,如 `String str = String.valueOf(123)`。 3. **基本数据类型的封装类** - 封装类是 Java 为每个基本数据类型提供的类,如 `Integer` 对应 `int`,`Double` ...
其中 `parseByte(s, radix)` 方法会首先使用 `Integer.parseInt(str, radix)` 将字符串转换为整数,然后检查转换后的整数是否在 `byte` 类型的范围内。若不在范围内,则抛出 `NumberFormatException`。 ##### 3.5 ...
使用`String.valueOf()`方法或将数字与空字符串拼接。 #### 25. 如何去小数点前两位,并四舍五入。 使用`Math.round()`方法或`DecimalFormat`类。 #### 26. 如何取得年月日,小时分秒? 使用`LocalDate`和`...
无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session 中完成对数据的增删改查和事务提交等. 4....
2. **创建SQL语句**:在SQL查询中,你可以使用`IN`关键字配合`(@p1, @p2, ..., @pn)`来处理数组中的元素。但由于参数化的限制,你不能直接将数组传入SQL,而是需要构造一个动态的SQL语句。这里我们可以使用字符串...
* DM:方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似Integer.toString(1)代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。 * SIC:如果一个...
例如,int到Integer的转换可以通过Integer.valueOf()自动完成,反之,Integer到int的转换会自动调用intValue()方法。 2. **String类**: String在Java中是一个不可变类,意味着一旦创建,其内容就不能改变。创建...
不要使用Response.Redirect,而应该使用Server.Transfer e.g // in global.asax protected void Application_Error(Object sender, EventArgs e) { if (Server.GetLastError() is HttpUnhandledException) Server...
codeceo 首页问答热门文章RSS订阅 文章首页 ...但是为什么呢?简单分析下。 看过上文的还记得在 HashMap 扩容的时候会调用 resize() 方法,就是这里的并发操作容易在一个桶上形成环形链表;这样当获取...
如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 apache网站下下载 在这是junit测试单元类我就不提交了,在main()方法中有几个小...
", new String[]{String.valueOf(id)}); } // 更新数据 public int update(int id, String newName, int newAge) { ContentValues values = new ContentValues(); values.put("name", newName); values.put(...
writer.write(String.valueOf(counter)); writer.close(); } catch (IOException e) { out.println("Error updating counter."); } %> <!DOCTYPE html> 访问计数示例 该页面已被访问 <%= counter %> 次。...
- `Integer.valueOf(String s)`:同上,但返回的是`Integer`对象。 - **String to Double** - `Double.parseDouble(String s)`:将字符串转换为双精度浮点数。 - `Double.valueOf(String s)`:同上,但返回的是`...
不要使用Response.Redirect,而应该使用Server.Transfer e.g // in global.asax protected void Application_Error(Object sender, EventArgs e) { if (Server.GetLastError() is HttpUnhandledException) Server....
写一个函数,例如:给你的 a b c 则输出 abc acb bac bca cab cba import java.util.ArrayList; import java.util.List; public class NumTest { public static void main(String[] args) { String s="ABCD";...
- **示例**: `Integer.valueOf(123)`返回字符串`"123"`。 #### 字符串检索 - **方法**: `indexOf(String s)` - **功能**: 返回字符串`s`在当前字符串中的首次出现位置;如果不存在,则返回-1。 - **示例**: `...