KodeGym/Blog Jawa/Acak/Java.lang.Integer Class
John Squirrels
tingkat
San Francisco

Java.lang.Integer Class

Diterbitake ing grup
Jinis data Jawa bisa dipérang dadi rong blok: primitif lan referensi (kelas). Ana sawetara jinis data primitif ing Jawa, kayata integer ( byte , short , int , long ), floating point numbers ( float , double ), logical data type ( boolean ) lan karakter data type ( char ). Sampeyan mbokmenawa wis ngerti yen saben jinis data primitif duwe kelas pambungkus dhewe. Jinis data referensi sing "bungkus" utawa ngowahi adhine primitif ing obyek Jawa. Integer minangka kelas bungkus kanggo bro primitif sing jenenge int. Integer ing basa Inggris tegese nomer wutuh. Padha bisa positif, negatif utawa 0. Sayange, integer ing Jawa ora ateges nomer wutuh. Integer ing java minangka nomer wutuh sing cocog karo 32 bit. Yen sampeyan pengin nomer luwih gedhe sampeyan olèh nggunakake nomer Jawa Long . Padha duwe 64 bit ing pembuangan. Yen sampeyan cukup apes kanggo perlu nomer malah luwih gedhe Jawa wis dijamin karo BigInteger .

Nggarap Integer

Minangka kelas wrapper, Integer nyedhiyakake macem-macem cara kanggo nggarap int , uga sawetara cara kanggo ngowahi int dadi String lan String menyang int . Kelas kasebut nduweni rong konstruktor:
  • public Integer(int i) , ngendi i minangka nilai primitif kanggo initialise. Iki nggawe obyek Integer sing diinisialisasi karo nilai int .

  • public Integer(String s) mbuwang NumberFormatException . Punika minangka perwakilan senar saka nilai int . Konstruktor iki nggawe obyek Integer sing diwiwiti kanthi nilai int sing diwenehake dening perwakilan string .

Nggawe obyek integer

Ana macem-macem opsi nggawe obyek Integer . Salah siji sing paling umum digunakake yaiku sing paling gampang. Punika conto:
Integer myInteger = 5;
Initialization saka variabel Integer ing kasus iki padha karo initialization saka variabel int primitif . Kanthi cara sampeyan bisa miwiti variabel Integer kanthi nilai int . Punika conto:
int myInt = 5;
Integer myInteger = myInt;
System.out.println(myInteger);
Output ing kene yaiku:
5
Nyatane, ing kene kita bisa mirsani pengepakan otomatis. Kita uga bisa nggawe obyek Integer kaya obyek liyane nggunakake konstruktor lan tembung kunci anyar :
Integer myInteger = new Integer(5);
Sampeyan bisa nindakake karo variabel Integer padha karo int (nambah, nyuda, multiply, dibagi, increment, decrement). Nanging, iku penting kanggo elinga yen Integer minangka jinis data referensi, lan variabel saka jinis iki bisa null. Ing kasus iki, luwih becik nolak operasi kasebut.
Integer myInteger1  = null;
Integer myInteger2 = myInteger1 + 5;
Ing kene kita bakal entuk pangecualian:
Pangecualian ing utas "utama" java.lang.NullPointerException"

Konstanta kelas integer

Kelas Integer nyedhiyakake macem-macem konstanta lan cara kanggo nggarap integer. Punika:
  • SIZE tegese jumlah bit ing sistem nomer rong digit dikuwasani dening jinis int

  • BYTES minangka jumlah bita ing sistem nomer rong digit sing dikuwasani dening jinis int

  • MAX_VALUE minangka nilai maksimum sing bisa ditahan dening jinis int

  • MIN_VALUE minangka nilai minimal sing bisa ditahan jinis int

  • TYPE ngasilake obyek saka jinis Kelas saka jinis int

Kelas integer cara paling migunani

Saiki ayo ndelok cara sing paling akeh digunakake ing kelas Integer . Sing paling populer, aku ngira, yaiku cara kanggo ngowahi nomer saka String , utawa kosok balene.
  • static int parseInt(String s) cara iki ngowahi String kanggo int . Yen konversi ora bisa, NumberFormatException bakal dibuwang.

  • static int parseInt(String s, int radix) cara iki uga ngowahi parameter s menyang int . Parameter radix nuduhake sistem nomer s asli ditulis.

Saliyane parseInt , ana uga metode valueOf sing padha ing sawetara variasi. Nanging, asil valueOf bakal Integer , lan parseInt bakal int .
  • Statis Integer valueOf(int i) ngasilake Integer kang nilai i ;

  • statis Integer valueOf(String s) dianggo kaya parseInt(String s) , nanging asil bakal Integer , ora int ;

  • statis Integer valueOf(String s, int radix) dianggo padha karo parseInt(String s, int radix) , nanging asil integer , ora int .

Apa ana masalah karo kelas Integer? Yo wis, ana…

Dadi ana rong jinis integer (sing cocog karo 32 bit) ing Jawa: int lan Integer . Kanggo ngerti spesifik saben wong, kita kudu ngerti ing ngisor iki babagan model memori JVM: kabeh sing sampeyan wara-wara disimpen ing Stack Memory (JVM Stack tartamtu kanggo saben Thread), utawa Heap Space. Jinis primitif ( int , long , float , boolean , double , char , byte , etc) disimpen ing memori Stack. Kabeh Obyek lan susunan disimpen ing Heap Space. Referensi kanggo obyek lan array sing dibutuhake kanggo metode kasebut disimpen ing Stack. Dadi. Napa kita peduli? Inggih, sampeyan ndeleng, Stack luwih cilik tinimbang Heap (con), nanging luwih cepet alokasi nilai ing Stack, tinimbang Heap (pro). Ayo dadi miwiti karo jinis primitif int . Butuh nganti persis 32 bit. Iku 32/8 = 4 bita. Amarga iku jinis primitif. Saiki, ayo nimbang Integer . Iku obyek, karo overhead ekstra lan alignments. Aku wis nggunakake perpustakaan jol kanggo ngukur ukuran:
public static void main(String[] args) {
 	System.out.println(ClassLayout.parseInstance(Integer.valueOf(1)).toPrintable());
}
lan ternyata njupuk 16 bita:
java.lang.Integer object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (header obyek: tandha) 0x000000748c90e301 (hash: 0x748c90e3; umur: 0) 8 4 (header obyek: kelas) 0x00000748c90e301 (hash: 0x748c90e3; umur: 0) 8 4 (header obyek: kelas) 0x000000000000000 16 byte
opo?! Sing 4 kaping luwih memori! Nanging aja nganti mandheg ing kana. Minangka pangembang Java, kita biasane ora mandheg nggunakake siji integer. Sing dikarepake yaiku nggunakake akeh. Kaya ing urutan. Contone, ing array. Utawa Dhaptar. Arrays disimpen ing Heap, minangka Dhaptar. Dadi, alokasi kudu njupuk kira-kira jumlah wektu sing padha. bener? Nanging apa yen kita kudu nyedhiakke memori liyane? Ayo dipriksa pira papan sing ditindakake dening array 1000 nilai int primitif :
public static void main(String[] args) {
    	int[] array = new int[1000];
    	for (int i = 0; i < 1000; i++) array[i] = i;                System.out.println(ClassLayout.parseInstance(array).toPrintable());
}
Lan asile 4016 byte:
NILAI DESKRIPSI JENIS SZ OFF 0 8 (header obyek: tandha) 0x0000000000000001 (non-biasa; umur: 0) 8 4 (header obyek: kelas) 0x00006c38 12 4 (panjang array) 1000 (palignment 12) / 6pa [I.<elemen> N/A Ukuran Instance: 4016 byte Kehilangan spasi: 4 byte internal + 0 byte eksternal = 4 byte total
OK, sing nggawe pangertèn, considering int siji njupuk 4 byte. Kepiye babagan ArrayList<Integer> saka 1000 Integer ? Ayo dideleng:
public static void main(String[] args) {
	List<Integer> list = new ArrayList<>(1000);
	for (int i = 0; i < 1000; i++) list.add(i);
      System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
Lan asile 20040 byte (maneh, kaping 4!):
java.util.ArrayList@66d3c617d footprint: COUNT AVG SUM DESCRIPTION 1 4016 4016 [Ljava.lang.Object; 1000 16 16000 java.lang.Integer 1 24 24 java.util.ArrayList 1002 20040 (total)
Dadi, ArrayList<Integer> njupuk ruang memori 4 kaping luwih akeh. Iku ora apik. Nanging tetep, Dhaptar luwih gampang amarga kita bisa nambah lan mbusak unsur! Oh Jawa... Kok kudu dikotak kabeh?! Nanging, aku lali, Jawa iku gedhe, lan gedhene dumunung ing turah mbrawah saka perpustakaan open source sing bisa digunakake! Trove4j iku salah siji saka wong-wong mau. Wis TIntArrayList sing internal duwe data int [] . Ayo diukur ukurane:
public static void main(String[] args) {
	TIntList list = new TIntArrayList(1000);
	for (int i = 0; i < 1000; i++) list.add(i);
	System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
Lan asile 4040 byte (meh padha karo mung int [] !):
gnu.trove.list.array.TIntArrayList@7440e464d footprint: COUNT AVG SUM DESCRIPTION 1 4016 4016 [I 1 24 24 gnu.trove.list.array.TIntArrayList 2 4040 (total)
Dadi, ing pungkasan, kita bisa entuk sing paling apik ing jagad iki! Dhaptar integer sing njupuk 4 kaping kurang spasi. Lan iki ora kalebu integer Integer . Mung int s. We Java devs tenan Care babagan memori ... Nanging kita uga Care babagan kinerja. Ana perpustakaan microbenchmarking apik karo jeneng andhap asor jmh sing ngijini kita ngukur kinerja kode. Kaping pisanan, ayo mbandhingake kinerja ngitung jumlah rong integer acak, kothak, utawa ora: Konfigurasi kanggo jmh kaya ing ngisor iki:
benchmark {
	configurations {
    	main {
        	warmups = 5 // number of warmup iterations
        	iterations = 50 // number of iterations
        	iterationTime = 500 // time in seconds per iteration
        	iterationTimeUnit = "ns" // time unit for iterationTime
benchmarks:
private static final Random random = new Random();

@Benchmark
public int testPrimitiveIntegersSum() {
	int a = random.nextInt();
	int b = random.nextInt();
	return a + b;
}

@Benchmark
public Integer testBoxedIntegersSum() {
	Integer a = random.nextInt();
	Integer b = random.nextInt();
	return a + b;
}
asil:
utama: test.SampleJavaBenchmark.testBoxedIntegersSum 5693337,344 ±(99,9%) 1198774,178 ops/s [Rata-rata] (min, rata-rata, maks) = (1092314,989, 5693337,344), 5693337,344 583.144 CI (99.9%): [4494563.166, 6892111.522] (nganggep distribusi normal) utama: test.SampleJavaBenchmark.testPrimitiveIntegersSum 15295010,959 ±(99,9%) 2555447,456 ops/s [Rata-rata] (min, rata-rata, maks) = (4560097,0259, 4560097,0259, 4560097,0259,456 ), stdev = 5162130.283 CI (99.9%): [12739563.502, 17850458.415] (nganggep distribusi normal)
Dadi, rata-rata, alokasi, lan jumlah int primitif luwih saka kaping pindho luwih cepet tinimbang Integer kothak. Saiki, ayo mbandhingake kinerja nggawe lan pitungan jumlah koleksi (utawa susunan 1000 int saka Integer):
@Benchmark
public int testPrimitiveArray() {
	int[] array = new int[1000];
	for (int i = 0; i < 1000; i++) array[i] = i;
	int sum = 0;
	for (int x : array) sum += x;
	return sum;
}
11933.545 ops/s [Average]


@Benchmark
public int testBoxesArray() {
	Integer[] array = new Integer[1000];
	for (int i = 0; i < 1000; i++) array[i] = i;
	int sum = 0;
	for (int x : array) sum += x;
	return sum;
}
2733.312 ops/s [Average]


@Benchmark
public int testList() {
	List<Integer> list = new ArrayList<>(1000);
	for (int i = 0; i < 1000; i++) list.add(i);
	int sum = 0;
	for (int x : list) sum += x;
	return sum;
}
2086.379 ops/s [Average]


@Benchmark
public int testTroveIntList() {
	TIntList list = new TIntArrayList(1000);
	for (int i = 0; i < 1000; i++) list.add(i);
	int sum = 0;
	for (int i = 0; i < 1000; i++) sum += list.get(i);
	return sum;
}
5727.979 ops/s [Average]
Asil: array primitif luwih saka 4 kaping luwih cepet saka array saka nilai kothak ( Integer s); meh kaping enem luwih cepet tinimbang ArrayList nilai kothak ( Integer s); lan kaping pindho minangka cepet minangka TIntArrayList (sing bener decorates Uploaded ints primitif). Mulane, yen sampeyan butuh struktur data kanggo nyimpen koleksi nilai integer, lan ukurane ora bakal diganti, gunakake int [] ; yen ukuran bakal diganti - sampeyan bisa uga pengin nggunakake perpustakaan tove4j karo TIntArrayList . Lan ing kene pungkasane karangan ing ngendi aku nerangake kontra nggunakake jinis Integer . Ana sawetara cara statis Integer sing menarik , sing kudu dakkandhakake sadurunge rampung. public static Integer getInteger (String nm, int val) ora nindakake apa sing bisa dipikirake, nanging njupuk nilai Integer saka properti sistem. Val minangka standar yen properti iki ora disetel. public static String toBinaryString(int i) ngasilake String kanthi perwakilan binar saka nomer. Ana cara kanggo njupuk basis-16 ( toHexString ) lan basis-8 ( toOctalString ) representasi. Ana cara kanggo ngurai String dadi int . Sanajan senar kasebut minangka perwakilan adhedhasar radix non-10. Ing ngisor iki sawetara conto: Integer.parseInt ("-FF", 16) ngasilake -255 Integer.parseInt ("+42", 10) ngasilake 42 Integer.parseInt ("1100110", 2) ngasilake 102
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar