1. Integerlớp học

Integercũng tốt ở chỗ nó là một lớp, có nghĩa là nó có thể có các trường và phương thức. Và, tất nhiên, nó có chúng. Rất nhiều trong số họ - hàng chục người trong số họ. Ở đây chúng tôi sẽ xem xét những cái cơ bản nhất.

Lớp này Integercó hai trường chứa các giá trị tối đa và tối thiểu có thể có của intloại:

Cánh đồng Sự miêu tả
Integer.MAX_VALUE
Giá trị tối đa có thể của intloại
Integer.MIN_VALUE
Giá trị tối thiểu có thể của intloại

Đôi khi bạn muốn gán intgiá trị nhỏ nhất hoặc lớn nhất có thể cho một biến. Để tránh làm lộn xộn mã của bạn với các hằng số khó hiểu, bạn có thể viết điều này thật rõ ràng như sau:

Mã số Sự miêu tả
int min = Integer.MIN_VALUE;
min == 0x80000000

Lớp Integerhọc cũng có một số phương pháp thú vị. Họ đây rồi:

phương pháp Sự miêu tả
String Integer.toHexString(int)
Trả về một chuỗi là đại diện thập lục phân của số
String Integer.toBinaryString(int)
Trả về một chuỗi là biểu diễn nhị phân của số
String Integer.toOctalString(int)
Trả về một chuỗi là biểu diễn bát phân của số
Integer Integer.valueOf(int i)
Kết thúc thông qua inttrong một Integerđối tượng
Integer Integer.parseInt(String)
Trả về số thu được từ chuỗi đã truyền

Trước đây bạn đã gặp phải phương thức tĩnh Integer.parseInt(). Hãy nhớ lại cách nó hoạt động:

int name = Integer.parseInt(string);

Nếu một chuỗi chứa một số (chỉ các chữ số) được truyền cho parseInt()phương thức, nó sẽ phân tích cú pháp chuỗi và trả về số mà nó chứa.

Phần còn lại của các phương pháp cũng hữu ích. Ví dụ: một số trong số chúng có thể chuyển đổi một số đã truyền thành một chuỗi chứa biểu diễn nhị phân, bát phân hoặc thập lục phân của số đó.



2. Doublelớp học

Nói chung, Doublelớp tương tự như Integerlớp, chỉ khác là nó bao bọc một doublechứ không phải một int. Nó cũng có các trường và phương thức mà chúng ta sẽ quan tâm. Hãy xem xét một vài trong số họ:

Lớp Doublehọc có sáu lĩnh vực thú vị:

Cánh đồng Sự miêu tả
double Double.NEGATIVE_INFINITY
vô cực âm
double Double.POSITIVE_INFINITY
dương vô cùng
int Double.MIN_EXPONENT
Số mũ tối thiểu có thể (2 x )
int Double.MAX_EXPONENT
Số mũ tối đa có thể (2 x )
double Double.MIN_VALUE
Giá trị tối thiểu có thể của doubleloại
double Double.MAX_VALUE
Giá trị tối đa có thể của doubleloại

vô cực

Nếu bạn chia -1.0cho 0.0, bạn sẽ nhận được âm vô cùng. Nếu bạn chia 1.0cho 0.0, bạn sẽ nhận được dương vô cùng. Bạn không chỉ có thể chia a doublecho 0 mà còn có thể sử dụng nó để lưu trữ kết quả của các phép toán này.

số mũ của mộtdouble

Hiểu số mũ là dễ dàng. Bên trong, một số kép bao gồm một phần định trị và một số mũ. Nhưng ở đây giá trị của số mũ không phải là , mà là . Như vậy, nếu số mũ tăng thêm , tổng giá trị của số sẽ tăng gấp đôi.10x2x1

MIN_EXPONENT == -1024, có nghĩa là , xấp xỉ bằng2-102410-308

Và tất nhiên, Doublelớp có các phương thức thú vị:

phương pháp Sự miêu tả
String Double.toHexString(double)
Trả về một chuỗi là đại diện thập lục phân của số
boolean Double.isInfinite(double)
Kiểm tra xem số đã truyền có phải là số vô hạn hay không.
boolean Double.isNaN(double)
Kiểm tra xem số đã qua có phải làNaN
Double Double.valueOf(double)
Kết thúc thông qua doubletrong một Doubleđối tượng
Double Double.parseDouble(String)
Trả về số thu được từ chuỗi đã truyền

Thật thú vị, có một isInfinite()phương thức trả về truenếu số đã truyền là vô cực dương hoặc âm.

Phương pháp này isNaN()tương tự — nó kiểm tra xem số đã truyền có phải là NaN( Not-a-Number , một hằng số đặc biệt cho biết giá trị không xác định hay không).



3. Characterlớp học

Lớp này Characterthú vị chủ yếu vì số lượng lớn các phương thức tiện ích tĩnh cho phép bạn kiểm tra xem các ký tự có thuộc các danh mục khác nhau hay không.

ví dụ

phương pháp Sự miêu tả
Character.isAlphabetic(int)
Kiểm tra xem một ký tự có phải là ký tự chữ cái hay không
Character.isLetter(char)
Kiểm tra xem ký tự có phải là chữ cái không
Character.isDigit(char)
Kiểm tra xem ký tự có phải là chữ số không
Character.isSpaceChar(char)
Kiểm tra xem ký tự là khoảng trắng, ngắt dòng hay ngắt trang (mã: 12, 13, 14)
Character.isWhitespace(char)
Kiểm tra xem ký tự có phải là khoảng trắng hay không: dấu cách, tab, v.v.
Character.isLowerCase(char)
Kiểm tra xem ký tự có phải là chữ thường không
Character.isUpperCase(char)
Kiểm tra xem ký tự có phải là chữ hoa không
Character.toLowerCase(char)
Chuyển ký tự thành chữ thường
Character.toUpperCase(char)
Chuyển đổi ký tự thành chữ hoa

Một tính năng của các phương pháp này là chúng hoạt động với tất cả các bảng chữ cái đã biết: chữ số Ả Rập được phân loại thành chữ số, v.v.



4. Booleanlớp học

Loại này Booleanhầu như giống với booleanloại. Sự khác biệt là tối thiểu.

Dưới đây chúng tôi hiển thị một phiên bản đơn giản hóa của Booleanlớp:

Mã số Sự miêu tả
class Boolean
{
   public static final Boolean TRUE = new Boolean(true);
   public static final Boolean FALSE = new Boolean(false);

   private final boolean value;

   public Boolean(boolean value)
   {
      this.value = value;
   }

   public boolean booleanValue()
   {
      return value;
   }

   public static Boolean valueOf(boolean value)
   {
      return (value ? TRUE : FALSE);
   }
}


Hằng số: TRUEи Hàm tạo của lớp FALSE


biến Phương thức trả về giá trị của biến nội bộ Phương thức tĩnh này chuyển đổi thành và thành .

Boolean








trueTRUEfalseFALSE

Loại Booleancó hai hằng số (hai trường):

Hằng số của lớp Đối tác cho loại boolean Sự miêu tả
Boolean.TRUE
true
ĐÚNG VẬY
Boolean.FALSE
false
SAI

Bạn có thể làm việc với chúng giống như cách bạn làm việc với booleanloại:

Mã số Ghi chú
if (Boolean.TRUE)
{
}
Lớp Booleanlà lớp duy nhất có thể được viết bên trong một điều kiện
Boolean a = Boolean.TRUE;
boolean b = Boolean.TRUE;
boolean c = true;
Cả ba biến đều bằng true/TRUE
Boolean a = Boolean.TRUE;
Boolean b = Boolean.TRUE;
if (a == b)
Các hằng số có thể được so sánh bằng cả hai equals==

Điều này cũng sẽ hoạt động.

Autoboxing hoạt động tuyệt vời ở đây. Điều đó có nghĩa là bạn có thể sử dụng loại này giống như loại booleankhác — không có cạm bẫy nào cần đề phòng.

