有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    JVM缓存-127到127之间的整数值
    这就是为什么==适用于此范围之间的整数值

    但是:

    Integer i1=new Integer("11");
    Integer i2=new Integer("11");
    System.out.println(i1==i2); //false
    
    Integer i3=11;
    Integer i4=11;
    System.out.println(i3==i4); //true
    
    Integer i5=128;
    Integer i6=128;
    System.out.println(i5==i6); //false
    
  2. # 2 楼答案

    如果您在Integer类中检查equals方法实现,它是:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    

    从这里你可以看到它使用“==”运算符

    现在是它背后的原因。最终,您必须比较Integer包装器类的值,这将由于Java中的自动装箱和取消装箱而自动发生

    从方法定义中,您还可以看到它正在使用((Integer)obj).intValue()检索传递的Object

  3. # 3 楼答案

    阿萨米特·巴蒂(asAmit Bhati)在我们写作时回答说:“让我更详细地解释一下。”

        Integer i1=new Integer("11");
        Integer i2=new Integer("11");
        System.out.println(i1==i2); //false
    

    jvm创建两个独立的对象,并将它们与“==”进行比较,结果为false。但当我们编写以下代码时:

        Integer i3=11;
        Integer i4=11;
        System.out.println(i3==i4); //true
    

    这将转化为:

        Integer i3=Integer.valueOf(11);
        Integer i4=Integer.valueOf(11);
    

    valueOf方法的实现如下(在java 1.8中):

        public static Integer valueOf(int var0) {
        return var0 >= -128 && var0 <= Integer.IntegerCache.high?Integer.IntegerCache.cache[var0 + 128]:new Integer(var0);
    }
    

    正如您所看到的,如果该值介于-128和最大缓存值之间(可以使用这个jvm参数-Djava.lang.Integer.IntegerCache.high配置),它将检索缓存值,并且不会创建Integer的新实例,这就是为什么(=)对某些值返回true

    还要注意同样适用于字符包装类,但不适用于Float和Double类