首页 > 编程语言 >JAVA基础-----128陷阱

JAVA基础-----128陷阱

时间:2024-07-09 09:01:51浏览次数:15  
标签:JAVA int cache static ----- 127 128 Integer

一、何为128陷阱

Java中Integer类型在使用==比较时的特殊行为------128陷阱,解释了当数值在-128到127范围内,由于valueOf方法的缓存机制导致地址相同,比较为真;超出这个范围则新分配内存,地址不同,比较为假。

可以预测一下下面程序的输出结果:

答案在最后后面!

二、造成该现象的原因

 让我们追寻到 Integer 数据类型的 valueOf 方法的源码:

原因就是:Integer 的 valueOf 方法当中,存储着一个 cache 数组,该数组相当于一个缓存,范围在 -128~127 闭区间。

cache数组初始化的源码:

    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer[] cache;
        static Integer[] archivedCache;

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    h = Math.max(parseInt(integerCacheHighPropValue), 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(h, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            // Load IntegerCache.archivedCache from archive, if possible
            CDS.initializeFromArchive(IntegerCache.class);
            int size = (high - low) + 1;

            // Use the archived cache if it exists and is large enough
            if (archivedCache == null || size > archivedCache.length) {
                Integer[] c = new Integer[size];
                int j = low;
                for(int i = 0; i < c.length; i++) {
                    c[i] = new Integer(j++);
                }
                archivedCache = c;
            }
            cache = archivedCache;
            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

当在该范围中进行自动装箱的时候,直接返回该值的内存地址(即 cache 数组的地址),所以在 -128~127 之间的数值用 == 进行比较时结果是相等(true),相当于比较的是同一元素的内存地址。不在该范围的数,需要开辟一个新的内存空间,此时内存地址就不相同了,所以返回结果是不相等(false)。

注意:如果对象是 new 出来的(如下),那么就不会存在128陷阱。原因是 new 出来的对象,内存地址都是不同的,比较的就不是同一个对象了。

标签:JAVA,int,cache,static,-----,127,128,Integer
From: https://blog.csdn.net/qq_62571013/article/details/140282048

相关文章

  • Day 2 - 分治与倍增
    分治的延伸应用应用场景优化合并假设将两个规模\(\frac{n}{2}\)的信息合并为\(n\)的时间复杂度为\(f(n)\),用主定理分析时间复杂度\(T(n)=2\timesT(\frac{n}{2})+f(n)\)。能直观的看出优化程度还是很大的。归并排序中\(f(n)=O(n)\),则\(T(n)=O(n\logn)\)。......
  • 快捷键收录-学习阶段非常适用
    Shift+Ctrl+L   选中语句,可以对其语句进行注释,我已经实验,可以按不同格式注释Alt+鼠标左键  按住鼠标左键,向下移动,出现多个光标就可以多行写重复的语句Ctrl+A            全选语句Ctrl+C        复制Ctrl+V           粘贴Ctrl......
  • 自建搜索引擎-基于美丽云
    Meilisearch是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。由于成本问题,本博客采用自建的方式,本文就讲讲怎么搭建。‍本文主要参考:meilisearch全接入指南|二丫讲梵:讲了怎么使用官方提供的......
  • javaMap笔记分享
    Map映射(map)是存储键和值间关联(即,键值对)的对象。给定一个键,可以找到其值。键和值都是对象。键必须唯一,但是值可以重复。13.1 支持映射的接口接 口描 述Map将唯一键映射到值NavigableMap扩展SortedMap接口,以处理基于最接近匹配搜索原则的键/值对检索So......
  • java集合笔记分享
    集合 前言集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是容器,它们有啥区别呢?集合和数组的区别:   数组的长度是固定的。集合的长度是可变的。   数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的......
  • mormot.core.threads--TSynParallelProcess
    mormot.core.threads--TSynParallelProcess{************线程池中的并行执行}type///TSynParallelProcess的并行化过程回调//-如果0<=IndexStart<=IndexStop,则应执行某些过程TOnSynParallelProcess=procedure(IndexStart,IndexStop:integer)ofobject;......
  • 实战篇——XSS漏洞xss-labs-master靶场实战一
    实战篇——XSS漏洞xss-labs-master靶场实战(1)XSS的分类(1)反射型XSS攻击者通过电子邮件等方式将恶意链接发送给目标用户。当目标用户点击该链接时,服务器接收该目标用户的请求并把带有恶意脚本的页面发送给目标用户的浏览器,浏览器解析页面时就会执行恶意脚本。(2)存储型XSS......
  • Java核心技术学习笔记(五)
    一、ArrayList,LinkedList,Vector的相同点与区别Java集合框架提供多种数据结构,其中ArrayList、LinkedList和Vector是常用列表实现。它们具有共同特性,如实现List接口、有序性和可动态调整大小,但也存在底层数据结构、线程安全性和性能等方面的区别。选择哪种集合取决于具体使用场景。......
  • 128陷阱详解+源码分析
    128陷阱详解1、什么是128陷阱2、为什么会出现128陷阱3、避免128陷阱的方法1、什么是128陷阱请看下面的程序,注释为运行结果。 Integerb=127; Integerb1=127; System.out.println(b==b1);//true Integerc=128; Integerc1=128; System.out.pr......
  • Java--多态
    1.多态为同一方法根据发送对象的不同而采用多种不同的行为方式2.一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多3.多态存在的条件    1.有继承关系    2.子类重写父类方法    3.父类引用指向子类对象4.多态是方法的多态,属性没有多......