integerとintの違いとinteger.values()メソッドの詳しい説明

巴扎黑
リリース: 2017-06-26 10:20:01
オリジナル
1557 人が閲覧しました

免責事項: この記事はブロガーによる再投稿記事です。元のアドレスは記事の最後に記載されています。

知識ポイント1: integerとintの違い

/*
* intは、Javaが提供する8つのプリミティブデータ型の1つです。 Java はプリミティブ型ごとにラッパー クラスを提供します。Integer は Java が int に対して提供するラッパー クラスです。 int のデフォルト値は 0、
* で、Integer のデフォルト値は null
* です。つまり、Integer は未​​割り当ての値と値 0 の違いを区別できますが、int は未割り当ての状況を表現できません。たとえば、試験を受けないこととテストのスコアが 0 点であることの違いを表現したい場合は、整数
* のみを使用できます。 JSP 開発では、Integer のデフォルト値は null であるため、el 式を使用してテキスト ボックスに表示すると、値は空の文字列になりますが、int のデフォルト値は 0 であるため、el 式を使用すると、テキストボックスに表示
* した場合、結果は 0 となるため、Web レイヤーのフォームのデータ型として int は適していません。
* Hibernate では、OID が Integer 型として定義されている場合、Hibernate は値が null かどうかに基づいてオブジェクトが一時的であるかどうかを判断できます
* * OID が int 型として定義されている場合は、その値を設定する必要がありますhbm マッピング ファイルの unsaved-value 属性を 0 に設定します。
* さらに、Integer は、文字列を整数に変換するなど、複数の整数関連の演算メソッドを提供します。また、整数の最大値と最小値を表す定数も定義します。
*/

知識ポイント2: integer.values()メソッドの詳しい説明

1System.out.println(Integer.valueOf("127")==Integer.valueOf ("127"));
2
3
システム。 out. println(Integer.valueOf("128")==Integer.valueOf( class= "java string">"128"));
System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));System.out.println(Integer.parseInt ("128")==Integer.valueOf( "128 "));

最初の判定では true が返され、2 番目の判定では false が返されるのはなぜですか? 127 および 128私が知らない違いはありますか? (もちろん127未満128...)

true而第二个判断返回了false127128有什么我不知道的区别吗?(当然除了127小于128…)

还有,为什么第三个判断返回了true
我看了另一个相关提问的回答,但是我还是不知道它们什么时候返回true还有为什么第二个判断返回false

  回答#1:

Integer.valueOf(String)确有一个不同寻常的行为。

valueOf会返回一个Integer(整型)对象,当被处理的字符串在-128127(包含边界)之间时,返回的对象是预先缓存的。这就是为什么第一行的调用会返回true-127

这个整型对象是被缓存的(所以两次valueOf返回的是同一个对象)——第二行的调用返回false是因为128没有被缓存,所以每次调用,都会生成一个新的整型对象,

因此两个128整型对象是不同的对象。

重要的是你要知道在上面的比较中,你实际进行比较的是integer.valueOf返回的对象引用,所以当你比较缓存外的整型对象时,相等的判断不会返回true,就算你

传个valueOf的值是相等的也没用。(就像第二行中Integer.valueOf(128)==Integer.valueOf(128))。想让这个判断返回true,你需要使用equals()方法。

parseInt()返回的不是整型对象,而是一个int型基础元素。这就是为什么最后一个判断会返回true,第三行的判断中,在判断相等时,实际比较的是128 == 128

所以它必然是相等的。

再来说说第三种比较中的一点区别,使得它的结果与第二种比较不一样了:

一个unboxing conversion(一种比较时的转换,把对对象的引用转换为其对应的原子类型)在第三行的比较中发生了。因为比较操作符使用了==同时等号的两边

存在一个int型和一个Integer对象的引用。这样的话,等号右边返回的Integer对象被进一步转换成了int数值,才与左边进行相等判断。

所以在转换完成后,你实际比较的是两个原子整型数值。这种转换正是你在比较两个原子类型时所期待看到的那样,所以你最终比较了128等于128

 

  回答#2:

