Oc-windows.ru

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Integer compare java

Руководство по классу Java Integer с примерами

Класс Integer является контейнером для типа данных int . Этот класс включает в себя методы преобразования значений из строки в объект Integer . Данное руководство содержит полную информацию о том, как использовать класс Integer в Java , его атрибуты и методы .

Синтаксис класса Integer

Совместимость с версиями JDK

Необходима JDK версии 1.0

Основы класса Integer

Поскольку класс Integer имеет широкую функциональность, мы решили разделить данное руководство на разделы.

Как создать экземпляр класса Integer

Есть два способа создать экземпляр класса Integer . Первый способ – использовать ключевое слово new :

Второй способ создать — использовать функцию автоупаковки ( autoboxing ) языка Java , которая конвертирует примитивный тип данных в соответствующий класс-обёртку:

Тест на равенство объектов Integer

Объекты Integer являются обёрткой для примитивного типа int . Поскольку они являются объектами, то оператор == не будет работать. Рассмотрим приведенный ниже отрывок кода:

Поскольку мы имеем дело с объектами Integer , оператор == больше не применим. Как же провести сравнение двух Java объектов Integer ? Рассмотрим приведенный ниже отрывок кода, демонстрирующий это:

Java-программа для проверки объектов Integer на равенство

Максимальное и минимальное значения Integer

Чтобы найти максимальное и минимальное значения Integer , мы обратимся к двум его полям. Максимальное значение объекта Integer ( 2147483647 ) может быть найдено с помощью вызова Integer.MAX_VALUE , а минимальное значение Integer (- 2147483648 ) – через обращение к Integer.MIN_VALUE .

Рассмотрим метод parseInt(String s) , который принимает строку в качестве аргумента и конвертирует её в объект Integer . Если мы передадим строковое значение, которое имеет целочисленный эквивалент, превышающее максимальное значение в Integer.MAX_VALUE ? Грубым примером такого сценария может служить приведенный ниже код:

Мы передали в метод parseInt аргумент, который на 1 больше максимального значения. Поэтому если мы попытаемся выполнить этот отрывок кода, компилятор выдаст исключение NumberFormatException :

Как использовать статичные методы класса Integer

Большинство методов класса Integer статичные, поэтому имеет смысл разобраться, как получить доступ к ним. Не статичные методы используются так:

Статические методы не должны использоваться таким образом, а должны вызываться так как показано ниже:

Нестатические методы вызываются через переменная.метод. Статичные вызываются через Integer.метод(аргументы… ).

Поля объекта Integer

МодификаторТипАтрибутОписание
staticIntMAX_VALUEКонстанта, являющаяся максимальным значением данных типа int, равная 2^31-1.
staticIntMIN_VALUEКонстанта, являющаяся минимальным значением данных типа int, равная -2^31.
staticIntSIZEЧисло битов, использованное для представления значения типа int в двоичной форме.
staticClassTYPEЭкземпляр класса, представляющий примитивный тип int.

Конструктор класса Integer

СинтаксисОписание
Integer(int value)Создает новый объект Integer, который представляет указанное целочисленное значение.
Integer(String s)Это создает новый объект Integer, который представляет целочисленное значение, указанное строковым параметром конструктора.

Примеры использования методов класса Integer

