转换基元vs创建基元的对象

时间:2016-03-13 22:38:28

标签: java

我不习惯将原语数据类型转换为对象。看到一些代码如:

public static int CompareAges(Person p1, Person p2) {
    Integer age1 = p1.getAge();
    return age1.compareTo(p2.getAge());
}

age1的实例化似乎无关紧要,所以我尝试将代码编写为:

public static int CompareAges(Person p1, Person p2) {
    return p1.getAge().compareTo(p2.getAge());
}

但是这引发了编译器错误,因为p1.getAge()是原始数据类型int而不是Integer,它是一个对象。

直观地说,我做了:

public static int CompareAges(Person p1, Person p2) {
    return ((Integer) p1.getAge()).compareTo(p2.getAge());
}

它有效!

问题:我错过了什么?从什么时候开始将基元作为值类型

开始

3 个答案:

答案 0 :(得分:6)

这是内部发生的事情:

date

但是,在我看来,1. Integer age1 = p1.getAge(); Integer != int Integer = Integer.valueOf(int) Integer age1 = Integer.valueOf(p1.getAge()); 2. p1.getAge().compareTo(p2.getAge()); int.compareTo(int) ^^^ // it's just a primitive type, as a result - the compile error 3. ((Integer) p1.getAge()).compareTo(p2.getAge()) Integer.compareTo(int) Integer.compareTo(Integer.valueOf(int)) ((Integer) p1.getAge()).compareTo(Integer.valueOf(p2.getAge())) 4. (Integer) p1.getAge() ---> Integer.valueOf(p1.getAge()) // why so? look at callOfCode's answer 看起来很难看。

我会将其替换为

((Integer) p1.getAge()).compareTo(p2.getAge())

p1.getAge() > p2.getAge() ? 1 : (p1.getAge() < p2.getAge() ? -1 : 0)

在这种情况下,我不想做演员。

有关“自动装箱/拆箱”的更多信息,您可能会发现here

答案 1 :(得分:3)

Each primitive has its own boxing type

enter image description here

拳击可以是隐含的(自动装箱)或显式的,就像你在代码中所做的那样。

p2.getAge()是自动装箱或隐式拳击的示例。方法compareTo采用对象。由于它是原语,Java会自动将其转换为对应的Boxing Object(Integer)。你使用演员(Integer) p1.getAge()

进行了明确的拳击

答案 2 :(得分:3)

Integer integer = (Integer)primitive;Integer.valueOf(primitive)之间的差异仅在字节码级别上。在第一种情况下,在内存中创建Integer类的新对象。在第二种情况下,Integer在内部调用。这是静态方法,它检查原语是否落入-128到127的范围内,如果它落下,它将从整数缓存中返回值,并且不会创建新对象。如果它不属于该范围,则实例化新的int z = 1; Integer a = (Integer)z; Integer b = (Integer)z; //Prints true, since Integer object is retrieved from cache (range of -128 to 127) System.out.println(a == b); int w = 999; Integer c = (Integer)w; Integer d = (Integer)w; //Prints false, since 999 is not in cache, new Integer objects are instantiated and they points to different places in memory System.out.println(c == d); 对象。它用于提高效率。但是这种效率在任何时候都是无关紧要的。

margin-left:20px