Command Palette

Search for a command to run...

[Java Basics] Java là gì? Lịch sử, đặc điểm và tại sao nên học Java

Java là hai thứ mang chung một cái tên: một ngôn ngữ lập trình, và một platform để chạy chương trình. Gần như mọi tranh cãi quanh Java — nhanh hay chậm, miễn phí hay không, đang chết hay không — đều bắt nguồn từ việc gộp hai thứ đó làm một.

Mọi con số và thông báo lỗi trong bài đều được kiểm chứng trực tiếp trên OpenJDK 21.0.6, macOS/aarch64. Không có dòng output nào được viết theo trí nhớ.

Java là gì? Ngôn ngữ Java và Java platform

Thứ tự của bài: Java là gì, đến từ đâu, có gì đặc trưng, đang được dùng ở đâu trong production, so với các ngôn ngữ láng giềng thì hơn kém chỗ nào, và những lời phàn nàn quen thuộc có bao nhiêu phần đúng.

Java là gì?

Java là một ngôn ngữ lập trình statically typed, object-oriented, đa mục đích, compile ra bytecode chứ không ra machine code. Bytecode đó được thực thi bởi Java Virtual Machine (JVM) — một chương trình đã được port sang mọi hệ điều hành và kiến trúc CPU phổ biến.

Sự tách bạch giữa ngôn ngữ và platform quan trọng hơn vẻ ngoài của nó. Ngôn ngữ là syntax và type system bạn viết. Platform là JVM, standard library, và định dạng class file mà cả hai thống nhất với nhau. Hai thứ này tách rời được theo cả hai chiều: Kotlin, Scala, Clojure, Groovy đều compile ra cùng loại bytecode và chạy trên cùng JVM mà không cần một dòng Java nào; ngược lại, source Java có thể được compile ahead-of-time thành file thực thi native, không cần JVM thông thường.

Khái niệmThực chất là gì
Java (ngôn ngữ)Syntax, type system và ngữ nghĩa bạn viết trong file .java
BytecodeMột tập instruction portable, lưu trong file .class
JVMChương trình load bytecode và chạy nó trên một hệ điều hành và CPU cụ thể
Java SEĐặc tả gắn ba thứ trên lại: ngôn ngữ, virtual machine, và standard library API

Vì vậy "học Java" thực ra là học ba thứ cùng lúc: ngôn ngữ, standard library, và bộ tooling. Series này đi theo đúng thứ tự đó.

Lịch sử Java qua các mốc thời gian

Java không sinh ra để làm web hay server. Nó sinh ra để điều khiển đầu thu truyền hình.

Ba mươi năm release, và thời điểm nhịp phát hành thay đổi

Những bản release đáng nhớ, và chỗ nhịp sáu tháng bắt đầu:

NămSự kiện
1991Green Team tại Sun Microsystems, dẫn dắt bởi James Gosling, bắt đầu một ngôn ngữ tên Oak, nhắm tới thiết bị gia dụng và set-top box
1995Oak đổi tên thành Java vì tên cũ đã bị đăng ký, và ra mắt công khai ngày 23/05/1995 cùng trình duyệt HotJava
1996JDK 1.0 phát hành ngày 23/01/1996
1998J2SE 1.2, được gọi là "Java 2": Swing và Collections Framework
2004J2SE 5.0: generics, annotation, enum, vòng lặp for mở rộng
2006–2007Sun mở source phần implementation thành OpenJDK, theo GPLv2 kèm Classpath Exception
2010Oracle mua lại Sun Microsystems và tiếp quản Java
2014Java 8: lambda, stream, API date/time mới. Bản được deploy rộng rãi nhất từ trước tới nay
2017Java 9: module system, và mở màn chu kỳ release sáu tháng một lần
2018Java 11, bản LTS đầu tiên theo chu kỳ mới
2021Java 17 LTS: sealed class, record, pattern matching cho instanceof
2023Java 21 LTS: virtual thread, record pattern, pattern matching cho switch
2025Java 25, bản LTS kế tiếp sau 21, phát hành tháng 9

