JavaRush /Blog Java /Random-VI /Hướng dẫn lớp số nguyên Java

Hướng dẫn lớp số nguyên Java

Xuất bản trong nhóm
Trong bài viết này chúng ta sẽ nói về lớp Integer. Chúng ta hãy xem xét những câu hỏi sau:
  • các lớp bao bọc là gì;
  • tự động đóng gói/giải nén các bản gốc;
  • hoạt động của lớp Integer, các phương thức và hằng số của nó.
Hướng dẫn lớp số nguyên Java - 1

Các lớp bao bọc của các kiểu nguyên thủy

Như các bạn đã biết, Java có nhiều kiểu dữ liệu khác nhau, có thể chia thành hai khối:
  • nguyên thủy;
  • thẩm quyền giải quyết.
Có một số kiểu dữ liệu nguyên thủy trong Java:
  • số nguyên - byte, short, int, long;
  • số dấu phẩy động (thực) - float, double;
  • kiểu dữ liệu logic - boolean;
  • kiểu dữ liệu ký tự - char.
Mỗi kiểu dữ liệu nguyên thủy có lớp bao bọc riêng. Một kiểu dữ liệu tham chiếu bao bọc em trai nguyên thủy của nó trong một đối tượng Java. Dưới đây là các kiểu dữ liệu nguyên thủy và các lớp bao bọc tương ứng của chúng:
Kiểu nguyên thủy Trình bao bọc lớp
byte Byte
ngắn Ngắn
int số nguyên
dài Dài
trôi nổi Trôi nổi
gấp đôi Gấp đôi
boolean Boolean
ký tự Tính cách
Theo nghĩa thực tế, các lớp nguyên thủy và các lớp bao bọc của chúng có nhiều điểm chung. Hầu hết các hoạt động được thực hiện giống hệt nhau. Tuy nhiên, các lớp bao bọc có một số đặc điểm không phải là đặc trưng của lớp nguyên thủy. Đầu tiên là các lớp: khi làm việc với các lớp bao bọc, chúng ta làm việc với các đối tượng. Thứ hai (mọi thứ tiếp theo từ điểm một), các đối tượng này có thể rỗng. Thứ ba, các lớp trình bao bọc cung cấp một số hằng số và phương thức giúp làm việc với một kiểu dữ liệu cụ thể dễ dàng hơn. Trong bài viết này, chúng ta sẽ xem xét kỹ hơn cách làm việc với lớp Integer.

số nguyên

Lớp Integer là lớp bao bọc của kiểu nguyên thủy int. Lớp này chứa một trường duy nhất kiểu int. Là một lớp trình bao bọc, Integer cung cấp nhiều phương thức khác nhau để làm việc với int, cũng như một số phương thức để chuyển đổi int thành String và String thành int. Dưới đây chúng ta sẽ xem xét các ví dụ khác nhau khi làm việc với lớp. Hãy bắt đầu với việc sáng tạo. Cách được sử dụng phổ biến nhất (và dễ sử dụng nhất) là tùy chọn tạo sau:
Integer a = 3;
Nghĩa là, việc khởi tạo một biến Integer trong trường hợp này tương tự như việc khởi tạo một biến int. Hơn nữa, một biến Integer có thể được khởi tạo bằng giá trị của biến int:
int i = 5;
Integer x = i;
System.out.println(x); // 5
Trong trường hợp trên, việc tự động đóng gói diễn ra ngầm. Chúng ta sẽ nói nhiều hơn về nó dưới đây. Ngoài các tùy chọn khởi tạo được liệt kê ở trên, một biến Số nguyên có thể được tạo giống như các đối tượng khác, sử dụng hàm tạo và từ khóa mới:
Integer x = new Integer(25);
System.out.println(x);
Tuy nhiên, nó mất nhiều thời gian hơn để viết và đọc lâu hơn, vì vậy tùy chọn này ít phổ biến nhất. Bạn có thể làm mọi thứ với biến Integer mà bạn có thể làm với biến int. Họ có thể là:
Nếp gấp

Integer a = 6;
Integer b = 2;
Integer c = a + b;
System.out.println(c); // 8
Trừ

Integer a = 6;
Integer b = 2;
Integer c = a - b;
System.out.println(c); // 4
nhân

