• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

为什么要有包装类

技术杂谈 勤劳的小蚂蚁 3个月前 (01-24) 71次浏览 已收录 0个评论 扫描二维码

为什么这么设计

java中new一个对象,会把这个对象存储在堆里面,所有的类都是object的子类,通过stack指向堆。
1.java中的对象很多都是朝生夕死的,所以一直放在堆中不是很高效;
2.Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

不同

  1. 声明方式不同:基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;
  2. 存储方式及位置不同:基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;
  3. 初始值不同:基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;
  4. 使用方式不同:基本类型直接赋值直接使用就好,而包装类型在集合如Collection、Map时会使用到。

取舍

这样做也不是没有代价,装箱和拆箱的性能差距,在大数据和大并发的环境中会被体现出来。
以答主所做的广告系统为例,广告系统中大量存在如下类型的数据:
广告Id: long
广告价格: double
app的Id : int
由于java提供了默认box unbox的操作,例如更新某个广告当前的价格就需要数据结构Map,这个时候就自动从long -> Long , double -> Double.
更新操作还不太明显,但是查询广告价格几乎是每一个请求都会有的,这个时候box, unbox就会大大的降低性能。
对此,我们团队线上的代码没有使用java的原生jdk中的Map、Set、List等结构,而是使用了Eclipse Collections。Eclipse Collections起源于2004年在高盛公司内部开发的一个名为Caramel的集合框架。这个框架就可以使得Map这样的结构,不存在box和unbox。
在我们的广告引擎中,上线后大概缩短了5ms的latency.同时GC情况也有变好。我们团队属于比较尝鲜那种,新的技术够比较敢用,现在线上即将升级jdk10.有兴趣的小伙伴可以参考官网文档:
下面列出官网文档所给的和原生jdk比较的数据.
和原生jdk的Set性能比较

和原生的jdk Map性能比较

和原生jdk的List进行比较



    丨极客文库, 版权所有丨如未注明 , 均为原创丨
    本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
    转载请注明原文链接:为什么要有包装类
    喜欢 (0)
    [247507792@qq.com]
    分享 (0)
    勤劳的小蚂蚁
    关于作者:
    温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

    您必须 登录 才能发表评论!

    • 精品技术教程
    • 编程资源分享
    • 问答交流社区
    • 极客文库知识库

    客服QQ


    QQ:2248886839


    工作时间:09:00-23:00