TopGit
Đánh giá repo GitHub

Guava: Thư viện lõi Java của Google

google/guava
GTopGit review image for google/guava
Review by Topgit.dev for google/guava, with GitHub repository stats and README context.
Nhận định nhanh

Guava là thư viện lõi Java do chính Google phát triển, và theo README, nó được dùng trong phần lớn dự án Java nội bộ của Google lẫn nhiều công ty bên ngoài. Nên dùng Guava nếu bạn muốn multimap, multiset và các builder collection bất biến (immutable) đã được kiểm chứng thay vì tự viết wrapper quanh HashMap và List. Bỏ qua nếu dự án của bạn đủ nhỏ, vì thêm một dependency Maven lúc này không đáng.

Sao
★ 51.7k
Fork
⑂ 11.2k
Ngôn ngữ
Java
Giấy phép
Apache-2.0
Chủ đề
Backend
Cập nhật
Aug 2026
Trang chủ
GitHub

Tìm hiểu về Google Guava

Guava là bộ công cụ Java riêng của Google, xây trên nền java.util chứ không thay thế nó. Bên trong có thêm các kiểu collection như multimap và multiset, collection bất biến dựng sẵn, một graph library, cùng tiện ích cho concurrency, I/O, hashing, primitives và strings. Đây không phải một framework để bạn tái cấu trúc ứng dụng theo — chỉ cần thêm dependency rồi import class như ImmutableList ở chỗ thư viện chuẩn còn thiếu.

Các thư viện và tiện ích cốt lõi

  • Kiểu collection multimap và multiset — một key ánh xạ tới nhiều value, và một set đếm được số lần mỗi phần tử xuất hiện, cả hai đều không có sẵn trong collections framework của java.util.
  • Builder cho collection bất biến (như ImmutableList, xem tại guava.dev/ImmutableList) dùng cho dữ liệu bạn muốn đảm bảo caller không thể sửa đổi.
  • Một graph library để biểu diễn và duyệt cấu trúc đồ thị trực tiếp, thay vì tự dựng node và edge bằng tay.
  • Tiện ích concurrency xây trên nền java.util.concurrent, bổ sung thêm công cụ concurrency cho Java ngoài những gì JDK có sẵn.
  • Tiện ích I/O, dù README cảnh báo một số tính năng trong com.google.common.io có thể hoạt động không đúng ngoài Linux.
  • Tiện ích hashing cùng các hàm hỗ trợ cho primitives và strings.
Số sao GitHub của repo này thay đổi thế nào theo thời gian. Nguồn: star-history.com.Xem lịch sử sao

Tích hợp Guava vào Build của bạn

Group ID Maven của Guava là com.google.guava, artifact ID là guava. Thêm version 33.6.0-jre nếu bạn nhắm tới JRE (Java 8 trở lên), hoặc 33.6.0-android nếu cần tương thích Android — source cho Android nằm trong thư mục android của repo. Với Gradle, khai báo implementation("com.google.guava:guava:33.6.0-jre") nếu chỉ dùng nội bộ, hoặc đổi implementation thành api nếu kiểu dữ liệu của Guava xuất hiện trong public API của chính bạn (README dẫn tới tài liệu Gradle về sự khác biệt này). Một điểm cần lưu ý: Guava cần com.google.guava:failureaccess:1.0.3 ở runtime để linkage, nên đảm bảo quá trình resolve dependency không loại bỏ nó. Nếu muốn bản mới nhất từ nhánh master, có snapshot build công bố dưới version 999.0.0-HEAD-jre-SNAPSHOT (hoặc bản tương ứng cho android).

Tài nguyên học Guava

README xem wiki Guava Explained là hướng dẫn chính cho người mới dùng — đây là điểm bắt đầu tốt nhất để hiểu cách dùng thực tế, chứ không chỉ liệt kê chữ ký API. Muốn tra chi tiết từng method thì vào Javadoc tại guava.dev/api, hoặc nhảy thẳng tới một class bằng cách thêm tên class vào sau guava.dev, ví dụ guava.dev/ImmutableList. Khi gặp vấn đề thực tế, README hướng câu hỏi kiểu how-to tới tag guava trên StackOverflow, còn GitHub issues thì dành riêng cho lỗi và yêu cầu tính năng. Ngoài ra còn hai Google Groups: guava-announce cho tin phát hành và guava-discuss cho thảo luận mở.

Điểm mạnh

  • Multimap và multiset lấp đúng khoảng trống của java.util, thay vì bạn phải tự duy trì một Map<K, List<V>> khác.
  • API không gắn @Beta giữ tính binary-compatible vô thời hạn, theo README — lần cuối một API non-Beta bị gỡ là ở Guava 21.0, nên bạn có thể xây public API dựa trên đó mà không lo bị phá vỡ đột ngột.
  • Giấy phép Apache-2.0 — không phải lo copyleft khi đưa vào code thương mại.
  • Có hai flavor build (JRE và Android) nên chỉ cần một thư viện thay vì duy trì riêng tiện ích collection cho từng nền tảng.
  • 51.566 star và 11.156 fork trên GitHub — dấu hiệu rõ ràng cho thấy nhiều team đã dùng thật, dù con số này không phải lý do duy nhất để chọn nó.

