Javaには、基本型のオブジェクト、整数、プリミティブの両方のバージョンintがあります。Javaプリミティブの実装
プリミティブバージョンの方が高速/軽い/などです。一般的にはそれらを使うべきです。
私は、Javaのデザイナーがオブジェクトタイプを持っていて、プリミティブバージョンをシーンの裏に最適化するだけではないのではないかと疑問に思っています。
だから:
Integer foo(Integer alpha)
{
Integer total = 0;
for(Integer counter = 0; counter < alpha; counter++)
{
total += counter;
}
return total;
}
は、次のようなコードを何かにコンパイルされます:
int foo(int alpha)
{
int total = 0;
for(int counter = 0; counter < alpha; counter++)
{
total += counter;
}
return total;
}
基本的には、同等のプリミティブ型に整数、ダブル、フロートなどのインスタンスを変換します。この仮想的なJavaコンパイラ。オブジェクトが本当に必要な場合(つまり、要素をコンテナに入れるというだけで)、実際のIntegerオブジェクトが関与することになります。
注:上記のコードは、実際には許可されていないことがわかっている整数オブジェクトの演算子を使用しています。私は仮説的なJavaコンパイラを発明しているので、これはStringのようにInteger/Float/Doubleのための特別なケースを持っているようです。
正確な複製はありませんしかし、私はこの情報をhttp://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in-java – corsiKa
@glowcoderでたくさんカバーしています。私はそのすべてを知っています。しかし、私は、Javaがシーンの背後にあるこのすべてをやっていて、私たちがそれを心配する必要がないようにするものがあるかどうか疑問に思っています。つまり、パフォーマンスの問題はありません。なぜなら、コンパイラがLongの使用を長時間に変換するのは簡単であると思われるからです。 –
大きな問題は、あなたの例が単なる単純すぎるということです。私は非常に喜んでJavaはプリミティブを持っています。彼らはハードウェアにまっすぐマップし、私は障害としてそれらを見たことはありません。極端なエスケープ解析ツールを求めるのは、あまりにも多くのことを求めているだけです。 Integer []を想像してください。どの程度簡単に最適化し、エスケープして解析し、int []と同じコードを生成しますか?Integerはnullになります。 Morealso整数は不変であり、いくつかの最適化を防ぎ、さらに解析を必要とする最終的なフィールドを持っています。 – bestsss