Trước 2017, mỗi bản Java lớn cách nhau hai đến năm năm. Từ Java 9 trở đi, cứ sáu tháng có một feature release vào tháng 3 và tháng 9, và phần lớn các bản đó chỉ được hỗ trợ đến khi bản kế tiếp xuất hiện. Hai năm một lần, một bản được chọn làm LTS (long-term support) và tiếp tục nhận update bảo mật trong nhiều năm. Dòng LTS là 8, 11, 17, 21, 25.

Trên thực tế, Java 21 là bản LTS mà hầu hết dự án mới nhắm tới hiện nay. Java 25 mới hơn và tỉ lệ áp dụng đang tăng, nhưng 21 vẫn là lựa chọn an toàn cho một service làm mới; Java 17 có mặt ở khắp nơi trong code viết từ 2021; và Java 8 vẫn đang chạy một khối lượng khổng lồ phần mềm production mà không ai có ngân sách để migrate. Khi một tài liệu nói "Java" mà không nói rõ version, cứ hiểu là 17 hoặc 21.

Write once, run anywhere: thực tế diễn ra thế nào?

Khẩu hiệu này là thật, và cơ chế đằng sau nó khá đơn giản. javac không sinh ra machine code. Nó sinh ra file .class chứa bytecode — tập instruction dành cho một cỗ máy trừu tượng không tồn tại về mặt vật lý. Một JVM được build riêng cho hệ điều hành và CPU của bạn sẽ load file đó và dịch sang instruction thật trong lúc chương trình chạy.

Một file source compile thành một artifact bytecode, và ba JVM khác nhau trên Windows, macOS, Linux đều cho cùng một kết quả

Đây là chương trình nhỏ nhất đủ để thấy điều đó — nó hỏi chính platform đang chạy nó:

public class WhereAmI {
    public static void main(String[] args) {
        System.out.println("Java version: " + System.getProperty("java.version"));
        System.out.println("Running on:   " + System.getProperty("os.name")
                                            + " / " + System.getProperty("os.arch"));
    }
}

Compile và chạy trên máy dùng để viết bài này:

Java version: 21.0.6
Running on:   Mac OS X / aarch64

Phần thú vị là khi một JVM khác load đúng file đó. Compile một lần cho Java 17, rồi chạy file .class thu được trên hai virtual machine khác nhau mà không compile lại:

$ java -cp out17 WhereAmI
Java version: 21.0.6
Running on:   Mac OS X / aarch64

$ /opt/homebrew/.../openjdk@17/.../bin/java -cp out17 WhereAmI
Java version: 17.0.14
Running on:   Mac OS X / aarch64

Một artifact, hai runtime, không build lại. Mở rộng ra hệ điều hành khác và CPU khác thì đó chính là toàn bộ ý tưởng.

Tính tương thích chỉ đi theo một chiều. File .class do JDK 21 compile với target mặc định sẽ không load được trên JVM cũ hơn, và thông báo lỗi nói rõ lý do:

Error: LinkageError occurred while loading main class WhereAmI
	java.lang.UnsupportedClassVersionError: WhereAmI has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0

Bytecode cũng không phải phép màu. Bất cứ thứ gì chạm ra ngoài JVM — native library, ký tự phân tách đường dẫn, character encoding mặc định của hệ thống, API riêng của từng hệ điều hành — vẫn có thể khác nhau giữa các máy. "Write once, run anywhere" là lời hứa về bytecode, không phải về mọi dòng code bạn viết lên trên nó.

Những đặc điểm định hình Java

Compile ra bytecode, chạy trên virtual machine. Đã nói ở trên. Đây là quyết định thiết kế gốc mà mọi thứ còn lại đi theo: tính portable, JIT compiler, garbage collector, và việc bốn ngôn ngữ phổ biến khác cũng nhắm tới cùng runtime này.

Statically typed và strongly typed. Mọi variable đều có type cố định và được kiểm tra trước khi chương trình chạy. Lỗi type là lỗi compile, không phải bất ngờ lúc 3 giờ sáng trên production. Gán một String cho int thì không bao giờ tới được JVM:

Typed.java:3: error: incompatible types: String cannot be converted to int
        int count = "twelve";
                    ^
1 error

Đây là cái giá Java chọn trả: nhiều thủ tục hơn lúc viết, đổi lại loại bỏ hẳn một nhóm bug mà ngôn ngữ dynamically typed chỉ phát hiện được lúc runtime. Nó có lãi tỉ lệ thuận với kích thước codebase và số người cùng đụng vào codebase đó.

Quản lý bộ nhớ tự động. Bạn tạo object và không bao giờ phải giải phóng chúng. Garbage collector thu hồi những gì không còn được tham chiếu tới. Java 21 mặc định dùng collector G1 — chính JVM ghi lại điều đó trong log — và còn kèm sẵn vài collector khác (Parallel, Serial, ZGC, Shenandoah) cho các mục tiêu latency và throughput khác nhau. Cái giá là pause khi thu gom bộ nhớ trở thành thứ phải cân nhắc trong hệ thống nhạy latency; đổi lại, bug use-after-free và double-free không tồn tại trong code Java thông thường.

[0.006s][info][gc] Using G1

Object-oriented, rất ít lối thoát. Mọi method và mọi field đều nằm trong một class hoặc một interface. Không có function tự do và không có biến toàn cục. Những giá trị duy nhất không phải object là tám primitive type (int, long, double, boolean và vài loại nữa). Đây là ràng buộc có chủ đích — nó làm codebase lớn trở nên dễ đoán, và làm script nhỏ dài dòng hơn mức cần thiết.

Multithreaded ngay từ bản đầu tiên. Thread, lock và một memory model đã nằm trong ngôn ngữ và standard library từ bản 1.0, không phải gắn thêm bằng thư viện ngoài. Java 21 bổ sung virtual thread: thread nhẹ do JVM lập lịch thay vì hệ điều hành, cho phép một server phục vụ rất nhiều thao tác blocking đồng thời mà không cần một thread riêng cho mỗi kết nối.

Tương thích ngược ở mức hiếm thấy. Bytecode cũ vẫn chạy trên JVM mới. Compile cho Java 8 bằng compiler của Java 21 vẫn được, cho ra class file version 52.0, và file đó chạy nguyên vẹn trên JVM hiện đại:

$ javac --release 8 -d out8 WhereAmI.java
warning: [options] source value 8 is obsolete and will be removed in a future release
warning: [options] target value 8 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
3 warnings

$ file out8/WhereAmI.class
out8/WhereAmI.class: compiled Java class data, version 52.0 (Java 1.8)

$ java -cp out8 WhereAmI
Java version: 21.0.6
Running on:   Mac OS X / aarch64

Gần như không hệ sinh thái nào khác coi trọng tương thích ngược đến mức này. Đó là lý do chính khiến các doanh nghiệp chuẩn hóa trên Java, và cũng là lý do chính khiến ngôn ngữ này tiến hóa chậm hơn đối thủ.

Standard library lớn, hệ sinh thái còn lớn hơn. Runtime image của Java 21 gồm 69 module, phủ collection, I/O, networking, HTTP, cryptography, concurrency, date/time, XML và JDBC. Bên ngoài đó, Maven Central là một trong những kho package lớn nhất ngành, và bộ build tool, test framework, profiler, debugger quanh JVM trưởng thành ở mức hiếm có.

Java được dùng ở đâu trong thực tế

