Long vs Integer, long vs int, apa yang digunakan dan kapan?

137

Kadang-kadang saya melihat penggunaan API longatau Longatau intatau Integer, dan saya tidak tahu bagaimana keputusan dibuat untuk itu?

Kapan saya harus memilih apa?

Saya tahu cara mencentang V.
sumber

Jawaban:

192

Longadalah Objectbentuk dari long, dan Integermerupakan bentuk objek dari int.

The longmenggunakan 64 bit . The intpenggunaan 32 bit, sehingga hanya bisa menampung angka sampai dengan ± 2 miliar (-2 31 ke +2 31 -1).

Anda harus menggunakan longdan int, kecuali jika Anda perlu menggunakan metode yang diwarisi dari Object, seperti hashcode. Java.util.collectionsmetode biasanya menggunakan versi kotak ( Object-wrapped), karena mereka perlu bekerja untuk apa saja Object, dan tipe primitif, seperti intatau long, bukan Object.

Perbedaan lainnya adalah bahwa longdan intmerupakan nilai-demi-nilai , sedangkan Longdan Integermerupakan nilai referensi yang dilewati , seperti semua tipe Java non-primitif. Jadi jika dimungkinkan untuk mengubah Longatau Integer(tidak, mereka tidak dapat diubah tanpa menggunakan kode JNI), akan ada alasan lain untuk menggunakan salah satu dari yang lain.

Perbedaan terakhir adalah bahwa a Longatau Integerbisa jadi null.

Borealid
sumber
5
@Borealid, ini sangat salah, Java selalu melewati nilai, tidak ada yang seperti referensi lewat di Jawa.
Diego Ramos
9
Uh huh? Oke, mari kita jelajahi gagasan bahwa Java tidak pernah memberikan referensi. Jika saya memanggil fungsi yang memberinya int [2], dan kemudian di dalam fungsi saya mengubah nilai yang dipegang di elemen pertama dari array itu, akankah pemanggil fungsi melihat perubahan itu? Iya? Itu karena apa yang diteruskan ke fungsi bukanlah nilai dalam array, melainkan referensi ke nilai-nilai itu. "Pass by value" berarti data aktual itu sendiri sedang disalin tanpa tipuan. Siapa pun yang mengajari Anda bahwa Java adalah nilai-demi-nilai, apakah Anda merugikan.
Borealid
3
@Borealid Anda salah, nilainya berubah karena salinan baru dari referensi ke array telah dibuat, itulah sebabnya siapa pun yang memanggil fungsi akan melihat perubahan, ini masih melewati nilai. Saya tidak percaya Anda mengatakan bahwa ada referensi lewat di Jawa. Anda tidak pernah melewatkan referensi asli ke fungsi tersebut.
Diego Ramos
6
Dalam dunia teoretis di mana Java berperilaku sangat berbeda dari yang sebenarnya, dan meneruskan objek atau larik ke suatu fungsi menghasilkan salinan yang benar-benar terpisah (di mana modifikasi di dalam fungsi tidak tercermin sama sekali ke pemanggil), bagaimana Anda kemudian? gambarkan bahasanya? Perlu diingat bahwa apa yang kita bicarakan sama sekali bukan apa yang sebenarnya dilakukan Java.
Borealid
2
@DiegoRamos benar. Java selalu melewati nilai, kebingungan dibuat karena nilai ketika non primitif adalah referensi memori, pertukaran statis tidak berfungsi di java, lebih jelasnya di sini: journaldev.com/3884/…
Panthro
29

Ada beberapa hal yang tidak dapat Anda lakukan dengan tipe primitif:

  • Punya nullnilai
  • sinkronkan pada mereka
  • Gunakan mereka sebagai parameter tipe untuk kelas generik, dan terkait dengan itu:
  • Berikan mereka ke API yang bekerja dengan Objects

Kecuali Anda membutuhkan salah satu dari itu, Anda harus memilih tipe primitif, karena mereka membutuhkan lebih sedikit memori.

Michael Borgwardt
sumber
24
  • Secara default gunakan int, saat menahan angka.
  • Jika kisaran intterlalu kecil, gunakan along
  • Jika kisaran longterlalu kecil, gunakanBigInteger
  • Jika Anda perlu menangani nomor Anda sebagai objek (misalnya saat memasukkannya ke dalam Collection, menangani null, ...) gunakan Integer/ Longsebagai gantinya
