为什么说不变模式可以提高性能

在Java中基础类型的包装类都是不可变的类,如Boolean、Byte、Character、Double、Float、Integer、Long、Short,另外还有String。
这些类创建的实例都是不可以变的实例。

//Integer类代码 JDK1.8
public final class Integer extends Number implements Comparable<integer> {
    private final int value;
    public Integer(int value) {
        this.value = value;
    }
&#xFF5D;
</integer>

可以看到Integer类是final类型的不可被继承,其封装的int值是也是final的。这就导致了实例创建后我们没有其他办法去修改这个int值,所以说Integer对象是不可变对象。

那不可变对象又是如何提高性能的呢,这里看Integer的valueOf方法。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= integercache.high) return integercache.cache[i + (-integercache.low)]; new integer(i); } < code></=>

Integer在调用valueOf时是先从IntegerCache查找对象,如果没有才去创建一个新的对象,有的话就直接将引用指向这个对象。IntegerCache是个静态内部类,存储了-128到127的值的对象数组(可以通过java.lang.Integer.IntegerCache.high jvm属性修改这个区间的大小)。
因为Integer对象是不可变的,这样这个缓存数组就可以在多个线程中进行共享,减少Integer对象的创建。
比如你通过一个ORM框架查询出1万条人员数据,人员数据使用Person类封装,Person类有一个字段Integer sex存储性别数据,1男2女。实例化这1万个Person类的时候就可以将这1万个Integer sex分别指向Integer(1)和Integer(2)的内存地址。如果张三的当前性别是男,你想改成女,那就把sex的引用指向缓存中Integer(2)的内存地址。这样的话在没有创建任何额外的Integer实例的情况下,达到了节省内存的目的。
反过来看,如果对象是可变的,就没法做缓存了。对象内部int值变化会导致所有对这个对象的引用不安全,就必须为每个Person创建一个Integer sex对象。
包装类型的缓存机制和字符串的缓存机制都是用的这个思想,就是减少对象的创建数量。

Original: https://www.cnblogs.com/soker/p/16444260.html
Author: 大兴神
Title: 为什么说不变模式可以提高性能

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622617/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一,Flink快速上手

    1.依赖配置 1.1 pom文件 8 8 1.13.0 1.8 2.12 1.7.30 org.apache.flink flink-java ${flink.version} o…

    数据库 2023年6月6日
    095
  • 【已解决】关于echarts的splitArea分割区域背景闪烁问题

    (x轴)使用时间类型(type: “time”),并且x轴使用splitArea划分后使用color属性设定分割区域颜色。同时使用dataZoom设置区域缩…

    数据库 2023年6月6日
    082
  • NO.1 通讯录管理系统+源代码(C++)

    功能描述:显示简单的菜单,供用户选择操作 实现步骤:直接cout输出 功能描述:根据用户不同的操作代码选择,进入不同的功能,我们使用switch分支结构进行搭建 实现步骤:用whi…

    数据库 2023年6月14日
    076
  • 新的开始

    今天,我正式开始我的博客分享,java人加油 posted @2022-03-05 21:25 小小羊儿 阅读(10 ) 评论() 编辑 Original: https://www…

    数据库 2023年6月11日
    095
  • 网页包抓取工具Fiddler工具简单设置

    当下载好fiddler软件后首先通过以下简单设置,或者有时候fiddler抓取不了浏览器资源了。可以通过以下设置。 设置完成后重启软件。打开网络看看有没有抓取到包。 Origina…

    数据库 2023年6月6日
    089
  • Linux进程管理

    进程管理 基本概念介绍 进程和线程 进程: 一个在内存中运行的应用程序,每一个进程都有自己独立的一块内存空间,并被分配一个ID号(PID),在Windows下可以打开任务管理器查看…

    数据库 2023年6月16日
    0111
  • [LeetCode]27. 移除元素

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原…

    数据库 2023年6月9日
    066
  • go test 的内联问题

    写单测的时候遇到一个问题,在使用 gomonkey 进行打桩时,使用 gland 的 debug 运行测试时,测试程序正常跑通,而使用 run 或者命令行运行 go test -v…

    数据库 2023年6月9日
    0124
  • [springmvc]从前端获取参数以及显示

    6.接收请求参数以及数据回显 接收普通参数 参数名与前端传递的参数名相同时 前端表单名name=name $Title$ username: 后端收到的参数名String name…

    数据库 2023年6月16日
    0103
  • 【Java代码之美】 — Java17新特性初探

    1.背景 Oracle与9月中旬正式宣布推出Java17,正如官方所说: JDK17是最新的长期稳定支持的版本作为JDK11之后的下一个长期支持的版本; 也是Spring Fram…

    数据库 2023年6月6日
    0100
  • 快速入门上手Markdown

    第一次接触 Markdown是写代码初期看很多大佬的 github,他们的项目一定会有一份文件叫 Readme.md的文件他们由一些简单美观的符号和汉字字母组成,编译之后成为一篇简…

    数据库 2023年6月11日
    089
  • Javaweb08-Ajax项目-分页条件查询 + 增删改

    1、登录 欢迎登录课工场KH96动漫管理系统 用户名: 用户密码: 欢迎登录课工场KH96动漫管理系统 用户名: 用户密码: $(function(){ //使用jQuery的Aj…

    数据库 2023年6月16日
    0107
  • B树-插入

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 插入 根据B树的以下两个特性 每一个结点最多有m个子结点 有k个子结点的非叶子结点拥有 k −…

    数据库 2023年6月14日
    0111
  • python自动安装mysql5.7

    python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以自己修改 这个脚本…

    数据库 2023年6月9日
    0165
  • zabbix模板,角色,用户,权限管理

    用户管理 用户组 用户角色 用户 模板管理 模板组 模板 posted @2022-09-07 22:22 溜溜威 阅读(16 ) 评论() 编辑 Original: https:…

    数据库 2023年6月14日
    0107
  • 4、异常

    一、异常的体系结构: java.lang.Throwable |—–java.lang.Error:一般不编写针对性的代码进行处理。 |—&#8…

    数据库 2023年6月6日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球