Integer类有一个静态缓存,存储了256个特殊的Integer对象——每个对象分别对应`-128 和127之间的一个值。
有了这个概念,就可以知道上面三行代码之间的区别。

1
new Integer(123);また、3 番目の判定で trueが返されるのはなぜですか>?
関連する別の質問への回答を読みましたが、いつ true が返されるのか、また、なぜ 2 番目の判定で false が返されるのかがわかりません。

答え #1:

Integer.valueOf(String)確かに存在します。異常な動作が 1 つあります。

valueOf は、処理される文字列が Integer (整数) オブジェクトを返します。 >-128 および 127 (両端を含む) の場合、返されるオブジェクトは事前にキャッシュされます。これが、最初の行の呼び出しが true-127

この整数オブジェクトがキャッシュされる理由です。 valueOf は同じオブジェクトを 2 回返します) - 128 がキャッシュされていないため、2 行目の呼び出しは false を返します。そのため、呼び出されるたびに、新しい整数オブジェクトが生成されます。

そのため、2 つの 128 整数オブジェクトは別のオブジェクトです。

上記の比較では、実際に比較しているのは integer.valueOf であることを知っておくことが重要です返されたオブジェクト参照。したがって、キャッシュの外にある整数オブジェクトを比較する場合、等価性の判定は true を返しません。

値が等しい場合、valueOf を渡しても意味がありません。 (2 行目の Integer.valueOf(128)==Integer.valueOf(128)) のように。この判定で true を返すようにするには、equals() メソッドを使用する必要があります。

parseInt() は整数オブジェクトではなく、int 基本要素を返します。これが、最後の判定で true が返される理由です。等しいかどうかを判定するとき、実際の比較は 128 == 128

したがって、等しい必要があります。

3 番目の比較の小さな違いについて説明します。これにより、結果が 2 番目の比較とは異なります。

3 行目の比較中に、アンボックス化変換 (オブジェクトへの参照を対応するアトミック タイプに変換する比較変換) が発生します。比較演算子は == と等号の両側を使用するため

int 型があり、 Integer オブジェクトへの参照。この場合、等号の右側で返された Integer オブジェクトは、左側と等しくなる前に、さらに int 値に変換されます。

変換が完了すると、実際には 2 つのアトミック整数値を比較することになります。この変換は、2 つのアトミック タイプを比較するときに期待されるものとまったく同じであるため、最終的には 128128 を比較することになります。

答え 2:

Integer クラス256 個の特殊な Integer オブジェクトを格納する静的キャッシュがあり、それぞれが `-128 から 127 までの値に対応します。
この概念を使用すると、上記の 3 行のコードの違いを知ることができます。

1
new Integer(123);
🎜🎜

新しい Integer オブジェクトが作成されたことが示されています。

1Integer对象。
1
Integer.parseInt("123");

解析完字符串后返回一个int值。

1
Integer.valueOf("123");

这种情况比其他的要更复杂一些。首先进行了字符串解析,然后如果解析的值位于-128127之间,就会从静态缓存中返回对象。如果超出了这个范围,就会调用

Integer()方法并将解析的值作为参数传入,得到一个新的对象。

现在,让我们看一下问题中的3个表达式。

1
Integer.valueOf("127")==Integer.valueOf("127");

上面的表达式返回true,因为Integer的值从静态缓存中取了2次,表达式返回了对象与自己比较的结果。因为只有一个Integer对象,所以返回结果为true

1
Integer.valueOf("128")==Integer.valueOf("128");
Integer.parseInt("123");
🎜🎜🎜 🎜解析完字符の後には、int 値が返されます。
1🎜🎜
Integer.valueOf("123");🎜🎜🎜🎜🎜🎜🎜🎜🎜最初に文字列の解析が実行され、解析された値が -128127 の間にある場合は、静的に保存されます。この範囲を超えた場合は、🎜Integer() メソッドが使用され、解析された値がパラメータとして渡され、新しいオブジェクトが取得されます。🎜
1🎜🎜
整数。 valueOf("127")==Integer.valueOf("127");🎜🎜🎜🎜🎜🎜🎜🎜🎜上の表达式はtrueを返します、のせいです整数の値は静的ストレージから2回取得され、表形式はオブジェクトを自分自身と比較した結果を返します。整数オブジェクトが1つしかないため、結果はtrueとして返されます。
1🎜🎜
Integer.valueOf("128" )==Integer.valueOf("128") ;🎜🎜🎜🎜🎜🎜

128 が静的バッファーに存在しないため、上記の式は false を返します。したがって、等しいと判断されるたびに、方程式の両側に新しい Integer オブジェクトが作成されます。 2 つの Integer オブジェクトは異なるため、== は、方程式 false,因为128没有存在静态缓冲区。所以每次在判断相等时等式两边都会创建新的Integer对象。由于两个Integer对象不同,所以==只有等式

两边代表同一个对象时才会返回true。因此,上面的等式返回false

1
Integer.parseInt("128")==Integer.valueOf("128");

上面的表达式比较的是左边的原始int128与右边新创建的Integer对象。但是因为intInteger之间比较是没有意义的,所以Java在进行比较前会将Integer

自动拆箱,所以最后进行的是intint值之间的比较。由于128和自己相等,所以返回true

の両辺が同じオブジェクトを表す場合にのみ true を返します。したがって、上記の式は false を返します。 🎜
1🎜
Integer.parseInt("128")==Integer.valueOf("128");🎜🎜
🎜🎜🎜上記の式は、左側の元の int 値を比較します128 と、右側に新しく作成された Integer オブジェクト。ただし、intInteger の比較は無意味であるため、Java は比較の前に Integer🎜

を変換します。最後の比較は、int 値と int 値の間で行われます。 128 はそれ自体と等しいため、true が返されます。 🎜

以上がintegerとintの違いとinteger.values()メソッドの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート