`
jilen
  • 浏览: 98631 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

装箱和拆箱和ValueOf以及XXXValue -- Java语法糖(Syntax sugar)

    博客分类:
  • java
阅读更多

自动装箱拆箱发生在基本类型和其包装型互操作的时候。

以前一直不知的拆箱和装箱是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。获得的是基本类型。

 

 

总结: 两个包装类型的值比较,最好不要用 ==

 

2
2
分享到:
评论
2 楼 Rejoy 2012-08-11  
正想写这个的   已经被你写了 呵呵
1 楼 chenjingbo 2011-10-28  
说的很仔细.. ..不错

相关推荐

    jedit-syntax-2.2.2.zip_jedit-syntax-2.2.2_语法高亮

    本文将详细解析"jedit-syntax-2.2.2.zip"压缩包中的语法高亮组件,帮助用户更好地理解和利用这一强大的工具。 首先,"jedit-syntax-2.2.2"是jEdit的一个特定版本,该版本包含了对多种编程语言的语法高亮支持。语法...

    语法高亮插件vue-syntax-highlight

    在开发过程中,为了提高代码可读性和维护性,语法高亮是必不可少的工具。Vue Syntax Highlight 插件正是为了解决这个问题而诞生的,它专为Vue.js开发环境提供代码高亮功能。在Sublime Text这样的文本编辑器中,这个...

    vue-syntax-highlight-master

    至于标签中的 "jdk",虽然与 Vue.js 和 Sublime Text 的语法高亮不直接相关,但如果你在开发过程中使用 Java,确保你已经正确安装并配置了 JDK,这对于运行依赖 Java 的工具(如某些构建工具)是必要的。 总之,...

    zsh-syntax-highlighting.zip

    通过以上介绍,我们可以看出,ZSH语法高亮插件"zsh-syntax-highlighting"是提升ZSH使用体验的有效工具,它不仅让命令行更具视觉吸引力,还增强了代码的可读性和错误检测能力。对于任何经常在终端环境中工作的开发者...

    C++出错提示英汉对照表

    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 try-with-resource 语法糖是 Java 1.7 中新增的一种语法糖,它主要用于简化资源的关闭操作。该语法糖可以自动关闭资源,无需开发者手动编写关闭代码,从而避免了资源泄露。...

    liquid-syntax-mode, sublime text的流 语法模式.zip

    liquid-syntax-mode, sublime text的流 语法模式 Siteleaf 流 支持 Sublime 文本这是shopify液体语法,它是基于 Django的Djaniero包。安装建议: 使用包控制插件安装。 搜索"。siteleaf 流 语法"。手动安装或者:克隆...

    react-syntax-highlighter:语法高亮组件,用于使用内联样式与prismjs或highlightjs ast进行交互

    npm install react-syntax-highlighter --save 为什么要这样一个? React还有其他语法高亮器,为什么要使用它呢? 最大的原因是,所有其他原因都依赖于在componentDidMount和componentDidUpdate触发调用以突出显示...

    Atom-tree-sitter-syntax-visualizer,树的语法树可视化工具.zip

    Atom-tree-sitter-syntax-visualizer.zip,Syntax tree visualizer for tree-sitter树人语法可视化工具,atom是一个用web技术构建的开源文本编辑器。

    Atom-one-dark-lite-syntax,原子语法主题。一.zip

    Atom-one-dark-lite-syntax.zip,Atom syntax theme. one-dark but without the feeling of drowning in red一个深色lite语法主题,atom是一个用web技术构建的开源文本编辑器。

    Atom-elegant-atom-syntax,一个温和的atom编辑器语法包(与优雅的atom ui主题配合使用).zip

    在"elegant-atom-syntax-master"中,我们可以找到`.cson`(CoffeeScript Object Notation)文件,它通常用于存储语法包的配置信息,而`.css`文件则包含具体的颜色和样式规则。 安装这个语法包的方法通常是通过Atom...

    zsh-syntax-highlighting

    `zsh-syntax-highlighting` 是一个用于 Z shell 的语法高亮插件,它为命令行输入提供了丰富的颜色和样式,使用户在输入命令时可以更容易地识别出不同的语法元素,从而提高效率和减少错误。这个插件是开源社区的产物...

    Atom-atom-snazzy-clear-syntax,现代、优雅、干净和一致的Atom语法主题.zip

    "atom-snazzy-clear-syntax" 主题是这个压缩包的核心内容,它位于解压后的 "atom-snazzy-clear-syntax-master" 文件夹中。这个主题的目的是通过精心设计的颜色搭配和样式规则,使代码在视觉上更易于理解,同时保持...

    jquery-syntax动态语法着色示例代码

    以上就是使用jquery-syntax实现动态语法着色的基本步骤和原理。总结来说,你需要准备jQuery库和jquery-syntax插件,引入必要的JS文件,利用JavaScript动态获取文件内容,然后通过$().syntax()方法,传入相应的参数,...

    语法分析器 Java

    然后,语法分析器利用这些标记构建抽象语法树(AST,Abstract Syntax Tree),这是一个结构化的表示,反映出源代码的语法规则。这个过程是基于一套预定义的语法规则,通常由上下文无关文法(CFG,Context-Free ...

    xwiki-rendering-syntax-xhtml-6.1-rc-1.zip

    "xwiki-rendering-syntax-xhtml-6.1-rc-1.zip"这个压缩包,包含了XWiki呈现模块的源代码,特别是针对XHTML语法的处理部分,这对于我们理解XWiki如何处理和渲染XHTML文档非常有价值。 首先,我们来探讨一下XHTML...

    Atom-photon-syntax,Atom的黑色语法主题。贡献给Maximsokolov/光子.zip

    在压缩包文件名列表中提到的 "photon-syntax-master" 文件夹,通常包含了该主题的所有源代码和资源。这个文件夹内可能包括一个名为 "syntax" 的子目录,其中存放了用于定义主题的`.cson`(CoffeeScript Object ...

    Atom-atom-photon-dark-syntax,光子暗语法主题。对光照/原子的贡献.zip

    "Atom-photon-dark-syntax-master"这个文件夹很可能包含了该主题的所有源代码和配置文件,用户可以将其导入到Atom中,以便在自己的编辑器中应用这个美观的暗色主题。 为了将这个主题应用到你的Atom编辑器,你需要...

Global site tag (gtag.js) - Google Analytics