Tag: autoboxing

使用基元及其包装器重载的方法

我正在尝试制定下面方案中使用的规则。 请解释为什么我得到2个不同的输出。 场景1输出: 我是一个对象。 class Test { public static void main (String[] args) { Test t = new Test(); byte b_var = 10; t.do_the_test(b_var); } public void do_the_test(Character c) { System.out.println(“I am a character.”); } public void do_the_test(Integer i) { System.out.println(“I am an integer.”); } public void do_the_test(Object obj) { System.out.println(“I am an object.”); } […]

Java允许将字节分配给java.lang.Short,但不允许分配给java.lang.Integer

final byte b = 12; Short s = b; Integer i = b; 程序编译为Short,但是对于Integer编译,“不兼容类型”消息失败。 我很难理解这种行为。 我找不到这个特定场景的任何东西..

自动装箱的性能影响

通常,编译器会生成执行装箱和拆箱的代码。 但是如果不需要盒装值,编译器会是什么? (Oracle标准)编译器是否足够智能以优化它? 看看这个方法: public static void requireInRange(int index, Object[] array) { if(index = array.length) throw new IndexOutOfBoundsException(); } 唯一相关的信息是array.length ,因此例如,将数组的每个值包装起来是没用的。 喜欢这段代码: int[] anArray = {3, 4, 2}; requireInRange(3, anArray); 编译器是否会实际插入用于装箱数组的每个值的代码?

Java自动装箱规则

我是一个java新手,并且对以下示例感到困惑。 是否可以认为“==”符号将比较Integers和int中的“autoboxed”整数之间的值,并比较整数之间的参考地址? 那么双打和0/0怎么样? import edu.princeton.cs.introcs.*; public class Autoboxing { public static void cmp(Integer first, Integer second) { if (first < second) StdOut.printf("%d second) StdOut.printf(“%d > %d\n”, first, second); else StdOut.printf(“%d and %d are incomparable\n”, first, second); } public static void main(String[] args) { cmp(new Integer(42), 43); cmp(new Integer(42), new Integer(42)); cmp(43, 43); cmp(142, 142); Integer […]

盒装基元和等价

所以今天我被问到这个问题。 Integer a = 3; Integer b = 2; Integer c = 5; Integer d = a + b; System.out.println(c == d); 这个节目打印出来的是什么? 它返回true。 我回答它总会打印出来,因为我理解自动(和自动联合)拳击。 我的印象是,分配Integer a = 3将创建一个新的Integer(3),以便==将评估引用而不是原始值。 有谁能解释一下?

Java autoboxing和三元运算符疯狂

只花了几个小时调试这段代码: LinkedHashMap rsrqs = new LinkedHashMap(); Integer boxedPci = 52; Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : -1; 上面会产生一个NullPointerException。 以下代码不: LinkedHashMap rsrqs = new LinkedHashMap(); Integer boxedPci = 52; Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : Integer.valueOf(-1); 唯一的区别是用Integer.valueOf()包装-1。 一旦有人解释为什么这个代码的行为方式,我肯定我会打破我的前额..但有人可以向我解释为什么这个代码的行为方式:) – 编辑 第二个想法,我怀疑NPE来自rsrqs.get()返回null,我认为java在尝试解包成int之前,在装回一个Integer之前。 Integer.valueOf()强制Java执行unbox-box步骤。 故事的道德启示; 不要只是忽略Eclipse中的那些拳击警告;)

Java中的自动装箱与手动装箱

为什么第二段代码更快? Map map = new HashMap(); for (int i = 0; i < 50000; i++) { for (double j = 0.0; j < 10000; j++) { map.put(i, j); } } Map map=new HashMap(); for (int i = 0; i < 50000; i++) { for (double j = 0.0; j < 10000; j++) { map.put(new Integer(i), […]

NullPointerException,在三元表达式中具有自动装箱function

运行以下Java代码: boolean b = false; Double d1 = 0d; Double d2 = null; Double d = b ? d1.doubleValue() : d2; 为什么会出现NullPointerException?

在Java 7中使用方法重载时,为什么autoboxing不会覆盖varargs?

我们的Java项目中有一个类LogManager,如下所示: public class LogManager { public void log(Level logLevel, Object… args) { // do something } public void log(Level logLevel, int value, Object… args) { // do something else } } 在Debian下使用OpenJDK 6编译项目时,每个工作都很好。 使用OpenJDK 7时 ,构建(使用ant完成)会产生以下错误,并且构建失败: [javac] /…/LogManager.java:123: error: reference to log is ambiguous, both method log(Level,Object…) in LogManager and method log(Level,int,Object…) in LogManager match […]

java:了解基本类型的Arrays.asList(T … array)方法

我写了下面的代码,并惊讶地看到输出: Integer a = 211; int b = 211; int[] array = {210,211,212}; System.out.println(Arrays.asList(array).contains(a)); System.out.println(Arrays.asList(array).contains(b)); 输出: false false 我发现这个问题和其他一些问题有关,并了解到asList方法不是Autobox的东西。 我在eclipse javadoc预览中检查了返回的类型: 我不太明白这种返回类型。 int[]是一个对象,而不是一个原语,所以很好。 我确定我没有得到List (我期望的东西),但我不知道如何使用返回的东西。 我的问题是: 1.当我期待一个整数列表并获得一个int []列表时,我究竟期望列表方法能够正常工作吗? 2.对于字符串,返回类型是字符串列表而不是字符串列表[]。 有什么样的实施差异? 3.如果事情如此不确定,这种原始方法有什么用呢?