Integer.intValue: примеры (JAVA)
Integer.intValue: intОбщее описание
Метод Integer.intValue представляет собой экземплярный метод класса java.lang.Integer, унаследованный от Number. Его сигнатура:
public int intValue()
Аргументы отсутствуют. Метод возвращает примитивное значение int, соответствующее значению этого объекта-обёртки. Для объектов Integer возврат всегда равен числу, хранящемуся внутри экземпляра, и находится в диапазоне Integer.MIN_VALUE.. Integer.MAX_VALUE.
Метод используется в тех местах, где требуется получить примитив int из объекта-обёртки или при неявном распаковывании (autounboxing). При вызове на null происходит NullPointerException.
Особенности поведения:
- Нет параметров.
- Возвращает значение типа
int. - Для объектов класса
Integerпереполнение невозможно, так как внутренне хранится именноint. - При вызове через ссылку типа
Number(например, если ссылка указывает наDoubleилиLong) реализация может приводить к потере дробной части или обрезанию старших битов, поскольку поведение зависит от конкретной реализацииNumber.intValue()у соответствующего подкласса. - Автоматическое распаковывание (autounboxing) эквивалентно вызову
intValue()у объекта-обёртки.
Примеры использования
Несложные случаи применения и их результаты.
1) Прямой вызов на объекте Integer:
Integer i = Integer.valueOf(42);
int x = i.intValue();
System.out.println(x);
42
2) Неявное распаковывание (autounboxing) эквивалентно intValue():
Integer i2 = 7; // автоупаковка
int y = i2; // автораспаковка, вызывает intValue()
System.out.println(y);
7
3) Вызов на ссылке типа Number, указывающей на Double (потеря дробной части):
Number n = Double.valueOf(3.9);
int z = n.intValue();
System.out.println(z);
3
4) Вызов на null приводит к исключению:
Integer n2 = null;
// int v = n2.intValue(); // приведет к NullPointerException
try {
int v = n2.intValue();
} catch (NullPointerException e) {
System.out.println("NPE");
}
NPE
Похожие методы в Java
Набор методов, которые выполняют близкие задачи:
- Integer.parseInt(String) - преобразует строку в примитив
int. Предпочтительнее при разборе текстовых данных; выбрасываетNumberFormatExceptionпри неверном формате. - Integer.valueOf(String|int) - возвращает объект
Integer. При аргументеintиспользуется кэширование для небольших значений; полезно, когда требуется объект. - Number.intValue() - абстрактный метод в
Number, реализуется в классах-обёртках (Long,Doubleи т.д.). Поведение зависит от конкретной реализации (возможна потеря данных).
Выбор между этими вариантами основывается на типе входных данных и требуемом результате: для строк - parseInt, для получения объекта - valueOf, для извлечения примитива из объекта - intValue() или автораспаковка.
Аналоги в других языках
Короткие сравнения с примерами и результатами.
JavaScript - преобразование в число:
// явное
let s = "42";
let n = Number(s);
console.log(n);
// через parseInt
console.log(parseInt("42"));
42 42
Python - функция int():
s = "42"
print(int(s))
# из float происходит усечение дробной части
print(int(3.9))
42 3
PHP - intval():
echo intval("42");
echo intval(3.9);
42 3
C# - Convert.ToInt32 и int.Parse:
using System;
class P { static void Main(){
Console.WriteLine(int.Parse("42"));
Console.WriteLine(Convert.ToInt32(3.9));
}}
42 4
Go - явное приведение типов:
package main
import "fmt"
func main(){
var f float64 = 3.9
i := int(f)
fmt.Println(i)
}
3
Kotlin - toInt() на числовых типах и распаковка из Int?:
val s = "42"
println(s.toInt())
val d = 3.9
println(d.toInt())
42 3
Отличия от Java: в Java метод извлечения примитива у обёртки - это экземплярный метод (intValue()) и к нему добавлена поддержка автобоксинга/распаковки с Java 5. В других языках часто используются свободные функции или приведение типов; поведение при округлении/усечении и при некорректной строке зависит от конкретного языка.
Типичные ошибки и их проявления
- NullPointerException: вызов
intValue()наnull.
Integer x = null; int v = x.intValue();Exception in thread "main" java.lang.NullPointerException at ... - Потеря точности: использование
Number-ссылки, указывающей наDoubleилиFloat, приводит к усечению дробной части при вызовеintValue().
Number n = 5.9; System.out.println(n.intValue());5
- Неправильное ожидание округления}: метод не округляет до ближайшего целого, а отбрасывает дробную часть (floor для положительных, у отрицательных поведение к нулю).
System.out.println(((Number) -3.7).intValue());-3
- Заблуждение при преобразовании строк}: попытка использовать
intValue()на строке невозможна - требуется сначала распарсить строку черезInteger.parseIntили создатьInteger. Ошибки формата приводят кNumberFormatException.
Изменения в истории метода
Метод intValue() существует с ранних версий Java как часть класса Number и реализован в Integer с JDK 1.0. Существенных изменений в сигнатуре или поведении не происходило. Ключевое изменение в экосистеме - введение автoboxing/autounboxing в Java 5 (JDK 1.5), после чего распаковка стала выполняться автоматически в нужных контекстах и фактически вызывает intValue() у объекта-обёртки. Других изменений API метода не зафиксировано, метод не помечался как устаревший.
Расширенные и редкие сценарии
Несколько продвинутых примеров с пояснениями.
1) Потоки и примитивная специализация для производительности:
import java.util.*;
public class P{ public static void main(String[] a){
List list = Arrays.asList(1,2,3,4,5);
// избегает лишнего бокcинга при использовании mapToInt
int sum = list.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
}}
15
Комментарий: использование mapToInt с ссылкой на intValue() переводит поток в IntStream, что снижает накладные расходы бокcинга.
2) Пользовательский подкласс Number и переопределение intValue:
class MyNum extends Number{
private final double v;
MyNum(double v){this.v=v;}
public int intValue(){ return (int)Math.round(v); }
public long longValue(){ return (long)v; }
public float floatValue(){ return (float)v; }
public double doubleValue(){ return v; }
}
// Использование
MyNum m = new MyNum(2.7);
System.out.println(m.intValue());
3
Комментарий: у стандартных реализаций Double.intValue() дробная часть отбрасывается, но подкласс может менять семантику.
3) Reflection и вызов intValue с проверкой типов:
import java.lang.reflect.*;
class R{
public static void main(String[] args) throws Exception{
Integer i = 10;
Method m = Integer.class.getMethod("intValue");
Object res = m.invoke(i);
System.out.println(res + " class=" + res.getClass().getSimpleName());
}
}
10 class=Integer
Комментарий: при reflection возвращается объект-оболочка примитива (в данном случае Integer), так как Method.invoke возвращает Object. Для получения примитива требуется приведение или распаковка.
4) Практический пример: кеширование и сравнение ссылок:
Integer a = Integer.valueOf(100);
Integer b = Integer.valueOf(100);
Integer c = Integer.valueOf(1000);
Integer d = Integer.valueOf(1000);
System.out.println(a == b); // true в диапазоне кэша
System.out.println(c == d); // может быть false
System.out.println(a.intValue() == b.intValue());
true false true
Комментарий: сравнение значений через intValue() убирает неоднозначность, связанную с кэшированием объектов.
5) Встраивание в алгоритмы с примитивными буферами:
// преобразование List в массив примитивов
List L = Arrays.asList(1,2,3);
int[] arr = L.stream().mapToInt(Integer::intValue).toArray();
System.out.println(java.util.Arrays.toString(arr));
[1, 2, 3]
Комментарий: mapToInt + Integer::intValue - стандартный путь получения примитивного массива из коллекции обёрток без ручного цикла.