Integer a = 6;
Integer b = 2;
Integer c = a * b;
System.out.println(c); // 12
Chia

Integer a = 6;
Integer b = 2;
Integer c = a / b;
System.out.println(c); // 3
Tăng

Integer a = 6;
a++;
++a;
System.out.println(a); // 8
Giảm

Integer a = 6;
a--;
--a;
System.out.println(a); // 4
Tuy nhiên, với tất cả những điều này, bạn cần phải cẩn thận và nhớ rằng Integer là kiểu dữ liệu tham chiếu và biến thuộc loại này có thể là null. Trong trường hợp này (nếu biến là null), tốt hơn là bạn nên hạn chế thực hiện các phép tính số học (và bất kỳ phép tính nào khác trong đó null không mang lại điềm báo tốt). Đây là một ví dụ:
Integer a = null;
Integer b = a + 1; // Здесь мы упадем с "Exception in thread "main" java.lang.NullPointerException"
System.out.println(b);
Hầu hết các phép so sánh được thực hiện theo cách tương tự như kiểu nguyên thủy int:
Integer a = 1;
Integer b = 2;

System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
Đầu ra:

false
false
true
true
Hoạt động so sánh hai biến Integer nổi bật. Và vấn đề ở đây là Integer là một kiểu dữ liệu tham chiếu và các biến của nó lưu trữ các tham chiếu đến các giá trị chứ không phải chính các giá trị đó (đối tượng). Có thể quan sát thấy biểu hiện của thực tế này khi thực thi đoạn mã sau:
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);

System.out.println(a == b); // true
System.out.println(a == c); // false
Kết quả của đẳng thức thứ nhất sẽ đúng và đẳng thức thứ hai sẽ sai. Điều này xảy ra vì trong trường hợp đầu tiên, chúng ta so sánh hai biến (“a” và “b”) lưu trữ các tham chiếu đến cùng một đối tượng. Và trong trường hợp thứ hai, chúng ta so sánh hai biến tham chiếu đến hai đối tượng khác nhau (khi tạo biến “c”, chúng ta đã tạo một đối tượng mới). Hãy đưa ra một ví dụ thú vị khác:
Integer a = 1;
Integer b = 1;

Integer x = 2020;
Integer y = 2020;

System.out.println(a == b); // true
System.out.println(x == y); // false
Như chúng ta có thể thấy, kết quả của phép so sánh đầu tiên là đúng và kết quả của phép so sánh thứ hai là sai. Đó là tất cả về bộ nhớ đệm. Tất cả các số nguyên trong phạm vi từ -128 đến 127 (các giá trị này có thể được tùy chỉnh) đều được lưu trữ. Vì vậy, khi chúng ta tạo một biến mới và gán cho nó một giá trị số nguyên trong khoảng từ -128 đến 127, chúng ta không tạo một đối tượng mới mà chỉ gán cho biến đó một tham chiếu đến một đối tượng đã được tạo trong bộ đệm. Bây giờ, biết được sự thật này, ví dụ trên có vẻ không quá thần bí. Các biến a và b tham chiếu đến cùng một đối tượng - một đối tượng từ bộ đệm. Và trong quá trình khởi tạo các biến x và y, mỗi lần chúng tôi tạo một đối tượng mới và các biến này lưu trữ các tham chiếu đến các đối tượng khác nhau. Và như các bạn đã biết, toán tử == so sánh giá trị của các biến, còn giá trị của biến tham chiếu là tham chiếu. Để kiểm tra chính xác sự bằng nhau giữa hai biến Số nguyên, bạn phải sử dụng (dù nó nghe có vẻ tầm thường đến mức nào) phương thức bằng. Hãy viết lại ví dụ trên:
Integer a = 1;
Integer b = 1;

Integer x = 2020;
Integer y = 2020;

System.out.println(a.equals(b)); // true
System.out.println(x.equals(y)); // true

Tự động đóng hộp và mở hộp Số nguyên

