关于使用new Integer还是Integer.valueOf的研究

Integer.parseInt和Integer.valueOf区别 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。Integer.parseInt多次解析同一个字符串得到的int基本类型数据是相等的。Integer.valueOf多次解析相同的一个字符串时,得到的是Integer类型的对象:如果s字符串对应的整数值在 -128127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128。 阅读详情

作者:fbysss
msn:jameslastchina@hotmail.com  
blog:blog.youkuaiyun.com/fbysss
声明:本文由fbysss原创,转载请注明出处

前言:

最近看到这样的说法:使用Integer.valueOf代替new Integer更有效率,原因是研究了Integer源码,发现有一个缓存可以利用。

对此我也一探究竟。发现这其实与Java的自动装箱拆箱有关,直接使用Integer i =数值的方式即可。

通过字节码研究是比较有效的方式。那我们来看看吧:


-------------------
Integer.valueOf源码:
-------------------


   public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache 
    return IntegerCache.cache[i + offset];
}
        return new Integer(i);
    }


-------------------
IntegerCache 源码(jdk1.6.0_12):
-------------------
    private static class IntegerCache {
private IntegerCache(){}


static final Integer cache[] = new Integer[-(-128) + 127 + 1];//注意这个cache是final的


static {
    for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}



源码1:

public class TestInt {


/**
* @param args
*/
public static void main(String[] args) {
int i =200;
i ++;
}
}
---------------------
javap -c TestInt
---------------------
public class com.sss.newage.test.TestInt extends java.lang.Object{
public com.sss.newage.test.TestInt();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return


public static void main(java.lang.String[]);
  Code:
   0:   sipush  200
   3:   istore_1
   4:   iinc    1, 1
   7:   return


}



源码2:
public class TestInt {


/**
* @param args
*/
public static void main(String[] args) {
Integer i =200;
i ++;
}
}
---------------------
javap -c TestInt
---------------------
public class com.sss.newage.test.TestInt extends java.lang.Object{
public com.sss.newage.test.TestInt();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return


public static void main(java.lang.String[]);
  Code:
   0:   sipush  200
   3:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   6:   astore_1
   7:   aload_1
   8:   invokevirtual   #22; //Method java/lang/Integer.intValue:()I
   11:  iconst_1
   12:  iadd
   13:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   16:  astore_1
   17:  return


}

我们可以看到:

1.第3行(行标为3)调用了Integer.valueOf,一旦数字在缓存窗口中,则能够提高效率,那么我们可以认为,缓存不用白不用,的确比new Integer要好。

2..第8行(行标为8)进行了自动拆箱(intValue),目的是进行数字的加1运算

3.注意第13行,运算完毕之后,再次进行装箱(valueOf),这些运算都不影响cache本身,所以cache设计成只读即可,也不存在线程安全问题。



源码3:修改Integer i =200;为Integer i =Integer.valueOf(200);
public class TestInt {


/**
* @param args
*/
public static void main(String[] args) {
Integer i =Integer.valueOf(200);
i ++;
}
}


public class com.sss.newage.test.TestInt extends java.lang.Object{
public com.sss.newage.test.TestInt();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return


public static void main(java.lang.String[]);
  Code:
   0:   sipush  200
   3:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   6:   astore_1
   7:   aload_1
   8:   invokevirtual   #22; //Method java/lang/Integer.intValue:()I
   11:  iconst_1
   12:  iadd
   13:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   16:  astore_1
   17:  return


}

可以看到,使用Integer i = 200;与Integer i = Integer.valueOf(200);是等价的,从程序员读写习惯来看,使用Integer i = 200;的形式更好




------------------------

注意一点:

------------------------

最新版本的Jdk,Integer有改写,IntegerCache 的缓存窗口可以配置(通过JVM参数 -XX:AutoBoxCacheMax设置)。

JDK1.6.0_27相关源码

 /**
     * Cache to support the object identity semantics of autoboxing for values between 
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage. During VM initialization the
     * getAndRemoveCacheProperties method may be used to get and remove any system
     * properites that configure the cache size. At this time, the size of the
     * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>.
     */


    // value of java.lang.Integer.IntegerCache.high property (obtained during VM init)

    static void getAndRemoveCacheProperties() {
        if (!sun.misc.VM.isBooted()) {
            Properties props = System.getProperties();
            integerCacheHighPropValue =
                (String)props.remove("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null)
                System.setProperties(props);  // remove from system props
        }
    }


    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 Integer(“127“)和Integer.valueOf(“128“)有什么区别 或自动装箱,以便在可能的情况下利用缓存优化。虽然了解这些细节很重要,但在日常编程中,我们应该专注于编写清晰、正确的代码,而不是过度依赖于这些底层优化。这个问题触及了 Java 中整数缓存机制的一个微妙之处。在实际应用中,除非特别需要新对象,否则推荐使用。或自动装箱,通常就足以编写高效且可靠的代码.在 Java 面试中,经常会遇到关于。对象创建和缓存机制的问题。进行值比较,以及优先使用。 阅读详情

相关推荐

java基础------new Integer(1)和Integer.valueOf(1)的区别

java.lang包中的Integer类是我们比较常用的类,比如以下代码: Integer a=new Integer(1) Integer a=Integer.valueOf(1); 两个都是得到一个Integer对象,但是Integer.valueOf的效率高。为什

xxqi1229的专栏 5557

Integer. valueOf()的使用

1.Integer. valueOf()方法的作用 Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会报错 2.Integer. valueOf()是高效的 public static Integer valueOf(int i) { if (...

最后的武艺集大成者 10万+

【Matlab深度学习】GPU加速实战:从环境配置到性能优化

本文详细介绍了如何在Matlab中为深度学习任务配置GPU加速环境并进行性能优化。文章从GPU加速的必要性讲起,手把手指导安装NVIDIA驱动、CUDA和cuDNN核心三件套,并验证环境。重点讲解了如何利用gpuArray将数据和模型迁移至GPU,以及通过内存优化、计算优化和多GPU并行等策略充分释放GPU算力,大幅缩短深度学习模型的训练时间。

weixin_29061465的博客 490

Java中Integer.parseInt 和 Integer.valueOf 区别

Integer.parseInt() 和 Integer.valueOf() 都是用来 将String转换为Int的,但是为什么Java会提供两个这样的方法呢,他们如果是同样的操作,岂不是多此一举? 我们来深挖Java源代码一探究竟。 Integer.parseInt(),返回一个原子类型int. Integer.valueOf(), 返回的是封装的Integer对象。 Integer.par...

u013728021的博客 3501

基于GPU的GEMM矩阵相乘运算优化

从上图中我们可以看到三种处理方法。第一种是将A和B矩阵分块,第二种方法是将C和B矩阵分块,第三种方法是将C和A矩阵分块。GEMM的子任务是GEPP或GEMP;最小粒度的任务是GEBP或GEPB或点乘。

weixin_55035144的博客 2152

Ubuntu 20.04 环境下Autoware.universe 与 Carla 0.9.13 联合仿真

安装内容: ROS Galactic Autoware.universe based on ROS Galactic Carla 0.9.13 UnrealEngine 4.26 Openplanner (additional files: op-bridge/op-agent/scenariorunner/map data)

mhl1107的博客 1797

Integer

一、Integer简介 Integer类将基本类型int的值包装在对象中。Integer类型的对象包含一个int类型的字段。 此外,这个类提供了几个将int转换为String和String转换为int的方法,以及其他处理int时有用的常量和方法。 在java9以后,Integer的构造方法均已废弃使用,没有构造方法。 Integer a=new Integer("1"); 1. 开箱与装箱 开箱装箱主要针对于Java中出现的几种包装类,比如int与之对应的Integer。通俗一点的理.

K_Raytheon的博客 1046

Accelstepper 库中的参数计算公式

要完全调试电机的各个参数,例如最大速度,加速度等,就需要了解其计算公式和原理。 以下是代码注释: /// This code uses speed calculations as described in /// "Generate stepper-motor speed profiles in real time" by David Austin/// http://fab.cba.mi...

wenguitao的博客 4454

Java 11弃用的new Byte和new Integer替换

Java 11中已经弃用了new Byte()和new Integer(),进行了替换。

scruffybear的专栏 719

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2633

Microsemi Libero系列教程(四)——PLL的使用

文章目录PLL是什么Libero中PLL的使用官方文档 系列教程:Microsemi Libero系列教程 PLL是什么 PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率...

whik1194的博客 7208

Java中Integer的valueOf()方法

valueOf()包含包含3个相互重载的具体方法。 一、valueOf(String s, int radix) 该方法将字符串s中隐含的数字按照radix指定的进制解析为10进制整数,如果字符串s中隐含非数字字符,则抛出 NumberFormatException 异常 例子 Integer.valueOf("1a", 16); 上面例子的结果应该是16+10=27(a表示16进制中的10),v...

qq_42575499的博客 2万+

华为OD机试真题 新系统【进制转换后自定义排序】

华为OD机试 新系统真题【进制转换后自定义排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【进制转换后自定义排序】多语言题解。

qq_45776114的博客 593

new Integer()和Integer.valueOf()效率比较

Integer a=new Integer(1)  Integer a=Integer.valueOf(1);  两个都是得到一个Integer对象,但是Integer.valueOf的效率高。为什么呢?因为Integer.valueOf用到了缓存。看看Integer.valueOf的代码:  Java代码  1.    public static Integer valueO

将来的你一定会感谢现在努力的自己 1220

第51节:cesium 范围查询(含源码+视频)

cesium 范围查询

qq_29384639的博客 1495

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Integer中的 valueOf 和 parseInt

1、场景 当需要将 String 类型的字符数字转换为 int 类型时,我们可能会用到 Integer.valueOf() 或者 Integer.parseInt() ,这两个函数都可以将字符数字转换成整型。 2、源码 对 Integer.valueOf(String s) 来说: public static Integer valueOf(String s) throws Nu...

tiankong_12345的博客 6941

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

new Integer()和Integer.valueOf

直接上图,干脆直接 看下结果就知道了,这次不用在怕被面试官刁难了,new出来的都相等,IntegerOf 底层自动装拆箱,可以百度研究一下,有一个缓存区域在-128到正127区域之间是相等的 ...

wangcheng555的博客 319

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java基础学习(1)-new Integer与Integer.valueOf区别及源码解析

文章目录1.new Integer和Integer.valueOf()的区别2.Integer.valueOf源码解析3.注意 1.new Integer和Integer.valueOf()的区别 public static void main(String[] args) { Integer a1 = new Integer(123); Integer a2 =...

伟仔的小天地 699

String.valueOf()和Integer.valueOf()方法的使用

String.valueOf()的用法 1. 由 基本数据型态转换成 String  String 类别中已经提供了将基本数据型态转换成 String 的 static 方法  也就是 String.valueOf() 这个参数多载的方法  有下列几种  String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串  String.valueOf(

u011736319的专栏 6850

new Integer和Integer.ValueOf区别

Integer a=new Integer(1) Integer a=Integer.valueOf(1); 两个都是得到一个Integer对象,但是Integer.valueOf的效率高。为什么呢?因为Integer.valueOf用到了缓存。看看Integer.valueOf的代码: Java代码 1. public static Integer valueO...

whaohaoxuexi02的专栏 176

美团面试题:new Integer(“127“)和Integer.valueOf(“128“)有什么区别

这个范围恰好对应一个字节(byte)可以表示的整数范围。大多数日常计算和循环中使用的小整数都在这个范围内。缓存范围不能太大,否则会占用过多内存。

学Java,找哪吒 985

Java中 new Integer 与 Integer.valueOf 的区别

Java中 new Integer 与 Integer.valueOf 的区别

qq_50994235的博客 604

java中Integer.valueOf和new Integer的区别 - 面试宝典

在Java中,​​​和​​是创建Integer对象的两种方式,它们之间有一些区别。​Integer​​Integer​​int​​Integer​​int​​Integer​以下是使用​​​和​​​创建​​Integer​需要注意的是,​​==​​运算符用于比较对象引用是否相等,而不是比较对象的值是否相等。如果要比较对象的值是否相等,应该使用​。

牛肉胡辣汤 935

美团面试题:new Integer(“127“)和Integer.valueOf(“128“)有什么

这个范围恰好对应一个字节(byte)可以表示的整数范围。大多数日常计算和循环中使用的小整数都在这个范围内。缓存范围不能太大,否则会占用过多内存。

2301_78976656的博客 795

Java Integer.valueOf()和Integer.parseInt()的区别

前言 大家都知道Integer类中有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型。说到这里你肯定会想同一个功能为什么要提供两个不同的方法,这不是浪费吗? 区别 Integer.parseInt(String s)将会返回int常量。 Integer.valueOf(String s)将会返回Integer类型,如果存在缓存将会返回缓存中已有的对象。 使用不当将会产生的问题 由于Java的自动拆箱和装箱机制导

李光 未来科技 5258

new Integer()与 Integer.valueOf()区别和联系

new Integer()与 Integer.valueOf()的区别和联系

m0_73097650的博客 1197
上一篇: 匿名函数中undefined形参疑问
下一篇: 逐渐挖掘Autoboxing/Auto-Unboxing
fbysss
博客等级 码龄25年 388粉丝 195原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值