МодификаторВозвращаемый типМетодОписание
staticIntbitCount(int i)Этот метод возвращает целочисленное значение, которое соответствует количеству единиц в двоичном представлении числа-аргумента метода.
bytebyteValue()Возвращает значение объекта Integer в виде типа byte. Этот метод переопределяет метод byteValue() класса Number.
staticIntcompare(int x, int y)Метод просто возвращает целочисленное представление результата сравнения двух целочисленных аргументов.
IntcompareTo(Integer anotherInteger)Возвращает целочисленное значение результата сравнения аргумента метода и объекта Integer.
staticIntegerdecode(String nm)Возвращает декодированное значение строкового аргумента в объект Integer.
DoubledoubleValue()Возвращает эквивалент объекта Integer типа double ( java double to integer ). Метод doubleValue() унаследован из класса Number.
booleanequals(Object obj)Возвращает результат сравнения объекта Integer и объекта-аргумента типа Object. Этот метод переопределяет метод equals класса Object.
FloatfloatValue()Возвращает эквивалент объекта Integer в типе float. Метод floatValue унаследован из класса Number.
staticIntegergetInteger(String nm)Возвращает значение свойства, указанного в качестве аргумента, в объекте Integer.
staticIntegergetInteger(String nm, int val)Определяет целочисленное значение свойства, указанного в строковом параметре. Если свойство не найдено, возвращает объект Integer со значением, указанным во втором параметре.
staticIntegergetInteger(String nm, Integer val)Возвращает целочисленное значение свойства, указанного в строковом параметре. Если свойство не найдено, возвращает объект Integer, указанный во втором параметре.
InthashCode()Возвращает хэш-код объекта Integer.
staticInthighestOneBit(int i)Определяет позицию старшего бита. Возвращает значение, в котором установлен только этот бит. Если ни один из битов не установлен, возвращает 0.
IntintValue()Возвращает целочисленный эквивалент объекта Integer. Метод унаследован из класса Number.
LonglongValue()Возвращает значение объекта Integer как тип long.
staticIntlowestOneBit(int i)Возвращает целое число, получающееся, если оставить только младшую (крайнюю правую) единицу в двоичном представлении числа-аргумента.
staticIntnumberOfLeadingZeros(int i)Возвращает количества нулей слева в двоичном представлении числа-аргумента.
staticIntnumberOfTrailingZeros(int i)Возвращает количества нулей справа в двоичном представлении числа-аргумента.
staticIntparseInt(String s)Преобразует строку-аргумент в десятичное число со знаком.
staticIntparseInt(String s, int radix)Преобразует строку-аргумент в целом число со знаком в системе исчисления, указанной во втором аргументе.
staticIntreverse(int i)Возвращает число, получаемое в результате перестановки битов числа-аргумента в обратном порядке.
staticIntreverseBytes(int i)Возвращает число, получаемое в результате перестановки байтов числа-аргумента в обратном порядке.
staticIntrotateLeft(int i, int distance)Возвращает число, полученное в результате сдвига битов числа-аргумента на указанное количество позиций влево. (Биты, вышедшие за пределы слева, возвращаются в правую часть).
staticIntrotateRight(int i, int distance)Возвращает число, полученное в результате сдвига битов числа-аргумента на указанное количество позиций вправо. (Биты, вышедшие за пределы справа, возвращаются в левую часть).
ShortshortValue()Возвращает эквивалент объекта Integer в типе short. Этот метод переопределяет метод shortValue класса Number.
staticintsignum(int i)Возвращает результат функции signum от указанного целого числа.
staticStringtoBinaryString(int i)Возвращает строковый эквивалент двоичного представления числа-аргумента.
staticStringtoHexString(int i)Возвращает строковое представление целочисленного аргумента в виде шестнадцатеричного числа без знака.
staticStringtoOctalString(int i)Возвращает строковое представление целочисленного аргумента в виде восьмеричного числа без знака.
StringtoString()Возвращает объект String, представляющий значение объекта Integer.
staticStringtoString(int i)Возвращает объект String, представляющий значение целочисленного аргумента.
staticStringtoString(int i, int radix)Возвращает строковый эквивалент целого десятичного числа-аргумента в указанной системе исчисления.
staticIntegervalueOf(int i)Возвращает экземпляр объекта Integer, представляющий указанное целое число.
staticIntegervalueOf(String s)Возвращает экземпляр объекта Integer, содержащий значение, указанное в строке-аргументе.
staticIntegervalueOf(String s, int radix)Возвращает экземпляр объекта Integer, содержащий значение, передаваемое в строке-аргументе в системе исчисления, указанной во втором параметре.

Данная публикация представляет собой перевод статьи « Java Integer Class Tutorial and Example » , подготовленной дружной командой проекта Интернет-технологии.ру

How to properly compare two Integers in Java?

I know that if you compare a boxed primitive Integer with a constant such as:

a will automatically be unboxed and the comparison will work.

However, what happens when you are comparing two boxed Integers and want to compare either equality or less than/greater than?

Will above code result in checking to see if they are the same object, or will it auto-unbox in that case?

10 Answers 10

No, == between Integer, Long etc will check for reference equality — i.e.

this will check whether x and y refer to the same object rather than equal objects.

is guaranteed to print false . Interning of «small» autoboxed values can lead to tricky results:

This will print true , due to the rules of boxing (JLS section 5.1.7). It’s still reference equality being used, but the references genuinely are equal.

If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between ‘u0000’ and ‘u007f’ inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.