Lĩnh vựcHệ thống thật
Backend doanh nghiệpSpring Boot, Jakarta EE, Quarkus, Micronaut — stack mặc định cho service REST và gRPC trong doanh nghiệp
AndroidFramework API của Android là API Java; code ứng dụng viết bằng Java hoặc Kotlin, compile ra bytecode DEX và chạy bởi runtime ART
Big data và streamingHadoop, Spark, Kafka, Flink, Elasticsearch/OpenSearch, Cassandra, HBase đều là dự án chạy trên JVM
Fintech và ngân hàngCore banking, chuyển mạch thanh toán, bù trừ, giao dịch — hệ thống sống lâu, bị audit nhiều, cực kỳ nhạy với tương thích
Desktop và gameMinecraft: Java Edition; bộ IDE của JetBrains, gồm IntelliJ IDEA và Android Studio
Tooling test và buildJUnit, Selenium, Maven, Gradle, Jenkins, SonarQube

Hai quy luật giải thích danh sách trên. Java thống trị ở nơi mà một process chạy liên tục hàng tuần và throughput quan trọng hơn thời gian khởi động — đúng hình dạng của một backend service, một stream processor hay một search cluster. Và nó thống trị ở nơi code phải sống được cả thập kỷ, vì tương thích ngược là thứ người ta chỉ biết quý sau khi đã trả giá vì thiếu nó. Netflix, LinkedIn, Uber và Alibaba đều đã công bố rất nhiều tài liệu về việc vận hành hạ tầng JVM quy mô lớn.

Java vs Python vs JavaScript vs C#

JavaPythonJavaScriptC#
Type systemStatic, strong, khai báo tường minh (var suy diễn cho biến cục bộ)Dynamic, strong; type hint không được kiểm tra lúc runtimeDynamic, weak, có ép kiểu ngầm; TypeScript thêm static type lúc buildStatic, strong, khai báo tường minh
Cách thực thiBytecode, JIT compile bởi JVMBytecode, thông dịch bởi CPythonJIT compile bởi V8 / SpiderMonkey / JavaScriptCoreIL, JIT compile bởi CLR
StartupChậm nhất trong bốn; vài chục mili giây trước khi main chạyNhanhNhanhNhanh, và AOT đã trưởng thành
Throughput đỉnhRất cao sau khi warm upThấp nhất; phần nặng đẩy sang C extensionCao với những tác vụ engine được tối ưuRất cao, ngang ngửa Java
Độ dài dòngDài dòng nhấtNgắn gọn nhấtNgắn gọnNằm giữa Java và Python
Lĩnh vực điển hìnhBackend, Android, hạ tầng dữ liệuScripting, data science, ML, tự động hóaTrình duyệt, backend Node.jsPhần mềm Windows và doanh nghiệp, game Unity, backend
Độ khó khi bắt đầuTrung bình; nhiều thủ tục trước khi thấy được lợi íchDễDễ lúc đầu, khó về sauTrung bình, rất giống Java

Những chỗ Java thực sự thua:

  • Dài dòng. In một dòng chữ cũng cần một class, một method main với signature cố định, và type tường minh cho gần như mọi thứ. Python làm điều đó trong một dòng. Các bản gần đây đã cắt bớt boilerplate đáng kể, nhưng mức sàn vẫn cao hơn.
  • Thời gian khởi động. Đo trên chính máy viết bài: 25 lần chạy một chương trình Java tối giản sau 5 lần warm up cho 24,6 ms ở lần tốt nhất và 25,9 ms ở trung vị, so với 1,8 ms2,2 ms của một file thực thi C tương đương. Tắt class-data sharing bằng -Xshare:off thì con số Java lên 35,7 ms. Với một server chạy cả tháng, con số này vô nghĩa. Với một CLI tool gọi trong vòng lặp shell, hay một serverless function tính tiền theo lượt gọi, nó là chi phí lớn nhất.
  • Bộ nhớ. Một JVM lúc rảnh vẫn tốn nhiều RAM hơn process Go hoặc Python tương đương, vì nó mang theo heap, metaspace, code đã JIT compile và stack của các thread riêng.
  • Tốc độ đổi mới. Record tới ở Java 16, pattern matching cho switch tới ở Java 21 — những thứ các ngôn ngữ khác đã có từ nhiều năm trước. Tương thích ngược có giá của nó, và đây là cái giá.

