Integer.intValue: примеры (JAVA)

Метод intValue в классе Integer
Раздел: Упаковка/распаковка (авто)
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) Потоки и примитивная специализация для производительности:

Пример java
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:

Пример java
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 с проверкой типов:

Пример java
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) Практический пример: кеширование и сравнение ссылок:

Пример java
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) Встраивание в алгоритмы с примитивными буферами:

Пример java
// преобразование 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 - стандартный путь получения примитивного массива из коллекции обёрток без ручного цикла.

джава Integer.intValue function comments

En
Integer.intValue Returns the value of this Integer as an int