データ型のIntegerとint
9114 ワード
データ型のIntegerとint
Java入門
基本データ型
Javaはオブジェクト向けの言語であり、すべてがオブジェクトであることはよく知られています.しかし、人間の根強いデータ処理習慣と互換性を備え、従来のデータの処理速度を速めるために、9種類の基本データ型が提供され、オブジェクトの特性を備えず、属性や行為がない.Javaの9つの基本データ型にはboolean、byte、char、short、int、long、double、refvarが含まれています.最初の8つのデータ型は、生活の真偽、文字、整数、小数を表し、最後のrefvarはオブジェクト世界向けの参照変数であり、参照ハンドルとも呼ばれます.ここでは、基本的なデータ型でもあると考えられます.上位8種類に対応するパッケージデータ型があり、charの対応パッケージクラス名はCharacter、intはIntegerのほか、すべての対応するパッケージクラス名は頭文字を大文字にすればよい.これら8種類の基本データ型の空間占有サイズ(bit)や対応するパッケージクラスなどの情報を以下に示す. boolean/1/Boolean byte/8/Byte char/16/Character short/16/Short int/32/Integer float/32/Float long/64/Long double/64/Double
梱包タイプ
最初の8つの基本データ型には、Javaの設計理念がすべてオブジェクトであるため、hashCode()がハッシュ値を取得したり、getClassがクラスを取得したりするなど、オブジェクトの形式で操作する必要がある場合が多い.パッケージクラスの存在は、汎用タイプパラメータ、シーケンス化、タイプ変換、高周波区間データキャッシュなど、基本データ型ではできないことを解決します.最後に重要なのはキャッシュプールです
キャッシュプール
実際にはFloatとDoubleを除いて、他のパッケージタイプがキャッシュされます.次に、Integerを紹介する方法でキャッシュについて説明します.まずコードを見てみましょう
新Integer(123)とInteger.valueOf(123)の違いは、 new Integer(123)は、毎回オブジェクト を新規作成します. Integer.valueOf(123)はキャッシュプール内のオブジェクトを使用し、複数回呼び出すと同じオブジェクトの参照が得られます.
valueOf()メソッドのソースコード.
上記のソースコードのように、付与データiは、キャッシュ区間内でキャッシュプール内のIntegerオブジェクトに直接戻り、そうでなければnewオブジェクトとなる.このため、比較すると次のような問題が発生します.
したがって、すべてのパッケージタイプオブジェクト間の比較を推奨し、equalsメソッドをすべて使用します.
Java 8では、Integerキャッシュプールのサイズはデフォルトで-128~127です.
基本タイプに対応するバッファ・プールは次のとおりです. boolean values true and false all byte values short values between -128 and 127 int values between -128 and 127 char in the range\u0000 to\u007F
関連参考:StackOverflow:Differences between new Integer(123)、Integer.valueOf(123)、and just 123
Java入門
基本データ型
Javaはオブジェクト向けの言語であり、すべてがオブジェクトであることはよく知られています.しかし、人間の根強いデータ処理習慣と互換性を備え、従来のデータの処理速度を速めるために、9種類の基本データ型が提供され、オブジェクトの特性を備えず、属性や行為がない.Javaの9つの基本データ型にはboolean、byte、char、short、int、long、double、refvarが含まれています.最初の8つのデータ型は、生活の真偽、文字、整数、小数を表し、最後のrefvarはオブジェクト世界向けの参照変数であり、参照ハンドルとも呼ばれます.ここでは、基本的なデータ型でもあると考えられます.上位8種類に対応するパッケージデータ型があり、charの対応パッケージクラス名はCharacter、intはIntegerのほか、すべての対応するパッケージクラス名は頭文字を大文字にすればよい.これら8種類の基本データ型の空間占有サイズ(bit)や対応するパッケージクラスなどの情報を以下に示す.
梱包タイプ
最初の8つの基本データ型には、Javaの設計理念がすべてオブジェクトであるため、hashCode()がハッシュ値を取得したり、getClassがクラスを取得したりするなど、オブジェクトの形式で操作する必要がある場合が多い.パッケージクラスの存在は、汎用タイプパラメータ、シーケンス化、タイプ変換、高周波区間データキャッシュなど、基本データ型ではできないことを解決します.最後に重要なのはキャッシュプールです
キャッシュプール
実際にはFloatとDoubleを除いて、他のパッケージタイプがキャッシュされます.次に、Integerを紹介する方法でキャッシュについて説明します.まずコードを見てみましょう
new Integer(123);
Integer.valueOf(123);
新Integer(123)とInteger.valueOf(123)の違いは、
valueOf()メソッドのソースコード.
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
上記のソースコードのように、付与データiは、キャッシュ区間内でキャッシュプール内のIntegerオブジェクトに直接戻り、そうでなければnewオブジェクトとなる.このため、比較すると次のような問題が発生します.
public class TestIntegerCache {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 == i2);
//true
Integer i3 = 500;
Integer i4 = 500;
System.out.println(i3 == i4);
//false
System.out.println(i3.equals(i4));
//true
}
}
したがって、すべてのパッケージタイプオブジェクト間の比較を推奨し、equalsメソッドをすべて使用します.
Java 8では、Integerキャッシュプールのサイズはデフォルトで-128~127です.
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
基本タイプに対応するバッファ・プールは次のとおりです.
関連参考:StackOverflow:Differences between new Integer(123)、Integer.valueOf(123)、and just 123