Những lầm tưởng về Java vẫn còn tồn tại

Lầm tưởng: Java chậm

Đúng một nửa, và nửa đúng lại không phải nửa mà người ta nghĩ.

JVM khởi đầu bằng cách thông dịch bytecode, sau đó JIT compiler quan sát xem method nào chạy nhiều và compile những method đó sang machine code ngay trong lúc chương trình đang chạy. Cùng một vòng lặp, chạy tám lượt trong một process trên OpenJDK 21.0.6, cho thấy cả giai đoạn warm up lẫn phần thưởng sau đó:

Chế độ chạyLượt 1Lượt 2Lượt 3Lượt 6–8
Mặc định (bật JIT)13,6 ms13,5 ms8,1 ms~9,2 ms
-Xint (chỉ thông dịch)129,0 ms121,8 ms128,8 ms

Số liệu chỉ mang tính tham khảo từ một máy, nhưng hình dạng mới là điều đáng chú ý: tắt JIT thì cùng khối lượng công việc chậm hơn trên 13 lần, và ngay cả khi bật JIT, hai lượt đầu vẫn chậm hơn rõ rệt vì quá trình compile chưa xong. Một Java server chạy dài hạn dành gần như toàn bộ thời gian sống ở cột bên phải, với tốc độ so được với native code.

Các tier transition đứng sau những con số đó có thể thấy bằng -XX:+PrintCompilation: interpreter trước, rồi C1 ở tier 3, rồi C2 ở tier 4.

Trace warm up của JIT: cùng một method khởi đầu ở interpreter, được C1 compile ở tier 3 rồi C2 ở tier 4, thời gian mỗi lượt giảm dần, đặt cạnh baseline -Xint chỉ dùng interpreter

Cái thực sự chậm là đoạn mở đầu. JVM phải khởi động, load và verify class, rồi warm up trước khi đạt tốc độ đầy đủ — khoảng 25 ms khởi động đo ở trên, cộng thêm thời gian để các đường code nóng được compile. "Java chậm" và "Java nhanh" đều đúng; áp dụng câu nào phụ thuộc hoàn toàn vào việc process của bạn sống bao lâu.

Lầm tưởng: Java và JavaScript có liên quan

Không hề. Hai cái tên chung nhau bốn chữ cái, chung kiểu syntax dấu ngoặc nhọn và dấu chấm phẩy học từ C, và hết.

JavaScript ra đời tại Netscape năm 1995 do Brendan Eich viết, được đổi tên từ LiveScript thành JavaScript như một quyết định marketing trong giai đoạn Netscape hợp tác với Sun. Từ đó hai ngôn ngữ tách hẳn: type system khác, mô hình bộ nhớ và concurrency khác, standard library khác, mô hình object khác (class so với prototype), và cơ chế quản trị khác — quy trình JDK Enhancement Proposal so với Ecma TC39.

Biết cái này không giúp bạn biết cái kia. Thứ chuyển giao được là tư duy lập trình chung, không phải ngôn ngữ.

Lầm tưởng: Java đang chết

Java bị tuyên bố sắp chết từ khoảng năm 2005. Trong khi đó: cứ sáu tháng lại có một feature release đều đặn kể từ 2017, hai bản LTS đã ra mắt từ 2021 tới nay, framework API của Android là Java, và phần lớn hạ tầng dữ liệu của thế giới chạy trên JVM.

