Java中new Long()和Long.valueOf()区别

在项目Code Review的时候,遇到了获取Long对象的两种方式:

  • new Long()
  • Long.valueOf()

那么,这两种方式到底有什么区别呢?下面通过查看JDK(1.8)源代码来分析两者之间的区别。

源码中Long类有两个构造函数:

public Long(long value) {
    this.value = value;
}

 public Long(String s) throws NumberFormatException {
    this.value = parseLong(s, 10);
}

再看下Long.valueOf()相关的源代码:

public static Long valueOf(String s) throws NumberFormatException
{
    return Long.valueOf(parseLong(s, 10));
}


public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}

如果我们去转化一个字符串为Long对象,使用new Long()Long.valueOf()都会去调用parseLong()这个方法。从这一步来说,二者没有区别。区别发生在当parseLong()返回一个long基本类型时,使用new Long()方式时,该long值直接赋值给成员变量;当使用Long.valueOf()时,该long值由上面的public static Long valueOf(long I)来处理。从该方法的代码实现细节可以看到,当值在[-128,127]之间时,返回的是缓存中的值。从这一点来说,如果值在[-128,127]之间时,Long.valueOf()要比new Long()更快更节省内存空间。

在没有特殊要求情况下,尽量的使用Long.valueOf()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,881评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,759评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,123评论 6 13
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,516评论 0 3
  • 10.25刘润商学院日课感悟:电梯测验 用30秒的时间,经过自己的话术表达自己的思想来自信对方多给十分钟的时间...
    徐猛_Merlin阅读 679评论 0 0