我不习惯将原语数据类型转换为对象。看到一些代码如:
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());
}
它有效!
问题:我错过了什么?从什么时候开始将基元作为值类型?
开始答案 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
拳击可以是隐含的(自动装箱)或显式的,就像你在代码中所做的那样。
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