Personally I’d use:

As you say, for any comparison between a wrapper type ( Integer , Long etc) and a numeric type ( int , long etc) the wrapper type value is unboxed and the test is applied to the primitive values involved.

This occurs as part of binary numeric promotion (JLS section 5.6.2). Look at each individual operator’s documentation to see whether it’s applied. For example, from the docs for == and != (JLS 15.21.1):

If the operands of an equality operator are both of numeric type, or one is of numeric type and the other is convertible (§5.1.8) to numeric type, binary numeric promotion is performed on the operands (§5.6.2).

The type of each of the operands of a numerical comparison operator must be a type that is convertible (§5.1.8) to a primitive numeric type, or a compile-time error occurs. Binary numeric promotion is performed on the operands (§5.6.2). If the promoted type of the operands is int or long, then signed integer comparison is performed; if this promoted type is float or double, then floating-point comparison is performed.

Note how none of this is considered as part of the situation where neither type is a numeric type.

== will still test object equality. It is easy to be fooled, however:

Your examples with inequalities will work since they are not defined on Objects. However, with the == comparison, object equality will still be checked. In this case, when you initialize the objects from a boxed primitive, the same object is used (for both a and b). This is an okay optimization since the primitive box classes are immutable.

Since Java 1.7 you can use Objects.equals:

Returns true if the arguments are equal to each other and false otherwise. Consequently, if both arguments are null, true is returned and if exactly one argument is null, false is returned. Otherwise, equality is determined by using the equals method of the first argument.

== checks for reference equality, however when writing code like:

Java is smart enough to reuse the same immutable for a and b , so this is true: a == b . Curious, I wrote a small example to show where java stops optimizing in this way:

When I compile and run this (on my machine), I get:

tl;dr my opinion is to use a unary + to trigger the unboxing on one of the operands when checking for value equality, and simply use the maths operators otherwise. Rationale follows:

It has been mentioned already that == comparison for Integer is identity comparison, which is usually not what a programmer want, and that the aim is to do value comparison; still, I’ve done a little science about how to do that comparison most efficiently, both in term of code compactness, correctness and speed.

I used the usual bunch of methods:

and got this code after compilation and decompilation:

As you can easily see, method 1 calls Integer.equals() (obviously), methods 2-4 result in exactly the same code, unwrapping the values by means of .intValue() and then comparing them directly, and method 5 just triggers an identity comparison, being the incorrect way to compare values.

Since (as already mentioned by e.g. JS) equals() incurs an overhead (it has to do instanceof and an unchecked cast), methods 2-4 will work with exactly the same speed, noticingly better than method 1 when used in tight loops, since HotSpot is not likely to optimize out the casts & instanceof .

It’s quite similar with other comparison operators (e.g. / > ) — they will trigger unboxing, while using compareTo() won’t — but this time, the operation is highly optimizable by HS since intValue() is just a getter method (prime candidate to being optimized out).

In my opinion, the seldom used version 4 is the most concise way — every seasoned C/Java developer knows that unary plus is in most cases equal to cast to int / .intValue() — while it may be a little WTF moment for some (mostly those who didn’t use unary plus in their lifetime), it arguably shows the intent most clearly and most tersely — it shows that we want an int value of one of the operands, forcing the other value to unbox as well. It is also unarguably most similar to the regular i1 == i2 comparison used for primitive int values.

Интерфейсы Comparable и Comparator в Java

Привет! Это статья про интерфейсы Comparable и Comparator. Для понимания материала Вам, естественно, нужно знать что такое интерфейс.

Что такое Comparable и Comparator в Java

В своей работе программисты часто сталкиваются с тем, что надо что-то сортировать — например, покупая товары в интернет-магазине Вы можете сортировать их по цене, популярности и т.д.

Но для того, чтобы что-то отсортировать, нам нужно сравнивать объекты по каким-то правилам. Тут, казалось бы, все просто — мы можем сортировать числа, да и в сортировке по алфавиту нет ничего сложного. Да, с такими данными все легко. Но как нам сравнить два объекта класса Car? По цене, пробегу, лошадиным силам или дате выпуска? А может по количеству владельцев?

Если у нас есть два объекта класса Cat — как сравнить их? По кличке? По породе? По возрасту?

