Hiểu về int và Integer trong Java: Những Khác biệt Chính, Thực hành Tốt nhất và Các Cạm bẫy Thường gặp

.## 1. Giới thiệu

目次

Các kiểu số nguyên cơ bản trong Java

Khi làm việc với các số trong Java, một trong những kiểu dữ liệu cơ bản nhất là “kiểu số nguyên” (int). Đây là kiểu nguyên thủy thường được dùng cho các phép tính số học trong chương trình, cho phép xử lý nhanh và tiết kiệm bộ nhớ.

Mặt khác, Java cũng cung cấp một lớp gọi là Integer. Đây là một lớp bao bọc (wrapper class), được thiết kế để cho phép các giá trị int được xử lý như các đối tượng, phù hợp với triết lý hướng đối tượng của Java.

Mặc dù hai kiểu này trông giống nhau, nhưng chúng có những khác biệt rõ ràng về mục đích và hành vi. Do đó, những người mới bắt đầu học Java thường tự hỏi: “Sự khác nhau giữa intInteger là gì?” hoặc “Làm sao để sử dụng mỗi loại một cách thích hợp?”

Tại sao bạn nên tìm hiểu về lớp Integer?

Có rất nhiều tình huống trong Java—như khi làm việc với các framework collection (ví dụ List hoặc Map), xử lý giá trị null, hoặc sử dụng generics—mà kiểu nguyên thủy int không phù hợp. Trong những trường hợp này, lớp Integer trở nên thiết yếu, vì vậy việc nắm vững các kiến thức cơ bản về nó là quan trọng.

Lớp Integer cũng cung cấp nhiều phương thức hữu ích cho các tác vụ như chuyển đổi giữa chuỗi và số, so sánh, và các phép toán bit. Thành thạo những phương thức này giúp bạn viết mã mạnh mẽ và dễ đọc hơn.

Bài viết này tập trung vào lớp Integer, giải thích sự khác nhau so với int, cách sử dụng, và các trường hợp thực tế. Dù bạn là người mới bắt đầu Java hay đã có một chút kinh nghiệm, bạn sẽ tìm thấy những thông tin hữu ích ở đây—vì vậy hãy tiếp tục đọc!

2. Lớp Integer là gì?

Vai trò như một lớp bao bọc

Lớp Integer của Java là một lớp bao bọc cho phép kiểu nguyên thủy int được coi như một đối tượng. Như tên gọi, một wrapper “bọc” một thứ gì đó—trong trường hợp này, nó gói một giá trị int thô vào một “hộp” Integer để có thể được sử dụng như một đối tượng.

Ví dụ, các collection của Java (như List và Map) chỉ có thể chứa các đối tượng. Vì các kiểu nguyên thủy như int không thể dùng trực tiếp, nên cần dùng Integer thay thế.

List<Integer> numbers = new ArrayList<>();
numbers.add(10); // The int value 10 is automatically converted to Integer and stored

Bằng cách chuyển đổi (boxing) các giá trị int thành dạng đối tượng, bạn có thể làm việc liền mạch với rất nhiều API và framework của Java.

Autoboxing và Unboxing

Kể từ Java 5, các tính năng tiện lợi gọi là “autoboxing” và “unboxing” đã được giới thiệu.

  • Autoboxing: Một giá trị int được tự động chuyển thành một đối tượng Integer
  • Unboxing: Một đối tượng Integer được tự động chuyển thành một giá trị int
    Integer num = 100; // Autoboxing
    int result = num + 50; // Unboxing occurs for the calculation
    

Điều này có nghĩa là các lập trình viên không cần viết mã chuyển đổi một cách tường minh—Java sẽ tự động thực hiện, giúp code của bạn ngắn gọn và dễ đọc hơn.

Tuy nhiên, nếu bạn cố gắng unbox một giá trị null, sẽ phát sinh NullPointerException, vì vậy hãy cẩn thận.

Integer value = null;
int x = value; // This throws an exception

Tầm quan trọng của Integer

Lớp Integer không chỉ là một sự thay thế cho int. Khi là một đối tượng, nó có một số đặc tính riêng:

  • Bạn có thể gán giá trị null, cho phép biểu diễn trạng thái “chưa được đặt”
  • Nó đi kèm với các phương thức cho phép thực hiện các thao tác linh hoạt
  • Nó có thể được dùng trong các collection và các cấu trúc dựa trên đối tượng khác

Tóm lại, có rất nhiều kịch bản trong môi trường hướng đối tượng của Java mà Integer phù hợp hơn so với int.

3. Các trường và hằng số chính của lớp Integer

Lớp Integer của Java định nghĩa một số hằng số hữu íchtrường để truy xuất thông tin liên quan đến các số. Việc sử dụng chúng có thể cải thiện tính đọc được và khả năng bảo trì của mã nguồn.

Hãy xem qua một số trường thường được dùng nhất.

MAX_VALUE và MIN_VALUE

Integer.MAX_VALUEInteger.MIN_VALUE là các hằng số đại diện cho giá trị lớn nhấtgiá trị nhỏ nhất mà kiểu int có thể chứa.

answer. MAX_VALUE : 2,147,483,647 (2 mũ 31 trừ 1)
MIN_VALUE : -2,147,483,648 (số âm 2 mũ 31)

These are often used for range checking or preventing overflow, making them essential for safe numeric processing.

int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;

System.out.println("Max value: " + max); // 2147483647
System.out.println("Min value: " + min); // -2147483648

SIZE và BYTES

SIZEBYTES là các hằng số cho biết số bitbyte được sử dụng bởi kiểu int.

  • Integer.SIZE : 32 (số bit)
  • Integer.BYTES : 4 (số byte)

These are often used when dealing with binary data or in system programming scenarios, such as calculating data sizes or for cryptographic purposes.

System.out.println("Number of bits in int: " + Integer.SIZE);   // 32
System.out.println("Number of bytes in int: " + Integer.BYTES); // 4

Trường TYPE

Integer.TYPE là một trường tĩnh trả về đối tượng Class cho kiểu int. Điều này đôi khi được dùng cho các kỹ thuật lập trình nâng cao như reflection hoặc generics.

Class<?> clazz = Integer.TYPE;
System.out.println(clazz.getName()); // int

While it’s not used often in everyday development, it’s good to know about it if you’re interested in Java internals or framework development.

All of these constants are defined as static final, meaning you can access them directly from the Integer class without creating an instance. Knowing these type‑related constants is a good first step toward preventing errors and improving performance in Java.

4. Các phương thức chính của lớp Integer

The Integer class is much more than just a wrapper for int. It provides many practical methods for string conversion, numeric comparison, bitwise operations, and more—making it highly useful for everyday Java development. Here, we’ll introduce the most frequently used methods by category.

Các phương thức chuyển đổi

parseInt()

parseInt() là một phương thức tĩnh chuyển đổi một chuỗi thành giá trị int. Nó chủ yếu được dùng khi xử lý đầu vào người dùng hoặc dữ liệu từ các tệp bên ngoài mà bạn cần xử lý dưới dạng số.

String str = "123";
int number = Integer.parseInt(str); // 123
  • Nếu một chuỗi không phải số được truyền vào, NumberFormatException sẽ được ném, vì vậy an toàn hơn khi sử dụng try‑catch.

valueOf()

valueOf() là một phương thức chuyển đổi một chuỗi hoặc một giá trị int thành đối tượng Integer. Khác với parseInt(), kiểu trả về là Integer, không phải int.

Integer num1 = Integer.valueOf("456");
Integer num2 = Integer.valueOf(789);

Integer.valueOf() tái sử dụng các đối tượng được cache cho các giá trị từ -128 đến 127, giúp hiệu quả hơn so với việc tạo các thể hiện mới bằng new.

Các phương thức hiển thị và chuyển đổi

toString()

toString() là một phương thức trả về giá trị số dưới dạng chuỗi. Nó thường được dùng để nối chuỗi hoặc hiển thị giá trị.

int number = 100;
String str = Integer.toString(number); // "100"

Bạn cũng có thể dùng nó để chuyển đổi sang các hệ cơ số khác, chẳng hạn như nhị phân hoặc thập lục phân.

System.out.println(Integer.toBinaryString(10));  // "1010"
System.out.println(Integer.toHexString(255));    // "ff"

Các phương thức so sánh

compareTo()

compareTo() là một phương thức so sánh hai đối tượng Integer và trả về một số nguyên chỉ ra thứ tự tương đối của chúng.

Integer a = 10;
Integer b = 20;

int result = a.compareTo(b); // -1 (returns a negative value if a < b)

Nó thường được dùng kết hợp với các phương thức như Collections.sort.

equals()

equals() là một phương thức kiểm tra xem hai giá trị có bằng nhau không. Toán tử == so sánh tham chiếu, vì vậy equals() được khuyến nghị để so sánh giá trị của đối tượng.

Integer x = 100;
Integer y = 100;
System.out.println(x.equals(y)); // true

Các phương thức thao tác bitwise

answer.Độc đáo trong số các lớp Java, lớp Integer cung cấp hỗ trợ rộng rãi cho các phép toán bitwise cấp thấp.

bitCount()

Phương thức này trả về số bit được đặt thành 1 trong giá trị int được cung cấp.

int count = Integer.bitCount(15); // 15 in binary is 1111 → 4 bits set to 1

highestOneBit()

Phương thức này trả về giá trị chỉ có bit 1 ở vị trí cao nhất từ giá trị int được cung cấp.

int highest = Integer.highestOneBit(10); // 10 (1010) → 8 (1000)

Rất hữu ích cho việc tối ưu hoá liên quan đến các phép toán bitwise.

Other Handy Methods

  • Integer.reverse(int) : Đảo ngược thứ tự các bit
  • Integer.signum(int) : Trả về dấu (dương: 1, âm: -1, zero: 0)
  • Integer.hashCode() : Trả về một mã băm (quan trọng khi sử dụng các collection)

Các số được xử lý ở khắp mọi nơi trong Java. Chỉ cần biết các phương thức này sẽ giúp bạn viết mã nguồn thanh lịch và hiệu quả. Đặc biệt, các phương thức chuyển đổi, so sánh và bitwise thường được sử dụng trong thực tế, vì vậy hãy chắc chắn nắm vững chúng.

5. Lựa chọn giữa int và Integer

Trong Java, có hai kiểu để biểu diễn số nguyên: intInteger. Mặc dù bạn có thể chuyển đổi giữa chúng, việc sử dụng sai có thể dẫn đến vấn đề hiệu năng hoặc lỗi không mong muốn. Hãy xem lại các đặc điểm của chúng và cách chọn loại phù hợp cho mỗi tình huống.

Khác biệt về Hiệu năng

int là kiểu nguyên thủy, có kích thước bộ nhớ cố định (4 byte) và rất nhanh cho các phép tính. Integer ngược lại là kiểu đối tượng, được lưu trữ dưới dạng một thể hiện trên heap, và cung cấp các phương thức cùng các tính năng bổ sung.

int a = 10;
Integer b = 10;

Mặc dù bạn gán cùng một giá trị, cách xử lý nội bộ lại khác nhau. Đối với các phép tính nặng hoặc vòng lặp, việc sử dụng int nhanh hơn nhiều và tiết kiệm bộ nhớ hơn.

Ví dụ: Sự khác biệt về Hiệu năng trong Vòng lặp

long startTime = System.nanoTime();
int sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += i;
}
long endTime = System.nanoTime();
System.out.println("Time for int: " + (endTime - startTime) + " ns");

