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
Модификатор | Тип | Атрибут | Описание |
static | Int | MAX_VALUE | Константа, являющаяся максимальным значением данных типа int, равная 2^31-1. |
static | Int | MIN_VALUE | Константа, являющаяся минимальным значением данных типа int, равная -2^31. |
static | Int | SIZE | Число битов, использованное для представления значения типа int в двоичной форме. |
static | Class | TYPE | Экземпляр класса, представляющий примитивный тип int. |
Конструктор класса Integer
Синтаксис | Описание |
Integer(int value) | Создает новый объект Integer, который представляет указанное целочисленное значение. |
Integer(String s) | Это создает новый объект Integer, который представляет целочисленное значение, указанное строковым параметром конструктора. |
Примеры использования методов класса Integer
Модификатор | Возвращаемый тип | Метод | Описание |
static | Int | bitCount(int i) | Этот метод возвращает целочисленное значение, которое соответствует количеству единиц в двоичном представлении числа-аргумента метода. |
byte | byteValue() | Возвращает значение объекта Integer в виде типа byte. Этот метод переопределяет метод byteValue() класса Number. | |
static | Int | compare(int x, int y) | Метод просто возвращает целочисленное представление результата сравнения двух целочисленных аргументов. |
Int | compareTo(Integer anotherInteger) | Возвращает целочисленное значение результата сравнения аргумента метода и объекта Integer. | |
static | Integer | decode(String nm) | Возвращает декодированное значение строкового аргумента в объект Integer. |
Double | doubleValue() | Возвращает эквивалент объекта Integer типа double ( java double to integer ). Метод doubleValue() унаследован из класса Number. | |
boolean | equals(Object obj) | Возвращает результат сравнения объекта Integer и объекта-аргумента типа Object. Этот метод переопределяет метод equals класса Object. | |
Float | floatValue() | Возвращает эквивалент объекта Integer в типе float. Метод floatValue унаследован из класса Number. | |
static | Integer | getInteger(String nm) | Возвращает значение свойства, указанного в качестве аргумента, в объекте Integer. |
static | Integer | getInteger(String nm, int val) | Определяет целочисленное значение свойства, указанного в строковом параметре. Если свойство не найдено, возвращает объект Integer со значением, указанным во втором параметре. |
static | Integer | getInteger(String nm, Integer val) | Возвращает целочисленное значение свойства, указанного в строковом параметре. Если свойство не найдено, возвращает объект Integer, указанный во втором параметре. |
Int | hashCode() | Возвращает хэш-код объекта Integer. | |
static | Int | highestOneBit(int i) | Определяет позицию старшего бита. Возвращает значение, в котором установлен только этот бит. Если ни один из битов не установлен, возвращает 0. |
Int | intValue() | Возвращает целочисленный эквивалент объекта Integer. Метод унаследован из класса Number. | |
Long | longValue() | Возвращает значение объекта Integer как тип long. | |
static | Int | lowestOneBit(int i) | Возвращает целое число, получающееся, если оставить только младшую (крайнюю правую) единицу в двоичном представлении числа-аргумента. |
static | Int | numberOfLeadingZeros(int i) | Возвращает количества нулей слева в двоичном представлении числа-аргумента. |
static | Int | numberOfTrailingZeros(int i) | Возвращает количества нулей справа в двоичном представлении числа-аргумента. |
static | Int | parseInt(String s) | Преобразует строку-аргумент в десятичное число со знаком. |
static | Int | parseInt(String s, int radix) | Преобразует строку-аргумент в целом число со знаком в системе исчисления, указанной во втором аргументе. |
static | Int | reverse(int i) | Возвращает число, получаемое в результате перестановки битов числа-аргумента в обратном порядке. |
static | Int | reverseBytes(int i) | Возвращает число, получаемое в результате перестановки байтов числа-аргумента в обратном порядке. |
static | Int | rotateLeft(int i, int distance) | Возвращает число, полученное в результате сдвига битов числа-аргумента на указанное количество позиций влево. (Биты, вышедшие за пределы слева, возвращаются в правую часть). |
static | Int | rotateRight(int i, int distance) | Возвращает число, полученное в результате сдвига битов числа-аргумента на указанное количество позиций вправо. (Биты, вышедшие за пределы справа, возвращаются в левую часть). |
Short | shortValue() | Возвращает эквивалент объекта Integer в типе short. Этот метод переопределяет метод shortValue класса Number. | |
static | int | signum(int i) | Возвращает результат функции signum от указанного целого числа. |
static | String | toBinaryString(int i) | Возвращает строковый эквивалент двоичного представления числа-аргумента. |
static | String | toHexString(int i) | Возвращает строковое представление целочисленного аргумента в виде шестнадцатеричного числа без знака. |
static | String | toOctalString(int i) | Возвращает строковое представление целочисленного аргумента в виде восьмеричного числа без знака. |
String | toString() | Возвращает объект String, представляющий значение объекта Integer. | |
static | String | toString(int i) | Возвращает объект String, представляющий значение целочисленного аргумента. |
static | String | toString(int i, int radix) | Возвращает строковый эквивалент целого десятичного числа-аргумента в указанной системе исчисления. |
static | Integer | valueOf(int i) | Возвращает экземпляр объекта Integer, представляющий указанное целое число. |
static | Integer | valueOf(String s) | Возвращает экземпляр объекта Integer, содержащий значение, указанное в строке-аргументе. |
static | Integer | valueOf(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, соответствующий примитивному оборачиваемому типу. Также классы-обертки содержат статические методы для обеспечения удобного манипулирования соответствующими примитивными типами, например, преобразование к строковому виду.
Примитивный тип | Класс-обертка |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
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() преобразование значения в тип byte int compareTo(Integer integer) сравнение двух целых чисел int compareTo(Object o) сравнение значения с другим объектом Integer decode(String nm) перевод строки в Integer double doubleValue() преобразование значения в тип double boolean equals(Object obj) сравнение с другим объектом float floatValue() преобразование значения в тип float int hashCode() получение hashcode для обьекта int intValue() преобразование значения в тип int long longValue() преобразование значения в тип long int parseInt(String s) преобразование текстового значения в тип int int parseInt(String s, int radix) преобразование текстового значения со знаком в системе счисления, определенной во втором аргументе, в тип int short shortValue() преобразование значения в тип short String toBinaryString(int i) преобразование целочисленного значения i в текстовый вид с базой 2 (двоичный) String toHexString(int i) преобразование целочисленного значения i в текстовый вид с базой 16(шестнадцатиричный) String toOctalString(int i) преобразование целочисленного значения i в текстовый вид с базой 8(восьмиричный) String toString() преобразование значения в тип String String toString(int i) преобразование значения i в тип String String toString(int i, int radix) преобразование целочисленного значения i в строку в заданной системе счисления radix Integer valueOf(String s) создание объекта Integer, инициализированного величиной, определенной в строковой переменной s Integer 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() получение значения типа byte int compareTo(Byte byte) сравнение с объектом Byte int compareTo(Object o) сравнение с другим объектом static Byte decode(String nm) преобразование строки в Byte double doubleValue() преобразование значения в double boolean equals(Object obj) проверка на равенство с другим объектом float floatValue() преобразование значения в float int hashCode() получение hash-кода объекта int intValue() преобразование значения в int long longValue() преобразование значения в long static byte parseByte(String s) преобразование текстового значения в byte static byte parseByte(String s, int radix) преобразование текстового значения в системе счисления radix в байт short shortValue() преобразование значения в short String toString() преобразование значения в String static String toString(byte b) преобразование байтового значения в String static Byte valueOf(String s) преобразование текстового значения в Byte static 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 или их эквивалентами в нижнем регистре.