Joachim Sauer
sumber
13

An intadalah integer 32-bit; a longadalah bilangan bulat 64-bit. Yang mana yang akan digunakan tergantung pada seberapa besar angkanya yang ingin Anda kerjakan.

intdan longmerupakan tipe primitif, sedangkan Integerdan Longmerupakan objek. Tipe primitif lebih efisien, tetapi terkadang Anda perlu menggunakan objek; misalnya, kelas koleksi Java hanya dapat bekerja dengan objek, jadi jika Anda memerlukan daftar bilangan bulat, Anda harus membuatnya List<Integer>, misalnya (Anda tidak dapat menggunakannya intsecara Listlangsung).

Jesper
sumber
6

Integer adalah tipe integer 32 bit bertanda

  • Dilambangkan sebagai Int
  • Ukuran = 32 bits (4byte)
  • Dapat menampung bilangan bulat jangkauan -2,147,483,648 to 2,147,483,647
  • nilai default adalah 0


Long adalah tipe integer 64 bit yang ditandatangani

  • Dilambangkan sebagai Long
  • Ukuran = 64 bits (8byte)
  • Dapat menampung bilangan bulat jangkauan -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • nilai default adalah 0L


Jika penggunaan Anda atas variabel termasuk dalam kisaran 32 bit, gunakan Int, else use long. Biasanya panjang digunakan untuk perhitungan ilmiah dan hal-hal seperti itu membutuhkan banyak ketelitian. (misalnya nilai pi).

Contoh memilih salah satu dari yang lain adalah kasus YouTube. Mereka pertama-tama mendefinisikan penghitung penayangan video sebagai penghitung intyang meluap ketika lebih dari 2.147.483.647 penayangan diterima sebagai video populer. Karena Intpenghitung tidak dapat menyimpan nilai lebih dari kisarannya, YouTube mengubah penghitung ke variabel 64 bit dan sekarang dapat menghitung hingga 9.223.372.036.854.775.807 tampilan. Pahami data Anda dan pilih jenis yang cocok karena variabel 64 bit akan membutuhkan memori dua kali lipat daripada variabel 32 bit.

Semua Vаиітy
sumber
1

Ketika menggunakan angka yang sangat panjang yang mungkin melebihi 32 bit untuk diwakili, Anda dapat menggunakan panjang untuk memastikan bahwa Anda tidak akan memiliki perilaku aneh.

Dari Java 5 Anda dapat menggunakan fitur in-boxing dan out-boxing untuk menggunakan int dan Integer sepenuhnya sama. Artinya, Anda dapat melakukan:

int myInt = new Integer(11);
Integer myInt2 = myInt;

Masuk dan keluar tinju memungkinkan Anda untuk beralih antara int dan Integer tanpa konversi tambahan (sama untuk Long, Double, Shortjuga)

Anda boleh menggunakan intsepanjang waktu, tetapi Integerberisi beberapa metode pembantu yang dapat membantu Anda melakukan beberapa operasi kompleks dengan bilangan bulat (seperti Integer.parseInt(String))

Houcem Berrayana
sumber
0

a) Kelas objek "Panjang" versus tipe primitif "panjang". (Setidaknya di Jawa)

b) Ada ukuran memori yang berbeda (bahkan tidak jelas) dari tipe primitif:

Java - semuanya jelas: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • byte, char .. 1B .. 8b
  • int pendek .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • int panjang .. 8B .. 64b

C .. hanya mengacaukan: https://en.wikipedia.org/wiki/C_data_types

  • pendek .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • panjang .. .. 32b
  • panjang panjang .. 64b .. berantakan! : - /
Franta
sumber
Ini tidak menjawab pertanyaan, yaitu tentang perbedaan antara Panjang dan panjang dll.
GreenAsJade
Tidak, itu tidak secara eksplisit menjawabnya, tidak secara eksplisit mengatakan perbedaan antara objek tipe primitif vs. tipe data, memang @GreenAsJade, karena pertanyaan di atas tidak menyatakan bahasa tertentu. Jadi saya memberikan perbandingan - sehingga setiap orang dapat memeriksa perbedaannya. (dari data keras, sebagaimana disediakan)
Franta
Pertanyaan itu menyatakan Jawa.
GreenAsJade