Integer Constant Pool trong Java

Trong bài viết hướng dẫn sử dụng Java String, StringBuffer và StringBuilder các bạn đã biết khi String được tạo bằng cách sử dụng literal thì nó được quản lý trong String Constant Pool. Vậy với kiểu Integer có Integer Contant Pool để quản lý các đối tượng như String Constant Pool không? Chúng ta sẽ cùng nhau thảo luận trong phần tiếp theo của bài viết này.

1. Integer là gì?

Lớp Integer wrap (bao đóng) một giá trị của kiểu int nguyên thủy (primitive) trong một đối tượng. Một đối tượng kiểu Integer chứa một trường duy nhất có kiểu là int.

Ngoài ra, lớp này cung cấp một số phương thức để chuyển đổi một int đến một String và một String đến một int, cũng như các hằng số và phương thức hữu ích khi thao tác với một giá trị kiểu int.

Chi tiết về lớp Wrapper, các bạn có thể xem ở bài viết Các kiểu dữ liệu trong java.

2. So sánh dữ liệu kiểu Integer

Hãy xem ví dụ bên dưới:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class IntegerCompare {
  
    public static void main(String[] args) {
        Integer i1 = 127;
        Integer i2 = 127;
          
        Integer i3 = 128;
        Integer i4 = 128;
  
        Integer i5 = new Integer(127);
        Integer i6 = new Integer(127);
          
        int i7 = 127;
          
        System.out.println(i1 == i2); // = true
        System.out.println(i3 == i4); // = false
        System.out.println(i5 == i6); // = false
        System.out.println(i1 == i5); // = false
        System.out.println(i1 == i7); // = true
    }
  
}

Java gọi phương thức Integer.valueOf() bất cứ khi nào chúng ta tạo đối tượng lớp Integer, ví dụ: Integer i1 = 127 , tương đương với Integer i1 = Integer.valueOf(127) .

Hãy xem code của phương thức Integer.valueOf() được cài đặt bên trong JDK:

Như bạn thấy, phương thức Integer.valueOf() trả về một thể hiện Integer đại diện cho giá trị int được chỉ định.

Nếu một giá trị kiểu int nằm trong khoảng Integer.low và Integer.high thì đối tượng Integer được trả về từ Integer.cache. Trường hợp ngược lại, khởi tạo đối tượng Integer mới, đại diện cho giá trị int được chỉ định.

Xem tiếp nội dung của lớp IntegerCache:

Integer.cache lưu trữ bộ nhớ đệm (cache) các giá trị Integer. Như bạn thấy giá, mặc định giá trị high = 127low = -128, nên các giá trị được cache trong khoảng từ -128 đến 127. Chúng ta có thể thay đổi giá trị high bằng cách thêm cấu hình JVM:

1
-Djava.lang.Integer.IntegerCache.high=<size>

-XX:AutoBoxCacheMax=<size>

Kết quả của ví dụ trên, có thể được giải thích thông qua hình bên dưới:

Khi so sánh bằng toán tử == nghĩa là ta so sánh địa chỉ của vùng nhớ. Trường hợp i1 và i2 cùng tham chiếu đến 1 vùng nhớ nên kết quả là true, các trường hợp khác do không cùng vùng nhớ nên kết quả là false. Trường hợp i1 == i7 có kết quả là true, lý do một kiểu Integer Wrapper khi so sánh == với một kiểu int primitive type thì JVM sẽ sử dụng cơ chế Unboxing để chuyển kiểu Wrapper về kiểu primitive tương ứng.

Lưu ý: để so sánh giá trị của 2 đối tượng kiểu Integer chúng ta nên sử dụng phương thức equals() để so sánh hoặc chuyển đổi về kiểu primitive tương ứng trước khi thực hiện so sánh ==.

Related posts:

Filtering and Transforming Collections in Guava
More Jackson Annotations
Using JWT with Spring Security OAuth (legacy stack)
Registration – Password Strength and Rules
Spring Cloud AWS – EC2
The DAO with JPA and Spring
Hướng dẫn tạo và sử dụng ThreadPool trong Java
Java Program to Find Inverse of a Matrix
Java Program to Compute Cross Product of Two Vectors
Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Conne...
Giới thiệu Swagger – Công cụ document cho RESTfull APIs
Abstract class và Interface trong Java
Java Program to Find the Shortest Path from Source Vertex to All Other Vertices in Linear Time
Guide to @ConfigurationProperties in Spring Boot
Hướng dẫn Java Design Pattern – Iterator
Consuming RESTful Web Services
Spring Security OAuth Login with WebFlux
Spring Boot - Servlet Filter
Lớp lồng nhau trong java (Java inner class)
Lập trình đa luồng với CompletableFuture trong Java 8
Spring Data JPA @Modifying Annotation
Guide to Java Instrumentation
TreeSet và sử dụng Comparable, Comparator trong java
Giới thiệu về Stream API trong Java 8
Java Program to Find Second Smallest of n Elements with Given Complexity Constraint
Java Program to Implement ArrayList API
Form Validation with AngularJS and Spring MVC
Collection trong java
Spring Boot Security Auto-Configuration
Java Program to Check Whether Topological Sorting can be Performed in a Graph
The DAO with Spring and Hibernate
Converting a Stack Trace to a String in Java