Java long equals int

Сравнение 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 из-за оператора == . Тест успешно завершен.

Читайте также:  Php remove folder with files

Если вы сравниваете 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 Посмотреть сообщение

Читайте также:  Files create temp file java

Источник

Русские Блоги

Сравнение чисел типа 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(). 

Как видите, компьютеры всегда такие «глупые», а не такие «умные», как человеческий мозг.

Читайте также:  Html meta header location

В 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

Источник

Оцените статью