Những cảnh báo quan trọng khi sử dụng

  • API gắn @Beta có thể thay đổi hoặc bị gỡ bất cứ lúc nào — rủi ro thật sự nếu bạn viết một thư viện mà người dùng nằm ngoài tầm kiểm soát của bạn; README khuyên dùng công cụ riêng Guava Beta Checker để phát hiện việc dùng nhầm.
  • Guava không cam kết object đã serialize đọc được xuyên suốt các version — README cảnh báo dạng serialize của một object có thể đổi mà không báo trước, nên lưu trữ lâu dài rồi kỳ vọng bản Guava sau đọc lại đúng là một canh bạc tệ.
  • Các class của Guava không được thiết kế để chống lại caller ác ý — README nói rõ không nên dùng chúng làm ranh giới giao tiếp giữa code tin cậy và code không tin cậy.
  • Tiện ích I/O có một lưu ý về nền tảng: README cảnh báo một số tính năng trong com.google.common.io có thể hoạt động không đúng ngoài Linux.
  • Thêm Guava cũng kéo theo dependency runtime failureaccess và vài dependency chỉ dùng cho annotation — thêm một thứ nữa mà cây dependency của bạn phải resolve cho sạch.

Cân nhắc các thư viện tiện ích Java khác

Apache Commons LangVavrEclipse Collections

Câu hỏi thường gặp về Guava

Guava có những flavor nào?

Guava có hai flavor: flavor JRE cần JDK 1.8 trở lên cho dự án Java thông thường, và flavor Android cho khả năng tương thích Android, với source đặt trong thư mục android của repo.

Làm sao thêm Guava vào dự án Maven hoặc Gradle?

Trong Maven, đặt group ID là com.google.guava và artifact ID là guava, với version 33.6.0-jre hoặc 33.6.0-android. Trong Gradle, dùng implementation("com.google.guava:guava:33.6.0-jre") — hoặc api(...) thay vì implementation(...) nếu kiểu dữ liệu của Guava xuất hiện trong public API của chính bạn.

Annotation `@Beta` trong Guava nghĩa là gì?

Annotation @Beta đánh dấu một class hay method là chưa ổn định — Guava có thể thay đổi hoặc gỡ bỏ nó bất cứ lúc nào, nên README khuyên tác giả thư viện tránh phụ thuộc vào API @Beta trừ khi repackage lại, và gợi ý dùng công cụ riêng Guava Beta Checker.

Guava có tương thích nhị phân (binary-compatible) giữa các version không?

Bất kỳ API nào của Guava không gắn @Beta đều giữ tính binary-compatible vô thời hạn, theo README, kể cả API đã @Deprecated. Lần cuối một API non-Beta bị gỡ là ở bản Guava 21.0.

Object của Guava có an toàn khi serialize không?

Không an toàn cho lưu trữ lâu dài — README cảnh báo dạng serialize của một object có thể đổi mà không báo trước ở bản phát hành sau, nên xem nó như một định dạng ổn định để lưu trữ là một canh bạc tệ.

Guava yêu cầu hệ thống như thế nào?

Flavor JRE cần JDK 1.8 trở lên, còn unit test của flavor Android chạy trên API level 24 (Nougat). README cũng ghi rằng flavor chính được test trên OpenJDK ở cả Linux và Windows, với một số tính năng trong com.google.common.io được cảnh báo là không ổn định ngoài Linux.

Vấn đề mà Guava giải quyết

java.util thuần không có map giữ nhiều value cho một key, không có set đếm được phần tử trùng lặp, và không có cách nào trả về một collection mà bạn thật sự đảm bảo là bất biến — team thường vá lỗ hổng này bằng wrapper Map<K, List<V>> tự chế hoặc gọi Collections.unmodifiableList(), vốn không ngăn được code phía trên sửa đổi list gốc. Khoảng trống đó cộng dồn khá nhanh. Guava đóng gói đúng những khoảng trống ấy — multimap, multiset, builder collection bất biến, một graph library, cùng tiện ích concurrency và I/O — thành một thư viện Java duy nhất thay vì một đống class tiện ích tự viết rải khắp codebase.

Ứng dụng thực tế tốt nhất

  • Mô hình hóa quan hệ một-nhiều (tag cho từng bài viết, quyền cho từng user) bằng Multimap thay vì tự quản lý Map<K, List<V>>.
  • Trả về snapshot bất biến, an toàn của state nội bộ bằng builder collection bất biến của Guava.
  • Đếm số lần xuất hiện — tần suất từ, số lượng sự kiện — bằng Multiset thay vì tự đếm bằng Map<T, Integer>.
  • Biểu diễn và duyệt cấu trúc đồ thị bằng graph library của Guava thay vì tự viết code adjacency-list.
  • Bổ sung thêm tiện ích concurrency trên nền java.util.concurrent cho backend Java 8+.
  • Dùng chung một thư viện tiện ích cho cả JRE lẫn Android thay vì duy trì hai thư viện riêng.

Ai nên dùng — và ai nên bỏ qua

Bất kỳ dev Java hay Android nào bắt đầu dự án mới, đang chán viết tay wrapper kiểu multimap, builder snapshot bất biến, hay tiện ích cache cơ bản, nên thêm Guava ngay từ ngày đầu — đây là dependency ít gây phiền cho việc đó. Bỏ qua nếu team bạn đã chuẩn hóa quanh Vavr hay Eclipse Collections cho cùng công việc, vì phần trùng lặp không đáng để mang theo hai thư viện giải quyết cùng một vấn đề.

Repo liên quan

Nguồn & ghi công

Thông tin, số version và trích dẫn trong bài đến từ README của repo google/guava trên GitHub (github.com/google/guava).

Dữ liệu GitHub · đồng bộ lần cuối 6 thg 8, 2026Đánh giá bởi Henry
Về TopGit