質問をするときに、このタイプの質問に頻繁に遭遇しますか?
- 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);
}