GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Java Core Basic Java Các kiểu dữ liệu trong java

Các kiểu dữ liệu trong java

Đăng vào 20/10/2017 . Được đăng bởi GP Coder . 15133 Lượt xem . Toàn màn hình

Trong Java, kiểu dữ liệu được chia làm hai loại: kiểu dữ liệu nguyên thủy (primitive) và kiểu đối tượng (object). Thông thường, để phân biệt 2 kiểu này ta dựa vào tên của nó. Kiểu nguyên thủy có tên bắt đầu bằng chữ thường, các kiểu đối tượng có tên bắt đầu bằng chữ hoa. Ví dụ: int, double là kiểu nguyên thủy, Integer, Double là kiểu đối tượng.

Nội dung

  • 1 Kiểu dữ liệu nguyên thủy
  • 2 Kiểu dữ liệu đối tượng
  • 3 Lớp Wrapper trong java

Kiểu dữ liệu nguyên thủy

Có 8 loại dữ 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ệuSố bitGiá trị nhỏ nhấtGiá trị lớn nhất
byte8-128 (-2^7)127 (2^7-1)
short16-32,768 (-2^15)32,767 (2^15 -1)
int32– 2,147,483,648
(-2^31)
2,147,483,647
(2^31 -1)
long64-9,223,372,036,854,775,808
(-2^63)
9,223,372,036,854,775,807
(2^63 -1)
float32-3.4028235 x 10^383.4028235 x 10^38
double64-1.7976931348623157 x 10^3081.7976931348623157 x 10^308
booleanfalsetrue
char16‘\u0000’ (0)‘\uffff’ (65,535).

Ví dụ:

  • 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 các số được 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 hỗ trợ một số dạng biểu 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 biểu diễn khác, chúng ta cũng có thể gặp trong chương trình Java là số kết hợp với dấu gạch dưới (_), mục đích của cách viết này để cho dễ đọc. Ví dụ:

  • int million1 = 1000000;
  • int million2 = 1_000_000;

Lưu ý: 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 một số lớn đến mức nó sẽ không còn vừa với kiểu dữ liệu nữa, do đó 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 quy trình tương tự (Underflow), khi số lượng quá thấp để phù hợp với loại dữ liệu, 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 dữ liệu đối tượng

Trong java có 3 kiểu dữ liệu đối tượng:

Kiểu dữ liệuMô tả
ArrayMột mảng của các dữ liệu cùng kiểu.
classDữ 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..
interfaceDữ 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 cung cấp cơ chế để chuyển đổi kiểu dữ liệu nguyên thủy thành kiểu đối tượng và ngược lại từ đối tượng thành kiểu dữ liệu nguyên thủy.

Kiểu nguyên thủyKiểu Wrapper
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

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ịch

Tạ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 dữ 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;
        List<Integer> listValues = 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:


AutoBoxing with Collection : 23ms
Using an Array : 8ms

Nên lựa chọn kiểu dữ 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 Java

4.6
12
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Basic Java Được gắn thẻ: Basic Java

Biến trong java
Một số ký tự đặc biệt trong Java

Có thể bạn muốn xem:

  • Mệnh đề if-else trong java (26/10/2017)
  • Câu lệnh điều khiển vòng lặp trong Java (break, continue) (27/10/2017)
  • Tạo chương trình Java đầu tiên sử dụng Eclipse IDE (19/10/2017)
  • Autoboxing và Unboxing trong Java (26/10/2017)
  • Phân biệt JVM, JRE, JDK (18/10/2017)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98056 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97696 lượt xem)
  • Giới thiệu Design Patterns (87759 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86427 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83830 lượt xem)

Nội dung bài viết

  • 1 Kiểu dữ liệu nguyên thủy
  • 2 Kiểu dữ liệu đối tượng
  • 3 Lớp Wrapper trong java

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link