Tóm Tắt
Kiểu tài liệu nguyên thủy
Có 8 loại tài liệu nguyên thủy ( primitive data ) trong JAVA :
- Kiểu số nguyên: byte, short, int, long
- Kiểu số thực: float, double
- Kiểu ký tự: char
- Kiểu logic: trả về giá trị true hoặc false (đúng hoặc sai).
Kiểu dữ liệu | Số bit | Giá trị nhỏ nhất | Giá trị lớn nhất |
byte | 8 | -128 (-2^7) | 127 (2^7-1) |
short | 16 | -32,768 (-2^15) | 32,767 (2^15 -1) |
int | 32 | – 2,147,483,648 (-2^31) |
2,147,483,647 (2^31 -1) |
long | 64 | -9,223,372,036,854,775,808 (-2^63) |
9,223,372,036,854,775,807 (2^63 -1) |
float | 32 | -3.4028235 x 10^38 | 3.4028235 x 10^38 |
double | 64 | -1.7976931348623157 x 10^308 | 1.7976931348623157 x 10^308 |
boolean | false | true | |
char | 16 | ‘\u0000’ (0) | ‘\uffff’ (65,535). |
Ví dụ:
Bạn đang đọc: Các kiểu dữ liệu trong java – GP Coder (Lập trình Java)
- byte b = 1;
- short s = 16;
- int i = 32;
- long lg = 3123456789L;
- float f = 3.14F;
- double d = 3.24;
- boolean bool = true;
Lưu ý:
- Kiểu char và short đều có giá trị là 8 bit. Tuy nhiên, short là signed int (bao gồm số âm và dương trong khoảng -32,768 và 32,767), char là unsigned int (các số nguyên dương trong khoảng từ 0-65,535).
- float và double là các kiểu dữ liệu dùng cho giá trị dấu phẩy động (floating-point (decimal) value).
- byte, short, int, và long được sử dụng cho các số không có dấu thập phân.
- Mỗi kiểu số sử dụng gấp đôi số bit so với kiểu tương tự nhỏ hơn. Ví dụ, short sử dụng gấp đôi số bit so với byte.
- Mặc định Java xem các kiểu số nguyên là int và kiểu số có phần thập phân là double. Nên khi muốn khai báo giá trị cho kiểu long (chỉ require khi giá trị lớn hơn giá trị max của kiểu int) hay float cần thêm suffix sau giá trị số. Chẳng hạn:
- Kiểu long cần thêm ký tự L hay l. Ví dụ: long x = 3123456789L; hoặc long x = 3123456789l;
- Kiểu float cần thêm ký tự F hay f. Ví dụ: float x = 3.14F; hoặc float x = 3.14f;
Thông thường những số được màn biểu diễn từ 0-9 được gọi là hệ thập phân ( decimal number system ). Ngoài ra, Java cũng tương hỗ 1 số ít dạng trình diễn khác như :
- Hệ bát phân – Octal (chữ số 0-7), sử dụng số 0 làm tiền tố — ví dụ: 017
- Hệ thập lục phân – Hexadecimal (chữ số 0-9 và chữ cái A – F / a – f), sử dụng 0x hoặc 0X làm tiền tố — ví dụ: 0xFF, 0xff, 0XFf. Hệ thập lục phân không phân biệt chữ hoa chữ thường nên tất cả các ví dụ này đều có cùng một giá trị.
- Nhị phân – Binary (chữ số 0–1), sử dụng số 0 theo sau là b hoặc B làm tiền tố — ví dụ: 0b10, 0B10
Một dạng trình diễn khác, tất cả chúng ta cũng hoàn toàn có thể gặp trong chương trình Java là số phối hợp với dấu gạch dưới ( _ ), mục tiêu của cách viết này để cho dễ đọc. Ví dụ :
- int million1 = 1000000;
- int million2 = 1_000_000;
Lưu ý : hoàn toàn có thể thêm dấu gạch dưới ở bất kể đâu ngoại trừ ở đầu một chữ, cuối một chữ, ngay trước dấu thập phân hoặc ngay sau dấu thập phân. Ví dụ :
- double notAtStart = _1000.00; // DOES NOT COMPILE
- double notAtEnd = 1000.00_; // DOES NOT COMPILE
- double notByDecimal = 1000_.00; // DOES NOT COMPILE
- double annoyingButLegal = 1_00_0.0_0; // Ugly, but compiles
- double reallyUgly = 1__________2; // Also compiles
Overflow và underflow:
Overflow ( Tràn ) là khi 1 số ít lớn đến mức nó sẽ không còn vừa với kiểu tài liệu nữa, do đó mạng lưới hệ thống chuyển về giá trị âm thấp nhất và đếm lên từ đó. Ngoài ra còn có một quá trình tựa như ( Underflow ), khi số lượng quá thấp để tương thích với loại tài liệu, mạng lưới hệ thống sẽ chuyển về giá trị cao nhất và giảm xuống từ đó .Ví dụ :
- Overflow:
- System.out.println(2147483647 + 1); // -2147483648
- System.out.println(2147483647 + 5); // -2147483644
- Underflow:
- System.out.println(-2147483648 – 1); // 2147483647
- System.out.println(-2147483648 – 5); // 2147483643
Kiểu tài liệu đối tượng người tiêu dùng
Trong java có 3 kiểu tài liệu đối tượng người tiêu dùng :
Kiểu dữ liệu | Mô tả |
---|---|
Array | Một mảng của các dữ liệu cùng kiểu. |
class | Dữ liệu kiểu lớp đối tượng do người dùng định nghĩa. Chứa tập các thuộc tính và phương thức.. |
interface | Dữ liệu kiểu lớp giao tiếp do người dùng định nghĩa. Chứa các phương thức của giao tiếp |
Lớp Wrapper trong java
Giới thiệu lớp Wrapper
Lớp Wrapper trong java phân phối chính sách để quy đổi kiểu tài liệu nguyên thủy thành kiểu đối tượng người tiêu dùng và ngược lại từ đối tượng người dùng thành kiểu tài liệu nguyên thủy .
Kiểu nguyên thủy | Kiểu Wrapper |
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
Ví dụ :
int num1 = 1; Integer num2 = Integer.valueOf(num1);// đổi int thành Integer Integer num3 = num1;// autoboxing, tự động đổi int thành Integer trong nội bộ trình biên dịch int num4 = num2.intValue();// đổi Integer thành int int num5 = num3;// unboxing, tự động đổi Integer thành int trong nội bộ trình biên dịchTại sao cần Wrapper class
- Có thể sử dụng lớp Wrapper trong Collection.
- Cần sử dụng các biến có giá trị Null.
- Với wrapper chúng ta có thể nhận được NullPointerException khi một cái gì đó đang được thiết lập không chính xác. Đôi khi nó giúp chúng ta dễ dàng phát hiện lỗi hơn.
- Với kiểu dữ liệu nguyên thủy, các giá trị có thể được khởi tạo với giá trị mặc định 0, false, … điều này có thể không chính xác hoặc gây nhầm lẫn cho lập trình viên.
Hạn chế của Wrapper class
- Các kiểu dữ liệu nguyên thủy có thể nhanh hơn nhiều so với các lớp Wrapper tương ứng.
- Phép toán so sánh == có thể cho kết quả không như mong đợi.
- == so sánh tham chiếu (reference)
- .equal() so sánh các giá trị (value)
So sánh hiệu suất ( performance ) giữa và kiểu tài liệu nguyên thủy ( primitive type ) hay Wrapper Class
class AutoBoxingPerformanceTest { public static void main(String args[]) { long time1 = 0; long time2 = 0; ListlistValues = new ArrayList<>(); int arrValues[] = new int[1000000]; // Inserting values into List and Array for (int i = 0; i < 1000000; i++) { listValues.add(i); arrValues[i] = i; } // Reterive the values from collection objects and do the multiplication time1 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { listValues.set(i, listValues.get(i) * 10); } time2 = System.currentTimeMillis(); System.out.println("AutoBoxing with Collection: " + (time2 - time1)); // Reterive the values from arrays and do the multiplication time1 = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { arrValues[i] = arrValues[i] * 10; } time2 = System.currentTimeMillis(); System.out.println("Using an Array: " + (time2 - time1)); } }
Kết quả thực thi chương trình trên:
Xem thêm: Hướng dẫn và ví dụ Java Reflection
AutoBoxing with Collection : 23ms Using an Array : 8msNên lựa chọn kiểu tài liệu nguyên thủy ( primitive type ) hay Wrapper Class
- Nói chung, bạn nên sử dụng các kiểu nguyên thủy trừ khi bạn cần một đối tượng vì một số lý do (ví dụ sử dụng trong Collection, có thể lưu giá trị Null).
- Có một số cấu trúc nhất định như Collection bắt buộc phải sử dụng đổi tượng lớp Wrapper. Lưu ý, các đối tượng tốn nhiều chi phí hơn so với các dữ liệu kiểu nguyên thủy của chúng.
- Nếu bạn vẫn cần wrapper, hãy xem xét một cách tiếp cận khác mà không yêu cầu đối tượng nếu bạn muốn tối đa hóa hiệu suất dữ liệu.
- Chúng ta cũng phải xem xét rằng autoboxing của lớp wrapper không làm giảm việc tạo object, nhưng nó làm giảm sự phức tạp của code.
Xem thêm Autoboxing và Unboxing trong Java4.6
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!
Shares
Bình luận
phản hồi
Source: https://final-blade.com
Category: Kiến thức Internet