Phiên bản trung thực hơn thì hẹp hơn nhiều. Java không còn là lựa chọn mặc định cho một startup mới, nó đã rơi khỏi vị trí đầu bảng trong các chỉ số phổ biến, và nó mất hẳn mảng scripting và data science vào tay Python. Nhưng khối lượng code đang chạy là khổng lồ, chi phí migrate rất đắt, và nhu cầu tuyển dụng bám theo khối lượng code đó chứ không bám theo xu hướng. "Không còn thời thượng" và "đang chết" là hai chuyện hoàn toàn khác nhau.

Lầm tưởng: Java không miễn phí

Bản thân Java miễn phí. OpenJDK — bản implementation tham chiếu mà gần như mọi bản phân phối đều dựng lên từ đó — là mã nguồn mở theo GPLv2 kèm Classpath Exception, giấy phép này cho phép bạn deploy ứng dụng mã nguồn đóng trên nó.

Thứ có thể tốn tiền là một bản build cụ thể của một nhà cung cấp cụ thể, kèm hỗ trợ thương mại. Bản JDK của Oracle được phát hành theo điều khoản riêng của Oracle, và toàn bộ sự nhầm lẫn bắt nguồn từ tháng 1/2019, khi Oracle ngừng cung cấp update công khai miễn phí cho Oracle JDK 8 dùng cho mục đích thương mại. Đó là thay đổi license với bản binary của một nhà cung cấp, không phải với ngôn ngữ.

Các bản build miễn phí và dùng được cho production gồm Eclipse Temurin (Adoptium), Amazon Corretto, Azul Zulu, Microsoft Build of OpenJDK, bản của Red Hat, SapMachine, và chính các bản GPL của Oracle trên jdk.java.net.

⚠️ License gắn với bản build bạn tải về, không gắn với chữ "Java". Trước khi deploy, hãy kiểm tra xem trong container image của bạn thực sự là JDK của nhà cung cấp nào.

Có nên học Java không?

Nên, với điều kiện biết rõ là học để làm gì.

Hãy học Java nếu bạn nhắm tới backend quy mô lớn, Android, hạ tầng dữ liệu, hoặc fintech — đó là những chỗ Java không chỉ có mặt mà còn thống trị. Static type system và bộ tooling dựng trên nó (refactor đáng tin cậy, điều hướng chính xác, lỗi bắt được từ lúc compile) trả lại xứng đáng cái giá thủ tục khi codebase và team lớn dần. Và kiến thức JVM chuyển giao được: Kotlin, Scala, Clojure dùng lại đúng runtime đó, đúng thư viện đó, đúng công cụ debug đó.

Đừng bắt đầu bằng Java nếu bạn muốn có một website chạy được trong cuối tuần này, nếu bạn hướng tới data science và machine learning, hoặc nếu mục tiêu của bạn là những process sống rất ngắn mà thời gian khởi động chiếm phần lớn chi phí.

Có một điểm cần đính chính ngay từ đầu: Java hiện đại không phải là ngôn ngữ mà người ta hay chê. Record, var, text block, switch expression, sealed type và virtual thread đều đã xuất hiện từ 2018 trở lại đây. Những lời chê trích dẫn giáo trình năm 2010 đang mô tả một ngôn ngữ không còn tồn tại.

FAQ

Java có phải là JavaScript không?

Không, và hai thứ này cũng không họ hàng gì. Java là ngôn ngữ statically typed, compile ra bytecode chạy trên JVM, chủ yếu dùng cho backend và Android. JavaScript là ngôn ngữ dynamically typed chạy trong trình duyệt và trong Node.js. Cái tên giống nhau chỉ là một quyết định marketing năm 1995.

Nên học Java version nào?

Java 21. Đây là bản LTS mà hầu hết dự án mới nhắm tới, và mọi thứ bạn học trên nó đều áp dụng được cho 17 và 8 — phần nền tảng không đổi, chỉ có syntax bổ sung phía trên là khác. Học bản cũ rồi nâng cấp sau khó hơn làm theo chiều ngược lại.

Java có miễn phí không?

