Сравнение Long to simple integer в Java
Почему? Пожалуйста, укажите мне статью в официальных файлах документов, чтобы узнать больше!
Integer Long ^ ^ | | auto-boxing/auto-unboxing | | v v int -----------------------> long primitive promotion
Эта схема показывает, какие неявные преобразования Java могут делать между разными вещами.
В Java объекты и примитивы, к сожалению, являются разными животными: Long и long – это не одно и то же. Неявное преобразование из long в Long называется авто-боксом. Неявное преобразование от Long к long называется автоматическим распаковкой. Такое преобразование описано в разделе 5.1.8 Спецификации языка Java.
Кроме того, как и многие другие языки, Java имеет неявные преобразования между числовыми типами. int неявно продвигается до long если он используется в выражении, которое содержит другие long s. Контексты, в которых эти рекламные акции могут произойти, описаны в разделе 5.6 Спецификации языка Java.
Обратите внимание, что буква 1 в Java имеет тип int . Литерал 1L имеет тип long .
v – Long а -1 – int . Java не знает, как сравнивать объекты и примитивы: он полагается на свои правила конверсии implicits для этого. Здесь -1 преобразуется (автоматически -1 ) в Integer . Итак, мы сравниваем ссылку на два объекта, которые даже не имеют один и тот же тип: тест терпит неудачу.
Это то же самое, что и выше, за исключением того, что это не сравнение, которое вызывает неявное преобразование, а вызов метода. equals принимает Object как параметр, поэтому -1 преобразуется (автоматически -1 ) в Integer . Неявные преобразования, вызванные вызовами методов, описаны в разделе 5.3 Спецификации языка Java.
Long v = . if(v.equals(new Long(-1))) .
Здесь мы называем метод Long.equal Long параметром, поэтому тест преуспевает.
Какое сравнение работает?
-1L long . Он передается методу, который ожидает Object , поэтому он неявно преобразован (автоматически помечен) в Long . Тест успешно завершен.
v.longValue() является long , -1 является int . -1 продвигается до long из-за оператора == . Тест успешно завершен.
Если вы сравниваете long примитивы, вы можете использовать метод longValue().
Однако перед вызовом этого метода вы должны проверить объект Long для null .
Ваши два первых случая сравнивают длину с целым числом (из-за автобоксинга), и они никогда не могут быть одним и тем же объектом (естественно).
Ваш последний случай правильный. Используйте equals() при сравнении объектов.
EDIT: Или методы longValue()/intValue() и т.д., Если вы хотите использовать оператор ==.
Заменить if (path.get(0).equals(-1))
По умолчанию число обрабатывается как целое в java, и, следовательно, сравнение терпит неудачу.
Взгляните на авто-бокс в java для лучшего понимания
Потому что equals() ожидает Object . Вы не можете передать начальное значение в методе equals() . Таким образом, equals(-1) неверно.
if (path.get(0).equals(-1)) //long value
Сравнение Long
Хотел уточнить, а то сомнения бродят в неокрепшем уме. Есть некоторый код:
Long value = getValueFromDB(); if(value==1L){ // code }
Насколько правильно так сравнивать значения? Или лучше использовать equals?
И еще, у Integer есть пулл, есть ли он у Long и других классов-оболочек?
Дополните пожалуйста эти методы! скалярное произведение векторов, умножение на скаляр, сравнение векторов, сравнение
public class VectorTricks < public static void main(String args) < Vector v1 = new.
Сумма 2-х long
Есть ли способ сложения 2-х long (при условии, что сумма больше Long.MAX_VALUE). Не приведя до.
Long to short
привет всем, продолжаю подготовку к оса. В следующем вопросе среди прочих правильный ответ C_ что.
Long в Integer
Как тип Long в Integer преобразовать?
public static final Long MAGIC_CONST = 1L; . if (MAGIC_CONST.equals(value)) { }
В первом случае тоже предпочтительно 1L вынести в public static final константу.
Сообщение от Alradalion
Сообщение от Alradalion
По ссылке переходим в раздел 5.6.2. Binary Numeric Promotion и видим, что при наличии numeric equality operators (==, !=), который подразумевает, что один из операндов примитивного типа, а другой в него может быть преобразован, производится Binary Numeric Promotion, первым шагом которого является unboxing. Поэтому ответ: без разницы, до тех пор, пока один из операндов соответствующего примитивного типа. Однако с другой стороны, к примеру, у Long метод equals следующего вида:
public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }
Поэтому если мы будем сравнивать при помощи Long.equals(int), например, то в результате autoboxing’a мы получим в качестве типа параметра Integer и элементы окажутся не равны, даже если они имеют одинаковое значение. А сравнение при помощи оператора == будет положительным, поскольку после unboxing’a будет выполнен widening primitive conversion для значения типа int и в итоге сравниваться будут два значения типа long. То есть вот как это будет выглядеть:
if (new Long(12).equals(12)) { System.out.println("This won't execute"); } if (new Long(12) == 12) { System.out.println("Widening primitive conversion, will execute"); }
Сообщение от Alradalion
Русские Блоги
Сравнение чисел типа Integer и Long: детали Java и Kotlin различны
Языки программирования все еще глупы.
В математике 123 == 123 интуитивно понятно с первого взгляда. Но в языках компьютерного программирования проблема становится немного «дурак».
Стоит упомянуть следующие выражения:
new Long(10).equals(new Integer(10))
Всегда ложный, это действительно «яма», которая идет вразрез с математическим здравым смыслом.
Для другого примера в Java
Все возвращенные являются ложными. Поскольку логика, реализованная этим методом равенства, все еще остается жесткой логикой компьютерного программирования. (Обратите внимание на понятие «тип данных»)
public boolean equals(Object obj) < if (obj instanceof Integer) < return value == ((Integer)obj).intValue(); >return false; > public boolean equals(Object obj) < if (obj instanceof Long) < return value == ((Long)obj).longValue(); >return false; >
К счастью, есть сопоставимый интерфейс:
public final class Long extends Number implements Comparable <> public final class Integer extends Number implements Comparable <>
Но почему java.lang.Number не реализует сам Comparable? Если реализовано, мы не можем сортировать Number и Collections.sort, что кажется немного странным.
Кроме того, определение с истинными типами примитивов (float, double) сложно, если эти два значения равны, чтобы быть в пределах допустимой погрешности. Пожалуйста, попробуйте следующий код:
double d1 = 1.0d; double d2 = 0.0d; for (int i=0; i System.out.println (d2-d1); // -1.1102230246251565E-16, в числах с плавающей запятой будут ошибки
И вы оставите некоторые небольшие различия.
Итак, вернемся к этому вопросу. Как вы будете это реализовывать? Использование чего-то вроде doubleValue () не надежно. Помните, что подтип Number:
Byte; Short; Integer; Long; AtomicInteger; AtomicLong; Float; Double; BigInteger и BigDecimal.
Может быть, ваш код является надежным CompareTo () для ряда операторов if, которые не децентрализованы? Числовые экземпляры могут быть предоставлены им только шестью способами:
byteValue(); shortValue(); intValue(); longValue(); floatValue () и doubleValue().
Как видите, компьютеры всегда такие «глупые», а не такие «умные», как человеческий мозг.
В Long.java предоставляется метод сравнения
public int compareTo(Long anotherLong)
Тем не менее, сравнения по-прежнему ограничены типами Long. То есть следующий код ошибки: (53, 33) все еще не компилируется
Integer c = Integer.valueOf(128); Long d = Long.valueOf(128); //System.out.println(c == d);//Error:(49, 30) java: incomparable types: java.lang.Integer and java.lang.Long out.println(d.equals(c)); out.println(d.compareTo(c)); // Error:(53, 33) java: incompatible types: java.lang.Integer cannot be converted to java.lang.Long >
В Kotlin тип Long реализует несколько методов compareTo, что упрощает сравнение чисел.
public operator fun compareTo(other: Byte): Int public operator fun compareTo(other: Short): Int public operator fun compareTo(other: Int): Int public override operator fun compareTo(other: Long): Int public operator fun compareTo(other: Float): Int public operator fun compareTo(other: Double): Int
В Kotlin сравните размер между Int и Long:
package com.easy.kotlin fun main(args: Array) < test1() >fun test1() < val x: Int = 123 val y: Int = 123 println(x == y) println(x === y) val z: Int = 456 val w: Int = 456 println(z == w) println(z === w) val a: Long = 789 val b: Int = 1010 println(a