自动装箱拆箱发生在基本类型和其包装型互操作的时候。
以前一直不知的拆箱和装箱是valueOf和xxValue的别名。是语法糖的一种
public static void main(String[] args) {
Integer i = 10;
Integer j = 10;
System.out.println(j == i); //(1) true update1.1 如果i是反序列化回来的,那么不论值为多少,都不能==,因为反序列会生成新对象,不会调用valueOf了
i = 10000;
j = 10000;
System.out.println(j == i); //(2) false
i = new Integer(10000);
System.out.println(i == 10000); //(3) true
System.out.println(10000 == i); //(4) true
System.out.println(i == 10000L);//(5) true
}
(1)处的结果是 true。
(2)处的结果是false。
(3)处的结果是true,true,true
(1),(2)处的结果不同让人惊讶。i = 10;和i=10000;发生了自动装箱,编译器自动编译成 Integer.valueOf(10)和Integer.valueOf(10000)。看看这个方法的实现。
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
看到某些Integer对象是有缓存的,范围是-128,到high。
再看看IntegerCachestatic 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++);
}
high默认是127,可以通过integerCacheHighPropValue
调整,看看这个属性的说明
/**
* 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)
private static String integerCacheHighPropValue;
可以通过该参数调整缓存的范围 -XX:AutoBoxCacheMax=<size>
3,4,5处发生拆箱,编译之后其实调用了intValue,或者longValue。获得的是基本类型。
总结: 两个包装类型的值比较,最好不要用 ==
分享到:
相关推荐
本文将详细解析"jedit-syntax-2.2.2.zip"压缩包中的语法高亮组件,帮助用户更好地理解和利用这一强大的工具。 首先,"jedit-syntax-2.2.2"是jEdit的一个特定版本,该版本包含了对多种编程语言的语法高亮支持。语法...
在开发过程中,为了提高代码可读性和维护性,语法高亮是必不可少的工具。Vue Syntax Highlight 插件正是为了解决这个问题而诞生的,它专为Vue.js开发环境提供代码高亮功能。在Sublime Text这样的文本编辑器中,这个...
至于标签中的 "jdk",虽然与 Vue.js 和 Sublime Text 的语法高亮不直接相关,但如果你在开发过程中使用 Java,确保你已经正确安装并配置了 JDK,这对于运行依赖 Java 的工具(如某些构建工具)是必要的。 总之,...
通过以上介绍,我们可以看出,ZSH语法高亮插件"zsh-syntax-highlighting"是提升ZSH使用体验的有效工具,它不仅让命令行更具视觉吸引力,还增强了代码的可读性和错误检测能力。对于任何经常在终端环境中工作的开发者...
Unexpected end of file in conditional started on line xxx ----从xxx 开始的条件语句尚未结束文件不能结束 Unknown assemble instruction ----------------未知的汇编结构 houjiuming Unknown option ---------...
Java try-with-resource 语法糖详解 Java try-with-resource 语法糖是 Java 1.7 中新增的一种语法糖,它主要用于简化资源的关闭操作。该语法糖可以自动关闭资源,无需开发者手动编写关闭代码,从而避免了资源泄露。...
liquid-syntax-mode, sublime text的流 语法模式 Siteleaf 流 支持 Sublime 文本这是shopify液体语法,它是基于 Django的Djaniero包。安装建议: 使用包控制插件安装。 搜索"。siteleaf 流 语法"。手动安装或者:克隆...
npm install react-syntax-highlighter --save 为什么要这样一个? React还有其他语法高亮器,为什么要使用它呢? 最大的原因是,所有其他原因都依赖于在componentDidMount和componentDidUpdate触发调用以突出显示...
Atom-tree-sitter-syntax-visualizer.zip,Syntax tree visualizer for tree-sitter树人语法可视化工具,atom是一个用web技术构建的开源文本编辑器。
Atom-one-dark-lite-syntax.zip,Atom syntax theme. one-dark but without the feeling of drowning in red一个深色lite语法主题,atom是一个用web技术构建的开源文本编辑器。
在"elegant-atom-syntax-master"中,我们可以找到`.cson`(CoffeeScript Object Notation)文件,它通常用于存储语法包的配置信息,而`.css`文件则包含具体的颜色和样式规则。 安装这个语法包的方法通常是通过Atom...
`zsh-syntax-highlighting` 是一个用于 Z shell 的语法高亮插件,它为命令行输入提供了丰富的颜色和样式,使用户在输入命令时可以更容易地识别出不同的语法元素,从而提高效率和减少错误。这个插件是开源社区的产物...
"atom-snazzy-clear-syntax" 主题是这个压缩包的核心内容,它位于解压后的 "atom-snazzy-clear-syntax-master" 文件夹中。这个主题的目的是通过精心设计的颜色搭配和样式规则,使代码在视觉上更易于理解,同时保持...
以上就是使用jquery-syntax实现动态语法着色的基本步骤和原理。总结来说,你需要准备jQuery库和jquery-syntax插件,引入必要的JS文件,利用JavaScript动态获取文件内容,然后通过$().syntax()方法,传入相应的参数,...
然后,语法分析器利用这些标记构建抽象语法树(AST,Abstract Syntax Tree),这是一个结构化的表示,反映出源代码的语法规则。这个过程是基于一套预定义的语法规则,通常由上下文无关文法(CFG,Context-Free ...
"xwiki-rendering-syntax-xhtml-6.1-rc-1.zip"这个压缩包,包含了XWiki呈现模块的源代码,特别是针对XHTML语法的处理部分,这对于我们理解XWiki如何处理和渲染XHTML文档非常有价值。 首先,我们来探讨一下XHTML...
在压缩包文件名列表中提到的 "photon-syntax-master" 文件夹,通常包含了该主题的所有源代码和资源。这个文件夹内可能包括一个名为 "syntax" 的子目录,其中存放了用于定义主题的`.cson`(CoffeeScript Object ...
"Atom-photon-dark-syntax-master"这个文件夹很可能包含了该主题的所有源代码和配置文件,用户可以将其导入到Atom中,以便在自己的编辑器中应用这个美观的暗色主题。 为了将这个主题应用到你的Atom编辑器,你需要...