Іноді я бачу API, з допомогою long
або Long
чи int
або Integer
, і я не можу зрозуміти , як це прийнято рішення для цього?
Коли я повинен вибрати що?
Іноді я бачу API, з допомогою long
або Long
чи int
або Integer
, і я не можу зрозуміти , як це прийнято рішення для цього?
Коли я повинен вибрати що?
Відповіді:
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
.
Є кілька речей, які ви не можете зробити з примітивним типом:
null
значенняObject
sЯкщо вам не потрібен будь-який із них, вам слід віддати перевагу примітивним типам, оскільки вони потребують меншої пам’яті.
int
, коли тримаєте номери.int
занадто малий, використовуйте along
long
занадто малий, використовуйтеBigInteger
Collection
обробку null
, ...), використовуйте Integer
/ Long
замість цьогоAn int
- це 32-бітове ціле число; a long
- це 64-бітове ціле число. Яку з них використовувати, залежить від того, наскільки великі цифри, які ви очікуєте працювати.
int
і long
є примітивними типами, тоді як Integer
і Long
є об'єктами. Первісні типи ефективніші, але іноді потрібно використовувати об’єкти; наприклад, класи колекцій в Java може працювати тільки з об'єктами, так що якщо вам потрібен список цілих чисел , ви повинні зробити це List<Integer>
, наприклад , (ви не можете використовувати int
в List
безпосередньо).
Int
32 bits (4byte)
-2,147,483,648 to 2,147,483,647
Long
64 bits (8byte)
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Якщо ваше використання змінної потрапляє в 32-бітовий діапазон, використовуйте Int
, інакше використовуйте long
. Зазвичай довгий використовується для наукових обчислень, і подібні речі потребують великої точності. (напр., значення pi).
Прикладом вибору одного над іншим є справа YouTube. Вони вперше визначили лічильник перегляду відео як
int
переповнений, коли було отримано більше 2,147,483,647 переглядів, які надійшли до популярного відео. ОскількиInt
лічильник не може зберігати значення більше, ніж його діапазон, YouTube змінив лічильник на 64-бітну змінну і тепер може нараховувати до 9,223,372,036,854,775,807 переглядів. Зрозумійте свої дані та виберіть тип, який відповідає 64-бітовій змінній, і це займе подвійну пам'ять, ніж 32-бітну змінну.
Якщо мова йде про використання дуже довгого числа, яке може перевищувати 32 біти для представлення, ви можете використовувати довгі, щоб переконатися, що у вас не буде дивної поведінки.
З Java 5 ви можете використовувати функції боксу та поза боксу, щоб зробити використання int і Integer повністю однаковим. Це означає, що ви можете:
int myInt = new Integer(11);
Integer myInt2 = myInt;
І з боксу дозволяють перемикатися між міжнар і Integer без додаткової конвертації ( то ж саме для Long
, Double
, Short
теж)
Ви можете використовувати int
весь час, але Integer
містить кілька допоміжних методів, які можуть допомогти вам зробити складні операції з цілими числами (наприклад, Integer.parseInt(String)
)
а) об'єкт Клас "Довгий" проти примітивного типу "довгий". (Принаймні на Java)
б) Існують різні (навіть незрозумілі) розміри пам'яті примітивних типів:
Java - все зрозуміло: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
C .. просто безлад: https://en.wikipedia.org/wiki/C_data_types