Как видите, не всегда очевидно как именно можно сравнить два объекта. Но не беда — мы сами можем прописать эти правила. Именно для этого мы можем реализовать интерфейсы Comparable и Comparator.

  • Кроме того, некоторые встроенные возможности в Java можно использовать только, если Ваш класс реализует Comparable или Comparator.

Интерфейс Comparable

С английского «Comparable» переводится как «сравнимый». Имплементируя этот интерфейс мы как бы говорим «Эй, теперь объекты этого класса можно сравнивать между собой! И я знаю, как это сделать!» А до этого было нельзя

Так как выглядит интерфейс Comparable? Очень просто — в нем находится всего один метод:

Классы Integer, Character, Boolean

Часто бывает предпочтительней работать с объектами, а не с примитивными типами. Так, например, при использовании коллекций, просто необходимо значения примитивных типов каким-то образом представлять в виде объектов. Для этих целей и предназначены так называемые классы-обертки (wrapper classes). Для каждого примитивного типа Java существует свой класс-обертки. Такой класс является неизменяемым, то есть, для изменения значения необходимо создавать новый объект. К тому же класс-обертка имеет атрибут final и его нельзя наследовать.

Все классы-обертки (кроме Void) реализуют интерфейс java.io.Serializable, поэтому объекты любого класса-обертки (кроме Void) могут быть сериализованы. Это имеет важное значение для «сетевых» пересылок объектов.

Классы-обертки содержат статическое поле TYPE — содержащее объект Class, соответствующий примитивному оборачиваемому типу. Также классы-обертки содержат статические методы для обеспечения удобного манипулирования соответствующими примитивными типами, например, преобразование к строковому виду.

Примитивный типКласс-обертка
byteByte
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

Wrapper classes числовых типов (Byte, Short, Integer, Long, Float, Double) наследуются от класса Number, который содержит код, общий для всех классов-оберток числовых типов. Все классы-обертки реализуют интерфейс Comparable.

Классы-обертки числовых типов имеют метод equals(Object), сравнивающий примитивные значения объектов. Но с этим надо быть предельно внимательным. Так в результате выполнения следующего кода

мы увидим в консоли следующий текст :

Данный результат связан с тем, что во всех классах-обертках метод equals() сначала производит проверку на совпадение типов (классов), и если нет совпадения, то сразу же возвращает false. В JDK 1.3.1 для класса-обертки Integer метод equals() определен следующим образом :

Класс Number

Абстрактный класс Number является суперклассом для классов Byte, Double, Float, Integer, Long и Short. Наследники Number должны обеспечить методы преобразовывания числовых значений в byte, double, float, int, long и short.

Класс Number имеет один конструктор :

Методы класса Number :

МетодОписание
byte byteValue()преобразование значения в тип byte
abstract double doubleValue()преобразование значения в тип double
abstract float floatValue()преобразование значения в тип float
abstract int intValue()преобразование значения в тип int
abstract long longValue()преобразование значения в тип long
short shortValue()преобразование значения в тип short

Класс Integer

Конструкторы класса Integer

  • Integer(int value) — создание объекта Integer на основе аргумента int
  • Integer(String s) — создание объекта Integer на основе строкового аргумента

Поля класса Integer

  • static int MAX_VALUE — максимальная величина типа int
  • static int MIN_VALUE — минимальная величина типа int
  • static >
    МетодОписаниеbyte byteValue()преобразование значения в тип byteint compareTo(Integer integer)сравнение двух целых чиселint compareTo(Object o)сравнение значения с другим объектомInteger decode(String nm)перевод строки в Integerdouble doubleValue()преобразование значения в тип doubleboolean equals(Object obj)сравнение с другим объектомfloat floatValue()преобразование значения в тип floatint hashCode()получение hashcode для обьектаint intValue()преобразование значения в тип intlong longValue()преобразование значения в тип longint parseInt(String s)преобразование текстового значения в тип intint parseInt(String s, int radix)преобразование текстового значения со знаком в системе счисления, определенной во втором аргументе, в тип intshort shortValue()преобразование значения в тип shortString toBinaryString(int i)преобразование целочисленного значения i в текстовый вид с базой 2 (двоичный)String toHexString(int i)преобразование целочисленного значения i в текстовый вид с базой 16(шестнадцатиричный)String toOctalString(int i)преобразование целочисленного значения i в текстовый вид с базой 8(восьмиричный)String toString()преобразование значения в тип StringString toString(int i)преобразование значения i в тип StringString toString(int i, int radix)преобразование целочисленного значения i в строку в заданной системе счисления radixInteger valueOf(String s)создание объекта Integer, инициализированного величиной, определенной в строковой переменной sInteger valueOf(String s, int radix)создание объекта Integer, инициализированного величиной, определенной в строковой переменной s, записанной в системе счисления radix