Thực hiện tương tự với Integer gây ra chi phí đóng gói và giải đóng gói, khiến nó chậm hơn nhiều lần.

Khác biệt về Khả năng Null và Xử lý Ngoại lệ

int không thể được gán null. Vì vậy nó không phù hợp khi bạn cần biểu diễn “không có giá trị” hoặc “chưa đặt”.

Integer value = null;
if (value == null) {
    System.out.println("Value is unset");
}

Với Integer, bạn có thể xử lý null một cách rõ ràng, làm cho nó lý tưởng cho các tình huống như kiểm tra biểu mẫu hoặc truy xuất cơ sở dữ liệu nơi giá trị có thể thiếu.

Tuy nhiên, giải đóng gói một Integer null thành int sẽ ném ra NullPointerException, vì vậy cần thận trọng.

Tương thích với Collections

Các collection của Java (như List và Map) chỉ có thể lưu trữ các đối tượng. Đó là lý do bạn không thể dùng int trực tiếp; bạn cần Integer thay thế.

List<Integer> numbers = new ArrayList<>();
numbers.add(100); // int → Integer via autoboxing

Ngoài ra, khi làm việc với generics, bạn không thể chỉ định một kiểu nguyên thủy làm đối số kiểu, vì vậy bạn phải sử dụng Integer.

Tóm tắt: Hướng dẫn Lựa chọn

Use CaseRecommended TypeReason
Mainly numeric calculationsintFaster processing and better memory efficiency
Need to represent presence or absence of a valueIntegerCan handle null
Working with collections or genericsIntegerObject type required
Using numbers as Map keysIntegerint can’t be used

Cơ bản, hãy nhớ: “Dùng int để tốc độ, Integer để linh hoạt.”

6. Các lỗi thường gặp và cách xử lý

NullPointerException

Nguyên nhân:

Integer là một kiểu đối tượng, nó có thể được gán null, nhưng nếu bạn cố gắng giải đóng gói một Integer null thành int, sẽ xảy ra NullPointerException.

Integer value = null;
int x = value; // Exception thrown here
Giải pháp:

Luôn kiểm tra null trước khi giải đóng gói.

if (value != null) {
    int x = value;
} else {
    int x = 0; // Assign a default value
}

Ngoài ra, bạn có thể xử lý an toàn bằng cách sử dụng Optional (Java 8+):

int x = Optional.ofNullable(value).orElse(0);

NumberFormatException

Nguyên nhân:

Ngoại lệ này được ném ra khi sử dụng Integer.parseInt() hoặc Integer.valueOf() để chuyển đổi một chuỗi không phải số.

String input = "abc";
int num = Integer.parseInt(input); // NumberFormatException
Giải pháp:

Kiểm tra trước xem đầu vào có phải là số không, thường sử dụng biểu thức chính quy.

if (input.matches("-?\\d+")) {
    int num = Integer.parseInt(input);
} else {
    System.out.println("Not a numeric value");
}

Ngoài ra, sử dụng try-catch để xử lý ngoại lệ và đảm bảo xử lý an toàn.

try {
    int num = Integer.parseInt(input);
} catch (NumberFormatException e) {
    System.out.println("Invalid number format: " + input);
}

Lạm dụng == và equals()

Nguyên nhân:

Khi so sánh hai đối tượng Integer bằng ==, bạn đang so sánh tham chiếu của chúng, không phải giá trị. Vì vậy, ngay cả khi giá trị giống nhau, false có thể được trả về nếu chúng là các đối tượng khác nhau.

Integer a = new Integer(128);
Integer b = new Integer(128);
System.out.println(a == b);       // false (different references)
System.out.println(a.equals(b)); // true (same value)

* Đối với các giá trị từ -128 đến 127, các đối tượng được lưu trữ tạm thời, vì vậy == có thể trả về true. Tuy nhiên, điều này phụ thuộc vào triển khai.