Nó được viết như thế nào Làm thế nào nó hoạt động
Boolean a = true;
Boolean b = true;
Boolean c = false;
boolean d = a;
Boolean a = Boolean.valueOf(true);
Boolean b = Boolean.valueOf(true);
Boolean c = Boolean.valueOf(false);
boolean d = a.booleanValue();

Và đây là một so sánh của booleanBooleancác loại:

boolean a = true;
Boolean b = true; // b will be equal to Boolean.TRUE
Boolean c = true; // c will be equal to Boolean.TRUE

a == b; // true (compared by value)
a == c; // true (compared by value)
b == c; // true (compared by reference, but they point to the same object)

Nếu bạn thực sự cần một Booleanđối tượng độc lập, thì bạn cần tạo nó một cách rõ ràng:

boolean a = true;
Boolean b = new Boolean(true); // New Boolean object
Boolean c = true; // c will be equal to Boolean.TRUE

a == b; // true (compared by value)
a == c; // true (compared by value)
b == c; // false (compared by reference, and they point to different objects)

Thêm một ví dụ nữa, nơi chúng ta sẽ sử dụng Booleanphần bên trong của một if:

Mã số Ghi chú
Boolean less = (2 < 3);
if (less)
{
   ...
}
Điều này sẽ biên dịch và làm việc

Điều này sẽ biên dịch, nhưng nó sẽ không hoạt động!

Mã số Ghi chú
Boolean less = null;
if (less)
{
   ...
}

lỗi . Dòng này sẽ ném một ngoại lệ


5. Lưu trữ các giá trị trong quá trình tự động hộp thư

Có một số cạm bẫy liên quan đến các loại trình bao bọc số nguyên.

Như bạn đã biết, nếu chúng ta so sánh an intvà an Integer, thì the Integerđược chuyển đổi thành an int:

Nó được viết như thế nào Làm thế nào nó hoạt động
int a = 5;
Integer b = 5;
if (a == b)
{
   ...
}
int a = 5;
Integer b = Integer.valueOf(5);
if (a == b.intValue())
{
   ...
}

Nếu bạn so sánh hai Integerđối tượng với nhau, chúng không được chuyển thành ints:

Mã số Đầu ra bảng điều khiển
Integer a = 500;
Integer b = 500;
int c = 500;

System.out.println(a == b); // Compared by reference
System.out.println(a == c);
System.out.println(b == c);




false
true
true

a == cand , but , bởi vì khi chúng ta so sánh và chúng ta đang so sánh các tham chiếu. Đó thực chất là những gì chúng ta mong đợi.b == ca != bab

Sự ngạc nhiên

Nhưng nếu chúng ta thay thế 500bằng 100, thì chúng ta sẽ nhận được một kết quả hoàn toàn khác:

Mã số Đầu ra bảng điều khiển
Integer a = 100;
Integer b = 100;
int c = 100;

System.out.println(a == b); // Compared by reference
System.out.println(a == c);
System.out.println(b == c);




true
true
true

Vấn đề ở đây là một đối tượng mới không phải lúc nào cũng thực sự được tạo ra trong quá trình autoboxingInteger . Các đối tượng được lưu trữ cho các giá trị -128thông qua 127tính bao gồm.

Lớp Integercó một mảng ẩn lưu trữ các đối tượng: Integer(-128), Integer(-127), ... Integer(126),Integer(127)

Nếu bạn viết Integer x = 128, thì quá trình hộp thư tự động sẽ tạo một đối tượng mới, nhưng nếu bạn viết Integer x = 127, thì quá trình hộp thư tự động sẽ truy xuất đối tượng hiện có từ bộ đệm (từ mảng).

Nếu bạn không muốn Integerđối tượng đến từ bộ đệm, bạn sẽ phải tạo nó một cách rõ ràng bằng cách viết:Integer x = new Integer(127);

Tất cả các loại trình bao bọc đều có bộ đệm như vậy: Integer, Long, Byte, Short, Boolean. Đối với Booleanloại, giá trị TRUEFALSEgiá trị của nó đều là hằng số, vì vậy về cơ bản chúng cũng được lưu vào bộ đệm.