Методы parseInt(), преобразующие текстовое значение в целочисленное, не следует путать с методами valueOf(), возвращающие класс-обертку. Если переданная на вход строка содержит нецифровые символы, то методы возбуждают исключение NumberFormatException.

Дополнительную информацию о классе Integer можно получить на странице Кэширование класса Integer

Класс Byte

Класс Byte является стандартной оболочкой для байтовых величин.

Конструкторы класса Byte

  • Byte (byte value) — создание объекта Byte с определенным значением value;
  • Byte (String s) — создание объекта Byte на основе текстового значения s.

Поля класса Byte

  • static int MAX_VALUE — максимальная величина типа byte
  • static int MIN_VALUE — минимальная величина типа byte
  • static >
    МетодОписаниеbyte byteValue()получение значения типа byteint compareTo(Byte byte)сравнение с объектом Byteint compareTo(Object o)сравнение с другим объектомstatic Byte decode(String nm)преобразование строки в Bytedouble doubleValue()преобразование значения в doubleboolean equals(Object obj)проверка на равенство с другим объектомfloat floatValue()преобразование значения в floatint hashCode()получение hash-кода объектаint intValue()преобразование значения в intlong longValue()преобразование значения в longstatic byte parseByte(String s)преобразование текстового значения в bytestatic byte parseByte(String s, int radix)преобразование текстового значения в системе счисления radix в байтshort shortValue()преобразование значения в shortString toString()преобразование значения в Stringstatic String toString(byte b)преобразование байтового значения в Stringstatic Byte valueOf(String s)преобразование текстового значения в Bytestatic Byte valueOf(String s, int radix)преобразование текстового значения в системе счисления radix в Byte

Класс Boolean

Класс Boolean является оболочкой простого логического объекта. Объект типа Boolean содержит единственное поле логического типа. Кроме того, этот класс включает методы преобразования boolean в String и обратно, а также константы и методы полезные при работе с логическим типом.

Конструкторы класса Boolean

  • Boolean (boolean value) — создание логического объекта на основе аргумента;
  • Boolean (String s) — создание логического объекта на основе текстового значения s [«true» | «false»].

Поля класса Boolean

  • static Boolean FALSE — логический объект, соответствующий значению «ложь»
  • static Boolean TRUE — логический объект, соответствующий значению «истина»
  • static >
    МетодОписаниеboolean booleanValue()получение логического значенияboolean equals(Object obj)функция возвращает логическое значение по результату сравнения переданного объекта с текущимstatic boolean getBoolean(String name)преобразование текстового значения в логическоеint hashCode()получение hash-кода объектаString toString()преобразование в текстовое значениеstatic Boolean valueOf(String s)преобразование текстового значения в Boolean

Класс Void

В большинстве случаев, если нужно проверить возвращаемый тип метода (например, через рефлексию) можно использовать void.class — не перепутаешь с Void.class.

Использовать Void можно, например, в случаях, когда имеется обобщенный класс (generic) и необходимо, чтобы метод ничего не возвращал :

Класс Character

Для хранения символов Java использует специальный тип char. В отличие от языка C/C++, где char представляет собой целочисленный тип с размером 8 бит, в Java для char применяется кодировка Unicode и для хранения Unicode-символов используется 16 бит. Диапазон допустимых значений — от 0 до 65536 (отрицательных значений не существует).

Класс Character является оболочкой вокруг типа char. Чтобы получить значение типа char, содержащее в объекте Character, необходимо вызвать метод charValue().

Конструктор класса Character

Character имеет только один конструктор, которому в качестве параметра передается значение char.

Помимо констант MIN_VALUE и MAX_VALUE, Character содержит две константы MIN_RADIX и MAX_RADIX, которые равны минимальному и максимальному основанию системы счисления, которые используются методами (представленными ниже) для перевода отдельного цифрового символа в его целочисленный эквивалент и наоборот. Основание должно находиться в диапазоне 2–36; цифры свыше 9 представлены буквами от A до Z или их эквивалентами в нижнем регистре.

Читать еще:  Javascript is defined
Ссылка на основную публикацию
Adblock
detector