为什么每次执行java执行顺序都不同?价值比较是错误的

时间:2016-04-22 04:56:58

标签: java equals

我对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:为什么一个方法打印的值相等而其他方法说不相等? (为了比较值,我们应该仅使用'等于。但为什么' =='运算符表现得很奇怪?)

5 个答案:

答案 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.printlnSystem.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

Java IO: System.in, System.out, and System.error