Tự động đóng gói và giải nén là gì? Khi tạo các biến Số nguyên mới, chúng tôi đã sử dụng cấu trúc sau:
Integer a = 2020;
Bằng cách này, chúng tôi đã tạo một đối tượng mới mà không cần sử dụng toán tử khóa mới. Điều này có thể thực hiện được nhờ cơ chế tự động đóng gói của kiểu nguyên thủy int. Quy trình ngược lại xảy ra khi gán một biến int nguyên thủy cho giá trị của biến tham chiếu Số nguyên:
Integer a = 2020;
int x = a;
Trong trường hợp này, dường như chúng ta đã gán tham chiếu (cụ thể là tham chiếu đến đối tượng là giá trị của biến “a”) cho một biến nguyên thủy. Nhưng trên thực tế, nhờ cơ chế auto-unpack nên giá trị 2020 đã được ghi vào biến “x”, auto-packing/unpack là hiện tượng rất phổ biến trong Java. Thường thì nó tự xảy ra, thậm chí đôi khi người lập trình không hề hay biết. Nhưng bạn vẫn cần biết về hiện tượng này. Chúng tôi có một bài viết thú vị về chủ đề này trên Javarush .

Hằng số lớp số nguyên

Lớp Integer cung cấp nhiều hằng số và phương thức khác nhau để làm việc với số nguyên. Trong phần này chúng ta sẽ xem xét kỹ hơn một số trong số chúng trong thực tế. Hãy bắt đầu với các hằng số. Bảng dưới đây hiển thị tất cả các hằng số lớp:
Costanta Sự miêu tả
KÍCH CỠ Số bit trong hệ thống số có hai chữ số được chiếm bởi kiểu int
byte Số byte trong hệ thống số có hai chữ số được chiếm bởi kiểu int
GIÁ TRỊ TỐI ĐA Giá trị tối đa mà kiểu int có thể chứa
MIN_VALUE Giá trị tối thiểu mà kiểu int có thể giữ
KIỂU Trả về một đối tượng kiểu Class từ kiểu int
Hãy xem giá trị của tất cả các hằng số này bằng cách chạy đoạn mã sau:
public static void main(String[] args) {
        System.out.println(Integer.SIZE);
        System.out.println(Integer.BYTES);
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.TYPE);
}
Kết quả là chúng ta nhận được kết quả đầu ra sau:

32
4
2147483647
-2147483648
int

Các phương thức của lớp Integer

Bây giờ chúng ta hãy xem nhanh các phương thức được sử dụng nhiều nhất của lớp Integer. Vì vậy, những cái “trên cùng” đứng đầu là các phương thức chuyển đổi một số từ một chuỗi hoặc chuyển đổi một chuỗi từ một số. Hãy bắt đầu bằng việc chuyển đổi một chuỗi thành một số. Phương thức ParseInt được sử dụng cho những mục đích này , chữ ký bên dưới:
  • 
    static int parseInt(String s)
    
Phương thức này chuyển đổi String thành int. Hãy chứng minh cách thức hoạt động của phương pháp này:
int i = Integer.parseInt("10");
System.out.println(i); // 10
Nếu không thể chuyển đổi—ví dụ: chúng tôi đã chuyển một từ sang phương thức extractInt—một ngoại lệ NumberFormatException sẽ được đưa ra. Phương thức ParseInt(String s) có một phương thức anh chị em bị quá tải:
  • 
    static int parseInt(String s, int radix)
    
Phương thức này chuyển đổi tham số s thành int. Tham số cơ số cho biết số trong s ban đầu được viết trong hệ thống số nào, số này phải được chuyển đổi thành int. Ví dụ dưới đây:
System.out.println(Integer.parseInt("0011", 2)); // 3
System.out.println(Integer.parseInt("10", 8));   // 8
System.out.println(Integer.parseInt("F", 16));   // 15
Các phương thức ParseInt trả về kiểu dữ liệu nguyên thủy int. Các phương thức này có một phương thức tương tự - phương thức valueOf . Một số biến thể của phương pháp này chỉ cần gọi nội bộ phân tích cú pháp. Sự khác biệt so với ParseInt là kết quả của valueOf sẽ là Số nguyên chứ không phải int. Hãy xem xét bên dưới tất cả các tùy chọn cho phương pháp này và một ví dụ về cách thức hoạt động của nó:
  • static Integer valueOf(int i) - trả về một Số nguyên có giá trị là i;
  • static Integer valueOf(String s) - tương tự như parsInt(String s), nhưng kết quả sẽ là Integer;
  • static Integer valueOf(String s, int radix) - tương tự như extractInt(String s, int radix), nhưng kết quả sẽ là Integer.