Giải pháp:

Luôn sử dụng .equals() để so sánh hai đối tượng Integer.

if (a.equals(b)) {
    System.out.println("Values are equal");
}

Bạn cũng có thể so sánh giá trị nguyên thủy int của chúng sau khi unboxing.

if (a.intValue() == b.intValue()) {
    System.out.println("Equal as int values");
}

Bỏ qua Tràn số

Nguyên nhân:

intInteger chỉ có thể xử lý giá trị 32-bit (±2,147,483,647). Nếu bạn vượt quá phạm vi này, chúng sẽ không hoạt động đúng.

int a = Integer.MAX_VALUE;
int b = a + 1;
System.out.println(b); // -2,147,483,648 (wraps around to negative)
Giải pháp:

Cân nhắc sử dụng long hoặc BigInteger nếu cần thiết, và luôn chú ý đến giới hạn.

Tóm tắt

Mặc dù Integer tiện lợi và linh hoạt, nhưng nó đi kèm với nhiều lưu ý liên quan đến null, tham chiếu và chuyển đổi kiểu. Đặc biệt đối với người mới học Java, việc hiểu tại sao một số ngoại lệ xảy ra là rất quan trọng.

Nếu bạn biết trước những lỗi phổ biến này, bạn có thể tránh lỗi và viết mã ổn định hơn.

7. Ví dụ Thực tế: Cách Sử dụng Lớp Integer

Đến nay, bạn nên có sự hiểu biết vững chắc về các tính năng, sự khác biệt và các điểm quan trọng liên quan đến lớp Integer. Tiếp theo, hãy xem một số trường hợp sử dụng thực tế nơi Integer thường được áp dụng.

Chuyển đổi Đầu vào Người dùng thành Số

Trong các ứng dụng web và desktop, đầu vào của người dùng thường được nhận dưới dạng String. Tuy nhiên, khi xử lý các trường như tuổi hoặc số lượng, bạn thường cần xử lý chúng như số, và Integer hữu ích cho việc chuyển đổi này.

String input = "25"; // User input as a string

try {
    Integer age = Integer.valueOf(input); // Convert String → Integer
    System.out.println("Age: " + age);
} catch (NumberFormatException e) {
    System.out.println("Invalid input");
}

Bằng cách xác thực rằng đầu vào là một số hợp lệ và xử lý lỗi, bạn có thể đạt được xử lý đầu vào người dùng mạnh mẽ.

Quản lý Giá trị Cấu hình và Biến Môi trường

Thường gặp là đọc giá trị hệ thống hoặc cấu hình dưới dạng chuỗi và sau đó chuyển đổi chúng thành số nguyên. Ví dụ, khi sử dụng System.getProperty(), bạn thường cần phân tích kết quả.

String maxConn = System.getProperty("app.maxConnections", "100");
int max = Integer.parseInt(maxConn);
System.out.println("Max connections: " + max);

Trong những trường hợp như vậy, việc cung cấp giá trị mặc định hợp lý và cho phép thay đổi cấu hình linh hoạt là quan trọng.

Làm việc với Số trong Bộ sưu tập

Khi bạn muốn xử lý các số trong một bộ sưu tập (như List), bạn cần sử dụng Integer thay vì int. Ví dụ, bạn có thể tạm thời lưu trữ một danh sách các ID do người dùng nhập.

List<Integer> ids = new ArrayList<>();
ids.add(101);
ids.add(205);
ids.add(309);

for (Integer id : ids) {
    System.out.println("Processing ID: " + id);
}

Cảm ơn autoboxing, việc chuyển đổi từ int sang Integer diễn ra tự động, vì vậy bạn có thể viết mã ngắn gọn mà không cần lo lắng về việc chuyển đổi thủ công.

Quản Lý Cờ Sử Dụng Các Hoạt Động Bit

Lớp Integer giàu các phương thức thao tác bit, điều này hữu ích cho quản lý cờ cấp thấp và chuyển đổi trạng thái.

int flags = 0;

// Set the 1st bit
flags |= 0b0001;

// Set the 2nd bit
flags |= 0b0010;

// Check if the 2nd bit is set
boolean isSet = (flags & 0b0010) != 0;

System.out.println("The 2nd bit is: " + (isSet ? "ON" : "OFF"));

Và bạn có thể sử dụng Integer.toBinaryString(flags) để hiển thị trạng thái cờ:

System.out.println("Current flag state: " + Integer.toBinaryString(flags));

Làm Việc Với Cơ Sở Dữ Liệu

Khi sử dụng JDBC hoặc các phương pháp tương tự để tương tác với cơ sở dữ liệu, sử dụng Integer (không phải int) cho các cột số cho phép bạn xử lý an toàn các giá trị null.

ResultSet rs = stmt.executeQuery("SELECT age FROM users WHERE id = 1");

if (rs.next()) {
    Integer age = (Integer) rs.getObject("age");
    System.out.println(age != null ? "Age: " + age : "Age not set");
}

Vì kiểu nguyên thủy int không thể là null, Integer là lựa chọn phù hợp ở đây.

Tóm Tắt

Lớp Integer không chỉ là một lớp bao bọc cho int—nó đóng vai trò quan trọng trong xử lý dữ liệu linh hoạt và đảm bảo an toàn trong phát triển thực tế. Nó đặc biệt hữu ích trong các trường hợp sau:

  • Chuyển đổi đầu vào người dùng hoặc cài đặt bên ngoài thành số
  • Xử lý dữ liệu có thể là null
  • Lưu trữ số nguyên trong bộ sưu tập
  • Quản lý trạng thái với các hoạt động bit

Bằng cách làm chủ Integer, bạn có thể viết mã mở rộng hơn, dễ bảo trì hơn và ổn định hơn.

8. Kết Luận

Lớp Integer của Java không chỉ là một thay thế cho int—nó là một lớp quan trọng liên quan chặt chẽ với bản chất hướng đối tượng của Java. Trong bài viết này, chúng tôi giải thích các điểm sau một cách dễ hiểu cho người mới bắt đầu, đồng thời bao quát các khía cạnh thực tế:

Những ưu điểm của lớp Integer là gì?

  • Vì nó có thể được coi là một đối tượng, bạn có thể làm việc với giá trị null và sử dụng nó với bộ sưu tập
  • Nó đi kèm với nhiều phương thức tiện lợi (chuyển đổi chuỗi, so sánh, hoạt động bit, và hơn thế nữa)
  • Hoạt động tốt với System.getProperty() và các hoạt động cơ sở dữ liệu, cho phép thiết kế linh hoạt
  • Bộ nhớ đệm đối tượng và autoboxing làm cho mã đơn giản và ngắn gọn hơn

Những ưu điểm này là những thứ bạn không thể có được với kiểu nguyên thủy int.

Nhưng cũng có những lưu ý quan trọng

  • Unboxing một Integer null sẽ dẫn đến NullPointerException
  • Sử dụng toán tử == có thể không so sánh giá trị như bạn mong đợi
  • int tốt hơn nhiều cho việc tính toán số quy mô lớn về mặt hiệu suất

Việc không hiểu những điểm này có thể dẫn đến lỗi bất ngờ hoặc vấn đề hiệu suất.

Chọn kiểu đúng là chìa khóa

Use CaseRecommended TypeReason
When fast numeric processing is requiredintSuperior memory efficiency and calculation speed
When data may be nullIntegerSupports nullability and can be handled safely
When used with collections or genericsIntegerBecause an object type is required
When using numbers as Map keysIntegerint cannot be used

Tóm lại, intInteger không chỉ là các kiểu khác nhau, mà nên được chọn phù hợp dựa trên mục tiêu thiết kế và trường hợp sử dụng của bạn.

Suy Nghĩ Cuối Cùng

Việc hiểu Integer là nền tảng không chỉ cho việc xử lý kiểu dữ liệu trong Java, mà còn cho việc phát triển kỹ năng lập trình sâu hơn trong thiết kế hướng đối tượng, xử lý ngoại lệ và tối ưu hóa hiệu suất.

Vì các kiểu số nguyên được sử dụng rất phổ biến, việc có hiểu biết sâu sắc từ sớm sẽ là một tài sản lớn trong hành trình phát triển Java tương lai của bạn.

Câu Hỏi Thường Gặp (FAQ)

C1. Sự khác biệt giữa intInteger là gì?

.A. int là kiểu nguyên thủy của Java được sử dụng để xử lý các giá trị số nguyên một cách hiệu quả và nhanh chóng. Integerlớp bao bọc cho phép bạn xem một int như một đối tượng, giúp bạn làm việc với các giá trị null và sử dụng nhiều phương thức khác nhau. Ví dụ, khi lưu trữ giá trị trong một collection hoặc phân biệt giữa giá trị đã được gán và chưa được gán, Integer sẽ phù hợp hơn.

Q2. Sự khác nhau giữa parseInt()valueOf() là gì?

A. Cả hai đều chuyển một chuỗi thành số, nhưng kiểu dữ liệu trả về khác nhau:

  • parseInt(String s) → trả về int (kiểu nguyên thủy)
  • valueOf(String s) → trả về Integer (kiểu đối tượng)

Chọn dựa trên nhu cầu của bạn. valueOf() hữu ích hơn nếu bạn cần một đối tượng hoặc muốn xử lý các giá trị null.

Q3. Tại sao không nên dùng == để so sánh các đối tượng Integer?

A. Toán tử == so sánh tham chiếu đối tượng, không phải giá trị thực tế. Ngay cả khi các giá trị bằng nhau, bạn vẫn có thể nhận được false nếu chúng là các thể hiện khác nhau. Đối với các giá trị từ 128 trở lên, bộ nhớ đệm đối tượng không áp dụng, vì vậy có thể xảy ra kết quả không mong muốn. Luôn sử dụng .equals() để so sánh giá trị.

Integer a = 128;
Integer b = 128;
System.out.println(a == b);       // false (different references)
System.out.println(a.equals(b)); // true (same value)

Q4. Điều gì sẽ xảy ra nếu bạn gán null cho một Integer?

A.Integer là một đối tượng, bạn có thể gán null. Tuy nhiên, nếu bạn chuyển (unbox) nó sang int khi nó đang là null, sẽ phát sinh NullPointerException.

Integer val = null;
int num = val; // Exception thrown here

Hãy chắc chắn kiểm tra null hoặc sử dụng Optional để viết mã an toàn hơn.

Q5. Làm sao để tìm giá trị lớn nhất và nhỏ nhất của Integer?

A. Trong Java, bạn có thể dùng Integer.MAX_VALUEInteger.MIN_VALUE để dễ dàng lấy các giới hạn này.

System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648

Chúng hữu ích cho việc kiểm tra phạm vi và bảo vệ khỏi tràn số.

Q6. Tại sao không thể dùng int trong các collection?

A. Các collection của Java (như List và Map) chỉ làm việc với các đối tượng, không hỗ trợ kiểu nguyên thủy. Vì vậy bạn phải dùng Integer thay thế.

List<Integer> list = new ArrayList<>();
list.add(123); // int is automatically converted to Integer

Q7. Đối với hiệu năng, nên dùng int hay Integer?

A. Đối với các phép tính tốc độ cao hoặc xử lý một lượng lớn số trong vòng lặp, int nhanh hơn nhiều và tiêu tốn ít bộ nhớ hơn. Integer tiện lợi và linh hoạt hơn, nhưng việc tạo thêm đối tượng và boxing có thể làm giảm hiệu suất trong các công việc nặng.