当前位置: 首页 > 面试题库 >

java整数参考

印高阳
2023-03-14
问题内容

我有一个问题。

public class Jaba {

    public static void main(String args[]) {
        Integer i = new Integer(0);        
        new A(i);
        System.out.println(i);
        new B(i);
        System.out.println(i);
        int ii = 0;        
        new A(ii);
        System.out.println(ii);
        new B(ii);
        System.out.println(ii);    
    }

}

class A {

    public A(Integer i) { ++i; }

}

class B {

    public B(int i) { ++i; }

}

我认为将int \ Integer作为Integer传递给函数并对该引用进行++应该会更改基础对象,但是在所有情况下输出均为0。这是为什么?


问题答案:

如其他答案所述,Java仅 按值调用 ,而++运算符仅影响变量,而不影响对象。如果要模拟 按引用调用
,则需要传递一个可变对象(如数组)并修改其元素。

Java
API为此有一些专门的对象,例如java.util.concurrent.atomic.AtomicInteger(它还可以在多个线程上工作)和org.omg.CORBA.IntHolder(用于CORBA机制的远程调用的按引用调用)。

但是您也可以简单地定义自己的可变整数:

class MutableInteger {
    public int value;
}


class C {
   public C(int[] i) {
       ++i[0];
   }
}
class D {
   public D(MutableInteger i) {
       ++i.value;
   }
}
class E {
   public E(AtomicInteger i) {
       i.incrementAndGet();
   }
}
public class Jaba {
    public static void main(String args[]) {

        int[] iii = new int[]{ 0 };
        System.out.println(iii[0]);
        new C(iii);
        System.out.println(iii[0]);
        MutableInteger mi = new MutableInteger();
        System.out.println(mi.value);
        new D(mi);
        System.out.println(mi.value);
        MutableInteger ai = new AtomicInteger(0);
        System.out.println(ai);
        new E(ai);
        System.out.println(ai);
    }
}


 类似资料:
  • 问题内容: 如何检查Java整数是否为另一个数字的倍数?例如,if 是4的倍数。 问题答案: 使用余数运算符(也称为模运算符),该运算符返回除法的余数,并检查其是否为零:

  • 问题内容: 我之前曾使用Scikit-learn的GridSearchCV优化模型的超参数,但只是想知道是否存在类似的工具来优化Tensorflow的超参数(例如 历元数,学习率,滑动窗口大小等 )。 如果没有,如何实现有效运行所有不同组合的代码段? 问题答案: 使用Tensorflow进行网格搜索的另一个可行的(已记录)选项是Ray Tune 。它是用于超参数调整的可扩展框架,专门用于深度学习/

  • 模板参数除了类型外(包括基本类型、结构、类类型等),也可以是一个整型数(Integral Number)。这里的整型数比较宽泛,包括布尔型,不同位数、有无符号的整型,甚至包括指针。我们将整型的模板参数和类型作为模板参数来做一个对比: template <typename T> class TemplateWithType; template <int V> class TemplateWit

  • 问题内容: 假设我想基于整数id值进行锁定。在这种情况下,有一个函数可从缓存中提取一个值,如果该值不存在,则会进行相当昂贵的检索/存储到缓存中。 现有代码不同步,并且可能触发多个检索/存储操作: 我想做的是同步ID上的检索,例如 不幸的是,这是行不通的,因为两个单独的调用可以具有相同的Integer id值,但是可以具有不同的Integer对象,因此它们将不会共享锁,并且不会发生同步。 有没有一种

  • 问题内容: 在Java中使用标志时,我看到了两种主要方法。使用int值和一组if-else语句。另一个是使用枚举和case-switch语句。 我想知道在使用枚举和整数进行标记之间在内存使用和速度方面是否存在差异? 问题答案: 双方并可以同时使用开关或IF-THEN-ELSE和内存使用情况也是最小的两个,而速度是类似的-有关于你提到的点之间没有显著差异。 但是,最重要的区别是类型检查。被检查,不是

  • 问题内容: 在C中,整数(对于32位计算机)为32位,范围为-32,768至+32,767。在Java中,整数(long)也是32位,但范围为-2,147,483,648至+2,147,483,647。 我不了解Java中的范围有何不同,即使位数相同。有人可以解释吗? 问题答案: 在C语言中,语言本身无法确定某些数据类型的表示形式。它因机器而异,在嵌入式系统上int可以为16位宽,尽管通常为32位