从Java 5开始,我们已经对原始类型进行了装箱/拆箱,因此它int被包装成java.lang.Integer等等.
我最近看到了很多新的Java项目(肯定需要一个至少版本为5的JRE,如果不是6个),int而不是java.lang.Integer使用后者,尽管使用后者要方便得多,因为它有一些帮助方法可以转换到long的值等.
为什么有些人仍然在Java中使用原始类型?有什么实际好处吗?
我遇到了一个使用Integer变量的类来捕获要在for循环中使用的大小.这是一个好的做法还是我们应该使用int原始数据类型?
Integer size = something.getFields().size();
for (Integer j = 0; j < size - 1; ++j)
Run Code Online (Sandbox Code Playgroud) 我正在阅读Kathy Sierra和Bert Bates的SCJP Java 6,这本书让我很困惑.在页245上,他们在下面说明以下代码.
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2)
System.out.println("different objects");
//Prints output
different objects
Run Code Online (Sandbox Code Playgroud)
然后在下一页上,他们有以下代码
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4)
System.out.println("same objects");
//Prints output
same objects
Run Code Online (Sandbox Code Playgroud)
我很困惑!当我自己尝试这个时,似乎你不能使用==来比较你使用equals()方法的方式.即使整数变量设置为相同的值(即10),使用==总是给我'假'.我对么?使用==来比较相同的Integer对象(具有相同的值)将始终导致'false'
我有应该是相等的整数(我通过输出验证它).但在我的if条件下,Java并没有看到这些变量具有相同的值.
我有以下代码:
if (pay[0]==point[0] && pay[1]==point[1]) {
game.log.fine(">>>>>> the same");
} else {
game.log.fine(">>>>>> different");
}
game.log.fine("Compare:" + pay[0] + "," + pay[1] + " -> " + point[0] + "," + point[1]);
Run Code Online (Sandbox Code Playgroud)
它产生以下输出:
FINE: >>>>>> different
FINE: Compare:: 60,145 -> 60,145
Run Code Online (Sandbox Code Playgroud)
可能我必须添加这样point定义:
Integer[] point = new Integer[2];
Run Code Online (Sandbox Code Playgroud)
并且pay我们从环路构造采取:
for (Integer[] pay : payoffs2exchanges.keySet())
Run Code Online (Sandbox Code Playgroud)
因此,这两个变量都具有整数类型.
在下面的类中,我试图将包装器类与原始类进行比较,但结果不同。
我检查了以下链接链接:
更为有趣的问题是,为什么
new Object();每次都需要创建一个唯一实例?即为什么new Object();不允许缓存?答案是wait(...)和notify(...)。缓存newObject()会错误地导致线程在不应该同步时彼此同步。
如果有一个新的对象,然后是如何a和c平等的吗?
如果b等于c且c等于a,a则应等于b。但在以下情况下,我得到了a != c。
请解释。
class WrapperCompare {
public static void main (String args[]) {
Integer a = new Integer(10);
Integer b = 10;
int c=10;
System.out.println(b==c); //true
System.out.println(a==b); //false
System.out.println(a==c); //true
}
}
Run Code Online (Sandbox Code Playgroud)
更新:通过引用此链接Integer caching。
基本上,Integer类会将Integer实例的缓存保留在-128到127的范围内,并且所有自动装箱,文字和Integer.valueOf()的使用都会从该缓存返回其覆盖范围内的实例。
因此,在这种情况下,所有语句都应为真。
我在Java(JDK 1.7)中偶然发现了这个:
Integer a = 100;
Integer b = 100;
Integer c = 1000;
Integer d = 1000;
System.out.println(a == b); //true
System.out.println(c == d); //false
System.out.println(new Integer(100) == new Integer(100)); //false
System.out.println(new Integer(1000) == new Integer(1000)); //false
Run Code Online (Sandbox Code Playgroud)
输出为:true false false false
为什么== b评估为真?这是什么原因?这类似于String内化吗?
我有以下代码:
Integer first = new Integer(4);
Integer second = new Integer(4);
System.out.println(first == second);
Integer third = 4;
System.out.println(first == third);
System.out.println(second == third);
Run Code Online (Sandbox Code Playgroud)
由于 4 介于 -128 到 127 之间,我希望包装 4 的 Integer 对象在第一次创建后就被缓存,然后为其他装箱语句返回,因此 '==' 检查必须返回 true。但对于以上三种情况,它总是错误的。
为什么会这样?
看看这段代码
Integer x = 5;
Integer y = 2;
Integer xy = x+y;
System.out.println("xy = " + xy); // outputs: 7
System.out.println("xy2 = " + xy2); // outputs: 7
x++;
System.out.println("xy = " + xy); // outputs: 7
System.out.println("xy2 = " + xy2); // outputs: 7
Run Code Online (Sandbox Code Playgroud)
如何在不使用为您计算代码的方法的情况下输出代码8?
这个问题是因为我阅读了这一行.通过调用构造函数方法创建了一个对象的新实例. 我是agrre但构造函数的方法是什么..?一个OObject或一个类本身..?..抱歉,如果它是一个业余问题,但我还在学习java,我发现它很难理解.
这让我想起哪个是第一只鸡还是鸡蛋..?
编辑:
可能是我的问题不明确,我知道如何创建对象,每个类都有一个构造函数,但我想知道的是,堆中的每个对象都有自己的实例变量副本.以同样的方式,他们也会有一个带有它们的构造函数或者它只是类只有类的东西.
将Integer声明为两种方式之间有什么区别吗?
Integer Age = 25;
Integer Age = new Integer(25);
Run Code Online (Sandbox Code Playgroud) java ×10
autoboxing ×3
equals ×3
integer ×3
primitive ×2
comparison ×1
constructor ×1
if-statement ×1
instance ×1
int ×1
jdk1.5 ×1
variables ×1
wrapper ×1