Ví dụ:
int a = 5;
Integer x = Integer.valueOf(a);
Integer y = Integer.valueOf("20");
Integer z = Integer.valueOf("20", 8);

System.out.println(x); // 5
System.out.println(y); // 20
System.out.println(z); // 16
Chúng tôi đã xem xét các phương pháp cho phép bạn chuyển đổi Chuỗi thành int/Integer. Quy trình ngược lại đạt được bằng cách sử dụng các phương thức toString . Bạn có thể gọi phương thức toString trên bất kỳ đối tượng Integer nào và nhận được biểu diễn chuỗi của nó:
Integer x = 5;
System.out.println(x.toString()); // 5
Tuy nhiên, do phương thức toString thường được gọi ngầm trên các đối tượng (ví dụ: khi gửi một đối tượng đến bàn điều khiển để in), nên phương thức này hiếm khi được các nhà phát triển sử dụng một cách rõ ràng. Ngoài ra còn có một phương thức tĩnh toString, phương thức này nhận tham số int và chuyển đổi nó thành biểu diễn chuỗi. Ví dụ:
System.out.println(Integer.toString(5)); // 5
Tuy nhiên, giống như phương thức toString không tĩnh, việc sử dụng phương thức tĩnh một cách rõ ràng là rất hiếm. Thú vị hơn là phương thức tĩnh toString, có 2 tham số nguyên:
  • static String toString(int i, int radix) - sẽ chuyển đổi i thành biểu diễn chuỗi trong hệ thống số cơ số.
Ví dụ:
System.out.println(Integer.toString(5, 2)); // 101
Lớp Integer có một số phương thức để tìm giá trị lớn nhất/nhỏ nhất của hai số:
  • static int max(int ​​​​a, int b) sẽ trả về giá trị lớn nhất trong số các biến được truyền;
  • static int min(int a, int b) sẽ trả về giá trị nhỏ nhất trong số các biến được truyền.
Ví dụ:
int x = 4;
int y = 40;

System.out.println(Integer.max(x,y)); // 40
System.out.println(Integer.min(x,y)); // 4

Phần kết luận

Trong bài viết này chúng ta đã xem xét lớp Integer. Chúng ta đã nói về loại lớp này và lớp bao bọc là gì. Chúng tôi nhìn lớp học từ góc độ thực tế. Chúng ta đã xem xét các ví dụ về các phép tính số học, bao gồm cả các phép tính so sánh. Chúng ta đã xem xét sự phức tạp của việc so sánh hai biến Số nguyên và xem xét khái niệm về các đối tượng được lưu trong bộ nhớ đệm. Chúng tôi cũng đã đề cập đến hiện tượng tự động đóng gói/giải nén các kiểu dữ liệu nguyên thủy. Ngoài ra, chúng ta đã xem xét một số phương thức của lớp Integer cũng như một số hằng số. Họ đưa ra ví dụ về việc chuyển đổi số từ hệ thống số này sang hệ thống số khác.

Bài tập về nhà

  1. Nghiên cứu xem có những phương pháp nào khác của lớp Integer (bạn có thể nghiên cứu chúng trên trang web với tài liệu chính thức ), viết vào phần nhận xét phương pháp nào bạn đã nghiên cứu (không bao gồm những phương pháp được đưa ra trong bài viết) theo quan điểm của bạn là hữu ích nhất ( sẽ được bạn sử dụng thường xuyên nhất). Và cũng cung cấp lý do cho ý kiến ​​​​của bạn.

    Tái bút Không có câu trả lời đúng ở đây, nhưng hoạt động này sẽ giúp bạn học bài tốt hơn.

  2. Giải quyết một vấn đề nhỏ đơn giản để củng cố tài liệu.

    Chúng ta có hai số:

    1100001001 - trong hệ thống số nhị phân
    33332 - trong hệ thống số ngũ phân

    Điều cần thiết là chỉ sử dụng các phương thức của lớp Integer để xác định số lớn nhất trong số hai số đã cho, sau đó hiển thị chênh lệch giữa giá trị lớn nhất và nhỏ nhất trong hệ thống số ba.

  3. Chuyển đổi giá trị Số nguyên tối đa có thể sang hệ thống số bát phân và hiển thị số chữ số trong số kết quả (đếm số theo chương trình).

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION