Long vs Integer, long vs int, що використовувати і коли?


Відповіді:


191

Longє Objectформою longі Integerє об'єктною формою int.

longВикористовує 64 біт . Він intвикористовує 32 біти, і тому може містити лише до 2 мільярдів (-2 31 до +2 31 -1).

Ви повинні використовувати longі int, за винятком випадків, коли вам потрібно використовувати методи, успадковані від Objectтаких, як hashcode. Java.util.collectionsметоди зазвичай використовують коробчасті ( Object-загорнені) версії, оскільки їм потрібно працювати для будь-якого Object, а примітивний тип, як-от intабо long, не є Object.

Інша відмінність полягає в тому , що longі intє передача за значенням , в той час як Longі Integerє передача за посиланням значення , як і всі непрімітівние типів Java. Тож якби можна було змінити Longабо Integer(це не так, вони незмінні без використання коду JNI), була б ще одна причина використовувати один над іншим.

Остаточна різниця полягає в тому, що може бути Longабо Integerбути null.


5
@Borealid, це так неправильно, Java завжди передається за значенням, у Java немає нічого такого, як передача посилань.
Дієго Рамос

9
Угу? Гаразд, давайте вивчимо ідею, що Java ніколи не передає посилання. Якщо я називаю функцію, що дає їй int [2], а потім всередині функції я змінюю значення, що міститься в першому елементі цього масиву, чи побачить абонент функції, що зміниться? Так? Ну тому, що те, що було передано функції, було не значенням масиву, а скоріше посиланням на ці значення. "Перейти за значенням" означає, що фактичні дані самі копіюються навколо, без побічних дій. Хто б не вчив вас, що Java є цінною для вас, ви зробили це сумлінно.
Borealid

3
@Borealid ви неправі, значення змінюється, оскільки була створена нова копія посилання на масив, тому хто, хто викликає функцію, побачить зміни, це все одно передається за значенням. Я не можу повірити, що ти скажеш, що на Яві проходить посилання. Ви ніколи не передаєте оригінальну посилання на функцію.
Дієго Рамос

6
У теоретичному світі, де Java поводилася зовсім інакше, ніж це відбувається насправді, і передача об'єкта або масиву функції призвела до абсолютно окремої копії (де зміни всередині функції взагалі не відображалися абонентам), як би ви тоді описати мову? Маючи на увазі, що те, про що ми говоримо, зовсім не те, що робить насправді Java.
Borealid

2
@DiegoRamos має рацію. Java завжди передається за значенням, плутанина створюється через те, що значення, коли непомітивне
Panthro

28

Є кілька речей, які ви не можете зробити з примітивним типом:

  • Мають nullзначення
  • синхронізувати на них
  • Використовуйте їх як параметр типу для загального класу та пов'язаний з цим:
  • Передайте їх API, який працює з Objects

Якщо вам не потрібен будь-який із них, вам слід віддати перевагу примітивним типам, оскільки вони потребують меншої пам’яті.


24
  • За замовчуванням використовуйте int, коли тримаєте номери.
  • Якщо діапазон intзанадто малий, використовуйте along
  • Якщо діапазон longзанадто малий, використовуйтеBigInteger
  • Якщо вам потрібно обробити ваші номери як об’єкт (наприклад, під час введення їх в Collectionобробку null, ...), використовуйте Integer/ Longзамість цього

13

An int- це 32-бітове ціле число; a long- це 64-бітове ціле число. Яку з них використовувати, залежить від того, наскільки великі цифри, які ви очікуєте працювати.

intі longє примітивними типами, тоді як Integerі Longє об'єктами. Первісні типи ефективніші, але іноді потрібно використовувати об’єкти; наприклад, класи колекцій в Java може працювати тільки з об'єктами, так що якщо вам потрібен список цілих чисел , ви повинні зробити це List<Integer>, наприклад , (ви не можете використовувати intв Listбезпосередньо).


6

Ціле число - це підписаний 32-бітний цілочисельний тип

  • Позначається як Int
  • Розмір = 32 bits (4byte)
  • Містить цілі числа діапазону -2,147,483,648 to 2,147,483,647
  • значення за замовчуванням - 0


Long - це підписаний 64-бітний цілочисельний тип

  • Позначається як Long
  • Розмір = 64 bits (8byte)
  • Містить цілі числа діапазону -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • значення за замовчуванням - 0L


Якщо ваше використання змінної потрапляє в 32-бітовий діапазон, використовуйте Int, інакше використовуйте long. Зазвичай довгий використовується для наукових обчислень, і подібні речі потребують великої точності. (напр., значення pi).

Прикладом вибору одного над іншим є справа YouTube. Вони вперше визначили лічильник перегляду відео як intпереповнений, коли було отримано більше 2,147,483,647 переглядів, які надійшли до популярного відео. Оскільки Intлічильник не може зберігати значення більше, ніж його діапазон, YouTube змінив лічильник на 64-бітну змінну і тепер може нараховувати до 9,223,372,036,854,775,807 переглядів. Зрозумійте свої дані та виберіть тип, який відповідає 64-бітовій змінній, і це займе подвійну пам'ять, ніж 32-бітну змінну.


1

Якщо мова йде про використання дуже довгого числа, яке може перевищувати 32 біти для представлення, ви можете використовувати довгі, щоб переконатися, що у вас не буде дивної поведінки.

З Java 5 ви можете використовувати функції боксу та поза боксу, щоб зробити використання int і Integer повністю однаковим. Це означає, що ви можете:

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

І з боксу дозволяють перемикатися між міжнар і Integer без додаткової конвертації ( то ж саме для Long, Double, Shortтеж)

Ви можете використовувати intвесь час, але Integerмістить кілька допоміжних методів, які можуть допомогти вам зробити складні операції з цілими числами (наприклад, Integer.parseInt(String))


0

а) об'єкт Клас "Довгий" проти примітивного типу "довгий". (Принаймні на Java)

б) Існують різні (навіть незрозумілі) розміри пам'яті примітивних типів:

Java - все зрозуміло: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • байт, char .. 1B .. 8b
  • короткий int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • довгий інт .. 8В .. 64б

C .. просто безлад: https://en.wikipedia.org/wiki/C_data_types

  • короткий .. .. 16б
  • int .. .. .. 16b ... wtf?!?!
  • довго .. .. 32б
  • довго довго .. 64б .. безлад! : - /

Це не дає відповіді на питання про різницю між довгим та довгим тощо
GreenAsJade

Ні, він прямо не відповідає на нього, не чітко кажучи про різницю між примітивними типами та об'єктами типу даних, насправді @GreenAsJade, тому що питання тут вище не містить жодної конкретної мови. Тому я представив порівняння - щоб кожен міг перевірити різницю. (із твердих даних, як це передбачено)
Franta

Питання заявляло Java.
GreenAsJade
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.