java integer valueof_对 Java Integer.valueOf() 的一些了解

从一道选择题开始

c3cd1481d513aa29bc967824ec8fd269.png

分析

选项A

选项A中比较的是i01和i02,Integer i01=59这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时i01就是Integer 的引用。

而int i02=59由于int是基本类型,所以不存在引用问题,直接由编译器将其存放在栈中,换一句话说,i02本身就是59。那么System.out.println(i01== i02)结果任何呢?这里涉及到了拆箱的过程,因为等号一边存在基本类型所以编译器后会把另一边的Integer对象拆箱成int型,这时等号两边比较的就是数值大小,所以是true。

好了,到了这里,你有没有想到这样一个问题:如果是Integer i01=59;Integer i02=59;然后System.out.println(i01== i02)的结果是?可能你会说比较数值大小所以相等啊,也有可能说等号两边对象引用,所以比较的是引用,又因为开辟了不同的内存空间,所以引用不同所以返回false。可是正确答案是:true.

再来看这个问题::如果是Integer i01=300;Integer i02=300;然后System.out.println(i01== i02)的结果是? 你可能说上面你不是说了true嘛,怎么还问这样的问题,可是这次的答案是false。你是否会吃惊?大牛除外,我是小白,求不打脸!

解析:当靠想象无法解决问题的时候,这是就要看源代码了!!很重要!我们可以在Integer类中找到这样的嵌套内部类IntegerCache:

