我对System.err.print()执行控制有疑问。每次执行时,打印语句的顺序都不同。我有两个问题。
以下是代码
public class AutoBoxingProblems {
public static void main(String[] args) {
problem1();
problem2();
}
private static void problem2() {
System.out.println("Problem2");
// Be very careful, Even values are same but two different objects, this will give you equal
Integer i1 = 100;
Integer i2 = 100;
if (i1 == i2) {
System.err.println("i1 and i2 is equal ==> Problem2");
} else {
System.err.println("i1 and i2 is not equal ==> Problem2");
}
}
private static void problem1() {
System.out.println("Problem1");
// Be very careful, Even values are same, this will give you unequal
Integer i1 = 260;
Integer i2 = 260;
if (i1 == i2) {
System.err.println("i1 and i2 is equal ==> Problem1");
} else {
System.err.println("i1 and i2 is not equal ==> Problem1");
}
}
}
//Output
//Some times
Problem1
Problem2
i1 and i2 is not equal ==> Problem1
i1 and i2 is equal ==> Problem2
//Some times
Problem1
i1 and i2 is not equal ==> Problem1
i1 and i2 is equal ==> Problem2
Problem2
问题1:为什么每次执行时,print语句顺序都不同?
问题2:为什么一个方法打印的值相等而其他方法说不相等? (为了比较值,我们应该仅使用'等于。但为什么' =='运算符表现得很奇怪?)
答案 0 :(得分:1)
来自JLS 5.1.7. Boxing Conversion
如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。的
It is always the case that r1 == r2
强>
您正在为值100
获取相同的对象,因为JVM会将其缓存
来自Immutable Objects / Wrapper Class Caching
256在-128到127范围内创建整数对象,这些对象都存储在整数数组中。通过查看Integer中的内部类IntegerCache可以看到这种缓存功能:
这就是为什么以下陈述是正确的:
Integer i1 = 100; // return Cached object
Integer i2 = 100; // return Cached object
if (i1 == i2) { //both object are same that's why its true
对于Integer i1 = 260;
,它会返回新对象,其中if (i1 == i2)
为假。
Integer i1 = 260; // return new object
Integer i2 = 260; // return new object
if (i1 == i2) { // both object are different that's why false
<强>问题1 强>
因为System.err.println
和System.out.println
使用不同的线程。所以他们可以随时打印,但是每个流中的打印顺序应该相同意味着第一个问题1然后问题2
答案 1 :(得分:0)
i1和i2是Integer
个对象,所以你必须比较调用正确的方法而不是使用==
打印顺序看起来是随机的,因为system.err有自己的流 您需要添加一个刷新以强制每次在
之后打印流System.err.println("i1 a
...
答案 2 :(得分:0)
int
类型是基元,如果您已将其声明为
if (i1 == i2)
对其进行比较
int i1 = 100;
int i2 = 100;
而'整数'类型是一个对象,可以使用.equals
来检查对象
if (i1.equals(i2){...}
但如果那些引用相同的对象,则可能返回true。
那么使用==然后呢?
简单地比较对象引用和检查以查看两个操作数是否指向同一对象而不是等效对象。
答案 3 :(得分:0)
Integer是java中的一个对象。在进行比较时
if (i1 == i2)
然后你要比较他们的参考,而不是那些值。您应该使用原始数据类型'int'。
答案 4 :(得分:0)
问题1:为什么在每次执行中,print语句的顺序都不同?
您正在使用两个不同的输出流SELECT * FROM DATA LIMIT 30 OFFSET 30;
和System.out
。
缓存输出流,因此所有写入都会进入此内存缓冲区。经过一段时间的安静,他们实际上已经写出来了。
Java: System.out.println and System.err.println out of order