Có. OpenJDK dùng license GPLv2 kèm Classpath Exception, và các bản build miễn phí từ Adoptium, Amazon, Azul, Microsoft đều dùng được cho production. Chỉ một số bản build thương mại có hỗ trợ trả phí — điển hình là của Oracle — mới có điều khoản cần đọc kỹ trước khi deploy.

Học Java mất bao lâu?

Syntax và phần object-oriented cơ bản mất vài tuần luyện tập đều đặn. Làm việc được trên một codebase Spring Boot thật thì mất vài tháng, vì hệ sinh thái — build tool, dependency injection, ORM, testing, deploy — lớn hơn ngôn ngữ rất nhiều. Ngôn ngữ mới là phần ngắn.

Java có phù hợp làm ngôn ngữ đầu tiên không?

Chấp nhận được, nhưng không phải lựa chọn dễ chịu nhất. Static type và thông báo lỗi rõ ràng của compiler thực sự giúp người mới, vì lỗi hiện ra ngay lập tức kèm lời giải thích cụ thể. Đổi lại, ngay dòng đầu tiên bạn đã gặp class, access modifier và public static void main trước khi hiểu chúng nghĩa là gì. Nếu đích đến của bạn là backend thì bắt đầu bằng Java là lựa chọn hợp lý.

Có cần biết Java để làm Android không?

Kotlin là lựa chọn mặc định cho dự án Android mới, nhưng framework API của Android là API Java, một lượng rất lớn tài liệu và code Android sẵn có được viết bằng Java, và Kotlin được thiết kế để tương tác với Java. Kiến thức Java chuyển giao trực tiếp; làm Android mà hoàn toàn không đụng tới Java là chuyện hiếm.

Kết luận

Java là một ngôn ngữ statically typed, object-oriented, compile ra bytecode, cộng với một virtual machine chạy bytecode đó ở mọi nơi. Nó khởi đầu là Oak tại Sun năm 1991, phát hành JDK 1.0 năm 1996, về tay Oracle năm 2010, và ra bản mới sáu tháng một lần kể từ 2017, với Java 21 là bản LTS mà phần lớn dự án mới nhắm tới. Nó dài dòng và khởi động chậm, đồng thời cực nhanh khi đã warm up, cực ổn định giữa các version, và bám rễ sâu trong backend, Android lẫn hạ tầng dữ liệu. Tất cả những điều đó đều đúng cùng một lúc.

Bài tiếp theo sẽ cài đặt Java và mổ xẻ đám từ viết tắt: JDK thực sự chứa những gì, JRE là gì, JVM làm gì, và bạn cần cái nào trên máy của mình.

Bài viết liên quan

[Java Basics] Từ khóa this, static và final trong Java

Ba từ khóa this, static và final trong Java trên JDK 21 — this trỏ vào đâu, vì sao static field dùng chung cho mọi object, thứ tự static initialiser, constant inlining soi bằng javap, và vì sao final không hề làm object immutable.

[Java Basics] Đọc và ghi file text trong Java

Đọc và ghi file text trong Java: FileReader và FileWriter, vì sao cần BufferedReader và BufferedWriter, try-with-resources, API hiện đại Files và Path, đường dẫn tương đối, các exception thật khi file không tồn tại, và character encoding quyết định dữ liệu tiếng Việt có sống sót hay không.

[Java Basics] JDK, JRE, JVM là gì? Phân biệt và cách cài đặt môi trường Java

Phân biệt chính xác JDK, JRE và JVM, vì sao không còn bản JRE riêng để tải, cách cài Java 21 trên macOS, Windows, Linux và cách đọc lỗi UnsupportedClassVersionError.

[Java Basics] Tham số, giá trị trả về và overloading trong Java

Parameter, giá trị trả về và overloading trong Java: vì sao Java luôn là pass-by-value, vì sao swap không chạy được, bốn phase của overload resolution, quy tắc varargs, cùng mọi compile error chạy thật trên JDK 21.