private static class IntegerCache {//静态缓存类

static final int low = -128;

static final int high;

static final Integer cache[];

static { //静态代码块

// high value may be configured by property

int h = 127;

String integerCacheHighPropValue =

sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

if (integerCacheHighPropValue != null) {

int i = parseInt(integerCacheHighPropValue);

i = Math.max(i, 127);

// Maximum array size is Integer.MAX_VALUE

h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

}

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() {}

}

这个类就是在Integer类装入内存中时,会执行其内部类中静态代码块进行其初始化工作,做的主要工作就是把一字节的整型数据(-128-127)装包成Integer类并把其对应的引用存入到cache数组中,这样在方法区中开辟空间存放这些静态Integer变量,同时静态cache数组也存放在这里,供线程享用,这也称静态缓存。

所以当用Integer 声明初始化变量时,会先判断所赋值的大小是否在-128到127之间,若在,则利用静态缓存中的空间并且返回对应cache数组中对应引用,存放到运行栈中,而不再重新开辟内存。

所以对于Integer i01=59;Integer i02=59;**i01 和 i02是引用并且相等都指向缓存中的数据,所以返回true。而对于**Integer i01=300;Integer i02=300;因为其数据大于127,所以虚拟机会在堆中重新new (开辟新空间)一个 Integer 对象存放300,创建2个对象就会产生2个这样的空间,空间的地址肯定不同导致返回到栈中的引用的只不同。所以System.out.println打印出false。

B选项

从上面的分析,我们已经知道Integer i01=59返回的是指向缓存数据的引用。那么Integer.valueOf(59)返回的是什么或者操作是什么呢?

这个函数的功能就是把int 型转换成Integer,简单说就是装包,那他是新创建一个对象吗?还是像之前利用缓存的呢?有了之前的经验,肯定想到的是利用缓存,这样做既提高程序速度,又节约内存,何乐而不为?

来看一下源代码:

public static Integer valueOf(int i) {

assert IntegerCache.high >= 127;

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

很明显跟之前的思想一致,若在-128到127范围,直接返回该对象的引用,否则在堆中重新new 一个。

到这,System.out.println(i01== i03)的结果毋庸置疑就是true.

选项C

Integer.valueOf(59)返回的是已缓存的对象的引用,而Integer i04 = new Integer(59)是在堆中新开辟的空间,所以二者的引用的值必然不同,返回false,这道题呢就选C

选项D

System.out.println(i02== i04) i02是整型变量,i04是引用,这里又用到了解包,虚拟机会把i04指向的数据拆箱为整型变量再与之比较,所以比较的是数值,59==59,返回true.

学习并转载自:https://blog.csdn.net/dawn_after_dark/article/details/74154338

对我很有帮助

感谢作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python统计文件大小_python工具--01.统计当前目录下的文件的大小

环境os: centos7python : 3.7实现功能统计当目录下的文件夹有文件的大小&#xff0c;单位KB/MB/B&#xff1b;代码实现#!/usr/bin/env python# _*_ coding:utf-8 _*_import os,mathsummary0def size_file(str2):global summarysummarysummaryos.path.getsize(str2)def size_dir…

java web 伪静态_【Java Web】使用URLRewrite实现网站伪静态

大部分搜索引擎都会优先考虑收录静态的HTML页面&#xff0c;而不是动态的*.jsp、*.php页面。但实际上绝大部分网站都是动态的&#xff0c;不可能全部是静态的HTML页面&#xff0c;因此互联网上大部分网站都会考虑伪静态——就是将*.jsp、*.php这种动态URL伪装成静态的HTML页面。…

idea创建maven程序_使用Maven程序集创建漏洞评估工件

idea创建maven程序本文将讨论如何使用Maven程序集创建可提供给第三方漏洞评估站点&#xff08;例如Veracode &#xff09;进行审查的工件。 错误的静态分析与漏洞评估 在这一点上&#xff0c;每个人都知道findbug并认真使用它&#xff0c;对吗&#xff1f; 对&#xff1f; F…

python装饰器的顺序_python中多个装饰器的执行顺序详解

装饰器是程序开发中经常会用到的一个功能&#xff0c;也是python语言开发的基础知识&#xff0c;如果能够在程序中合理的使用装饰器&#xff0c;不仅可以提高开发效率&#xff0c;而且可以让写的代码看上去显的高大上^_^使用场景可以用到装饰器的地方有很多&#xff0c;简单的举…

使用Spring WebFlux从Corda节点流式传输数据

自上次发布以来已经有一段时间了&#xff0c;但我终于回来了&#xff01; 由于我仍在我的项目中&#xff0c;因此我将再次撰写有关使用Corda的文章。 这次&#xff0c;我们将不再关注Corda&#xff0c;而是将Spring与Corda结合使用。 更具体地说&#xff0c;Spring WebFlux。 为…

mysql 批量加索引_mysql优化:按期删数据 + 批量insert + 字符串加索引为何很傻

嗯&#xff0c;犯了一个很低级的错误&#xff0c;最近暴露出来了。html背景&#xff1a;mysql1. 内部平台&#xff0c;接口间断性无返回&#xff0c;查询日志注意到失败时&#xff0c;接口耗时达到4000(正常状态&#xff1a;100ms)git2. 增长日志打点&#xff0c;在关键步骤插入…

python王者归来 pdf_OpenStack开源云:王者归来 PDF 下载

资料目录&#xff1a;第1篇 基 础 篇第1章 OpenStack概述1.1 云计算简介1.1.1 什么是云计算1.1.2 什么是云存储1.1.3 私有云与公有云1.2 为什么使用云计算1.2.1 方案1&#xff1a;简单的服务部署1.2.2 方案2&#xff1a;分布式服务部署1.2.3 方案3&#xff1a;基于虚拟化的服务…

MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入

存储引擎&#xff1a;存储引擎是mysql特有的&#xff0c;共有7种&#xff0c;常用的有myisam、memory、innodb查看表的存储引擎&#xff1a;show create table 表名;修改表的存储引擎&#xff1a;alter table 表名 engine存储引擎名称;1.myisam存储引擎&#xff1a;可转换为压缩…

廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数

高阶函数将函数作为参数传入&#xff0c;这样的函数称为高阶函数。函数式编程就是指这种高度抽象的编程范式。变量可以指向函数&#xff0c;函数的参数能接收变量&#xff0c;那么一个函数就可以接收另一个函数作为参数&#xff0c;这种函数就称之为高阶函数。如下所示&#xf…

apache camel_Apache Camel –从头开始开发应用程序(第2部分/第2部分)

apache camel这是本教程的第二部分&#xff0c;我们将使用Apache Camel创建发票处理应用程序。 如果您错过了它&#xff0c;一定要看一下第一部分 。 以前&#xff0c;我们已经定义了系统的功能要求&#xff0c;创建了网关&#xff0c;分离器&#xff0c;过滤器和基于内容的路由…

python 网格线_Python版简单网格策略(教学)

Python版简单网格策略(教学)Python版简单网格策略(教学)Author: 小小梦, Date: 2020-01-04 11:12:15Tags:backteststart: 2019-07-01 00:00:00end: 2020-01-03 00:00:00period: 1mexchanges: [{"eid":"OKEX","currency":"BTC_USDT"}]i…

python土味情话_土味情话表情包下载

喵星人土味情话表情包是一款很甜的表情图片&#xff0c;现在的聊天模式三句话离不开表情包&#xff0c;而且小编带来的这款表情包非常的适合情侣日常撩&#xff0c;最新的土味情话&#xff0c;需要的朋友可以前来本站下载。土味情话大全一、“对不起。”“你永远都不要和我说对…

多云互操作性!=云服务聚合

多云定义为一种方法&#xff0c;它将来自多个云供应商的多个云&#xff08;公共云或私有云&#xff09;组合在一起。 但是&#xff0c;这不是来自不同供应商的各种服务的集合&#xff0c;它需要一种强制性的胶合剂–云不可知的方法&#xff0c;并在所有提供商之间实现互操作性。…

python股票预测代码_python用线性回归预测股票价格的实现代码

线性回归在整个财务中广泛应用于众多应用程序中。在之前的教程中&#xff0c;我们使用普通最小二乘法(OLS)计算了公司的beta与相对索引的比较。现在&#xff0c;我们将使用线性回归来估计股票价格。线性回归是一种用于模拟因变量(y)和自变量(x)之间关系的方法。通过简单的线性回…

如何在Spring中将@RequestParam绑定到对象

您是否在请求映射方法中用RequestParam注释了多个参数&#xff0c;并认为它不可读&#xff1f; 当请求中需要一个或两个输入参数时&#xff0c;注释看起来非常简单&#xff0c;但是当列表变长时&#xff0c;您可能会感到不知所措。 您不能在对象内部使用RequestParam批注&…

java替换指定位置字符_JS中的替换,以及替换指定位置的字符串

批量修改name属性中的值// 渲染完成&#xff0c;开始修改ansewer的name属性$(‘.sub_timu_zong_tihao‘).each(function(i){$(this).find(‘input[name*bianhao]‘).each(function(){// 首先获取name的值&#xff0c;对console.log(‘正在修改bianhao‘)var old$(this).attr(‘…

webstorm前端调用后端接口_软件测试面试题:怎么去判断一个bug是前端问题还是后端问题...

大家好&#xff0c;在软件测试面试过程中&#xff0c;经常有面试官问到这个问题&#xff0c;那我们应该如何回答才好呢&#xff1f;少废话&#xff0c;直接看答案&#xff1a;答案&#xff1a;在页面上发现bug之后&#xff0c;要想判断这个问题属于后端还是前端&#xff0c;我就…

spring基于注释的配置_基于注释的Spring MVC Web应用程序入门

spring基于注释的配置这是使Maven启动Spring 3 MVC项目的最小方法。 首先创建spring-web-annotation/pom.xml文件&#xff0c;并包含Spring依赖项&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apach…

ad09只在一定范围内查找相似对象_dxp查找相似对象

(Edit→Find Similar Objects)ShifF 查找 相似对象 EOS(Edit→Origin→Set)设置坐标原点 ESN((Edit → Select → Net) 选中显示某个网 络 FA(......“ctrlA”全选,选择需要修改的器 件,点鼠标右键弹出如下图的菜单: 选择 “查找相似对象” 移动鼠标到需要修改的属性上,点“ok”…

首次适应算法_CVPR 2020丨?商汤TSD目标检测算法获得Open Images冠军

编者按&#xff1a;此前&#xff0c;在文章《商汤科技57篇论文入选ICCV 2019&#xff0c;13项竞赛夺冠》里&#xff0c;商汤君报道了商汤科技荣获Open Images Object Detection Challenge 2019 冠军。由Google AI主办的Open Images大赛是目前通用物体检测和实例分割两个领域中数…