エラーが発生しやすい要約:intとIntegerの長引く

質問をするときに、このタイプの質問に頻繁に遭遇しますか?

  • int i1 = 128;
    整数i2 = 128;
    Assert.assertTrue(i1 == i2);

しかし、あなたはintとIntegerの違いについてあまり明確ではありません
、私の友人、あなたの福祉はここにあります、私はあなたのために2つの違いを以下に詳細に説明します:

1.メモリ内のintとIntegerの割り当て:

ここに画像の説明を挿入

  • 1. Int type整数値を割り当てます。サイズに関係なく、定数プールで検索されます。存在する場合は参照を返し、そうでない場合は作成してから参照を返します。
  • 2.整数型整数値を割り当てます。-128から127の範囲の値が最初に定数プールを検索します。存在する場合はこの参照を直接返し、そうでない場合は定数プールに作成してから返します。このリファレンス。範囲外では、整数オブジェクトがヒープ内に作成され、オブジェクトの属性値は定数プール内の定数を指します。
  • 3.整数型と整数型の比較では、整数型オブジェクトのボックスが自動的に解除されます。これは、実際には整数と整数の値属性間の比較であるため、値が-128〜127の範囲にあるかどうかに関係なく、値が等しい、それらは等しい。
  • 4.整数と整数比較は、2つの整数が定数プールオブジェクトを指しているのか、ヒープ内のオブジェクトを指しているのかによって異なります。新しいInteger()によって割り当てられている限り、それは間違いなく等しくありません。また、整数i = 10などの定数を使用してすべて割り当てられている場合、-128〜127の範囲では、すべて定数プールオブジェクトを指しているため、等しくなります。範囲外で割り当てられている場合は、そうではありません。等しい。

2.コードについて:

// 基本数据类型==比较都是比较字面量
    @Test
    public void test1_1(){
    
    // 测试通过
        int i1 = 10;
        int i2 = 10;
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test1_2(){
    
    // 测试通过
        int i1 = 128;
        int i2 = 128;
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test1_3(){
    
    // 测试通过
        int i1 = 128;
        char c = (char) 128;
        Assert.assertTrue(i1 == c);
    }
    @Test
    public void test1_4(){
    
    // 测试通过
        int i1 = 128;
        double d = 128.0;
        Assert.assertTrue(i1 == d);
    }

    // Integer与int比较,都会进行自动拆装箱,实际是Integer中
    // 的value与int进行比较,所以不管大小,只要值相等,这两个变量就相等。
    @Test
    public void test2_1(){
    
    // 测试通过
        int i1 = 10;
        Integer i2 = 10;
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test2_2(){
    
    // 测试通过
        int i1 = 128;
        Integer i2 = 128;
        Assert.assertTrue(i1 == i2);
    }

    // Integer与Integer比较,如果都是常量赋值的,那么在-128到127范围内的比较,就是常量池对象的比较,如果在范围外,
    // 就是堆里边对象的比较。
    @Test
    public void test3_1(){
    
    // 测试通过
        Integer i1 = 10;
        Integer i2 = 10;
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test3_2(){
    
    // 测试不能通过
        Integer i1 = 128;
        Integer i2 = 128;
        Assert.assertTrue(i1 == i2);
    }

    // Integer与Integer比较,不管大小,如果有一个是new Integer()的方式
    // 创建的,那肯定就不相等。
    @Test
    public void test4_1(){
    
    // 测试不能通过
        Integer i1 = 10;
        Integer i2 = new Integer(10);
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test4_2(){
    
    // 测试不能通过
        Integer i1 = 128;
        Integer i2 = new Integer(128);
        Assert.assertTrue(i1 == i2);
    }

おすすめ

転載: blog.csdn.net/qq_45658339/article/details/112135686