Ra đời từ những năm 1990, chỉ sau 5 năm ra mắt, ngôn ngữ lập trình Java luôn đứng vững trong danh sách các ngôn ngữ lập trình thông dụng nhất. Chính vì mức độ phổ biến đó mà các tin tuyển dụng cho vị trí lập trình viên Java luôn ở mức cao. Tìm kiếm việc làm ở vị trí lập trình viên Java không phải là quá khó khăn. Tuy nhiên nếu không có sự chuẩn bị tốt dù bạn là người mới vào nghề hay là một lập trình viên Java có nhiều kinh nghiệm, việc vượt qua vòng phỏng vấn về lập trình Java cũng không hề dễ dàng. Dưới đây là danh sách hơn 100 câu hỏi phỏng vấn Java bạn nên tham khảo trước khi các cuộc phỏng vấn để chắn chắn rằng bạn không bị bỏ lại phía sau so với những ứng viên khác.
Các câu hỏi phỏng vấn về Java dưới đây được chia làm nhiều chủ đề để dễ theo dõi. Bạn có thể tìm ngay câu gợi ý trả lời bên dưới câu hỏi, hoặc tìm câu trả lời đầy đủ theo các link đính kèm. Dù là có ngay câu trả lời bên dưới hay cần phải vào các link, bạn hãy đọc câu hỏi và tự mình tìm câu trả lời trước khi xem kết quả có sẵn. Như vậy bạn sẽ nắm rõ hơn những vấn đề cần giải quyết và điều đó sẽ giúp bạn tự tin hơn khi tham gia vào cuộc phỏng vấn.
Các câu hỏi phỏng vấn Java chung
1/JVM là gì? Tại sao Java được gọi là ngôn ngữ lập trình không phụ thuộc vào nền tảng (Platform Independent Programming Language)?
Java Virtual Machine (JVM) là quy trình máy ảo có thể thực thi các Java bytecode. Mỗi một Java source file được biên dịch ra một bytecode file. Java được thiết kế để các chương trình ứng dụng có thể chạy trên bất kỳ nền tảng nào mà không cần phải viết lại chương trình nhờ vào Java JMV. Cũng chính vì vậy mà các ứng dụng Java còn được gọi là WORA (Write Once Run Anywhere – Viết một lần chạy mọi nơi).
2/ Bạn hãy cho biết sự khác nhau giữa JDK và JRE
The Java Runtime Environment (JRE) là trình triển khai của Java Virtual Machine (JVM) nơi mà chương trình Java của bạn được thực thi. Nó cũng bao gồm các plugins trình duyệt để thực thi các applet.
Java Development Kit (JDK) là công nghệ cốt lõi của Software Development Kit của Java. Nó bao gồm JRE, trình biên dịch và các công cụ như JavaDoc, Java Debugger. JDK dùng để phát triển, biên dịch và thực thi các ứng dụng Java
3/Từ khóa Static có nghĩa là gì? Bạn có thể ghi đè (override) private hay static method trong Java không?
Từ khóa static trong Java được sử dụng chính để quản lý bộ nhớ. Chúng ta có thể áp dụng từ khóa static với các biến, các phương thức, các khối, các lớp lồng nhau(nested class). Từ khóa static thuộc về lớp chứ không thuộc về instance(thể hiện) của lớp.
Trong java, Static có thể là:
- Biến static: Khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.
- Phương thức static: Khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.
- Khối static: Được sử dụng để khởi tạo thành viên dữ liệu static.
Nguồn: Viettuts
Bạn không thể ghi đè static method trong Java.
4/ Bạn có thể truy cập một biến non-static trong một ngữ cảnh static (static context) được không?
Một biến static phụ thuộc vào lớp của nó và giá trị của nó sẽ tồn tại (giữ) cho tất cả các thực thể của lớp đó. Biến static được tạo ra khi lớp chứa đó được tải (load) bởi JVM. Nếu cố gắng truy cập vào một biến non-static (trong hàm static) mà không có trong thực thể (instance) nào thì trình biên dịch sẽ báo lỗi, bởi vì những biến non-static đó chưa được khởi tạo và chúng không có ràng buộc với bất kỳ thực thể nào.
Nguồn: gpcoder
5/ Có những kiểu dữ liệu nào trong Java. Autoboxing và Unboxing là gì?
Có 8 kiểu dữ liệu cơ bản được Java hỗ trợ:
- byte
- short
- int
- long
- float
- double
- boolean
- char
Autoboxing là quá trình mà trình biên dịch của Java tự động chuyển đổi giữa kiểu dữ liệu cơ bản (Primitive type) về đối tượng tương ứng với lớp (Wrapper class) của kiểu dữ liệu đó. Ví dụ, trình biên dịch sẽ chuyển đổi kiểu dữ liệu int sang Integer, kiểu double sang Double, …Và ngược lại là unboxing. Đây là tính năng mới của Java 5.
Tham khảo thêm: Autoboxing và Unautoboxing trong Java
6/ Function Overriding và Overloading là gì trong Java?
Phương thức overloading trong Java xảy ra khi hai hoặc nhiều phương thức trong cùng một lớp có cùng tên nhưng có các biến khác nhau. Trong khi đó, phương thức overriding được định nghĩa trong trường hợp khi một lớp con định nghĩa lại một phương thức đã có mặt ở lớp cha. Các phương thức overriding phải cùng tên, danh sách đối số và kiểu trả về. Phương thức overriding có thể không giới hạn truy cập phương thức mà nó override.
Tham khảo: Phân Biệt Được Overriding và Overloading
7/ Bạn hãy cho biết Constructor, Constructor Overloading, Copy-Constructor là gì trong Java?
Contractor là một dạng đặc biệt của phương thức được sử dụng để khởi tạo các đối tượng. Java Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.
Constructor Overloading là một kỹ thuật trong Java. Bạn có thể tạo nhiều constructor trong cùng một lớp với danh sách tham số truyền vào khác nhau. Trình biên dịch phân biệt các constructor này thông qua số lượng và kiểu của các tham số truyền vào.
Java không hỗ trợ copy constructor như trong C++.
Tham khảo thêm: Constructor trong Java
8/ Java có hỗ trợ đa kế thừa (multiple inheritance) không?
Không, Java không hỗ trợ đa kế thừa (và cả kiểu kế thừa lai – Hybrid inheritance) thông qua các class. Tuy nhiên, bạn vẫn có thể đạt được tính đa kế thừa trong Java thông qua các interface
9/ Bạn hãy cho biết sự khác nhau giữa một Interface và một lớp trừu tượng (Abstract class) trong Java?
Bảng so sánh sự khác nhau giữa Interface và Abstract Class:
Lớp trừu tượng (abstract class) |
Interface |
Thể hiện tính trừu tượng < 100% |
Thể hiện tính trừu tượng 100% (Java < 8). |
Lớp trừu tượng có thể có các phương thức abstract và non-abstract |
Phiên bản Java < 8, Interface chỉ có thể có phương thức abstract. |
Lớp trừu tượng không hỗ trợ đa kế thừa |
Interface hỗ trợ đa kế thừa |
Lớp trừu tượng có thể có các biến final, non-final, static và non-static |
Interface chỉ có các biến static final |
Lớp trừu tượng có thể có phương thức static, phương thức main và constructor |
Interface không thể có phương thức static, main hoặc constructor. |
Từ khóa abstract được sử dụng để khai báo lớp trừu tượng |
Từ khóa interface được sử dụng để khai báo Interface |
Lớp trừu tượng có thể cung cấp trình triển khai của Interface |
Interface không cung cấp trình triển khai cụ thể của lớp abstract |
Ví dụ: |
Ví dụ: |
Sử dụng Abstract class khi chúng ta chỉ có thể hoàn thành một vài chức năng (method/ function) chuẩn của hệ thống, một vài chức năng còn lại các lớp extends phải hoàn thành. Những tính năng đã hoàn thành này vẫn sử dụng như bình thường, đây là những tính năng chung. |
Sử dụng Interface khi bạn muốn tạo dựng một bộ khung chuẩn gồm các chức năng (method/ function) mà tất cả module/ project cần phải có. Các module phải implements tất cả chức năng đã được định nghĩa. |
Nguồn: gpcoder
10/ Truyền theo tham chiếu (Pass by reference) và truyền theo giá trị (pass by value) là gì?
- Pass-by-value được hiểu là khi thay đổi biến trong hàm thì ngoài hàm sẽ không bị ảnh hưởng. Nó giống như bạn copy giá trị của biến vào biến khác rồi truyền vào hàm.
- Pass-by-reference là khi thay đổi biến trong hàm cũng làm ngoài hàm bị ảnh hưởng. Nó giống như bạn truyền đúng địa chỉ của biến đó vào hàm.
Nguồn: kipalog
Câu hỏi về Java Threads
11/ Bạn hãy cho biết sự khác nhau giữa các process và các threads?
Một process là một quá trình thực thi của một chương trình trong khi Thread (Luồng) là một thực thi đơn bên trong một process. Một process có thể có thể có đa luồng (multiple threads). Một Thread có thể được gọi là một Quy Trình Nhẹ (lightweight process)
Tham khảo thêm: Process vs Thread
12/ Bạn hãy cho biết các cách khác nhau để tạo một Luồng (Thread). Bạn thường dùng cách nào và tại sao?
Có ba cách để tạo Thread:
- Cách 1: tạo luồng bằng cách kế thừa từ lớp thread
- Cách 2: Tạo luồng bằng cách implement từ Interface Runnable
- Cách 3: một ứng dụng có thể dụng Executor framework để tạo thread pool
Cách tạo luồng bằng cách implement từ Interface Runnable thường được dùng vì không cần một object thừa kế từ lớp Thread. Trong trường hợp ứng dụng của bạn sử dụng đa thừa kế (multiple inheritance) thì đây là cách duy nhất. Bên cạnh đó, thread pool là rất hiệu quả và có thể dễ dàng thực hiện và sử dụng
13/ Bạn hãy giải thích ngắn gọn các trạng thái có thể có của một luồng
Trong quá trình thực thi, một thread có thể có các trạng thái sau:
- New: Thread ở trạng thái new nếu bạn tạo một instance của lớp Thread nhưng trước khi gọi phương thức start()
- Runnable: thread sẵn sang để thực thi nhưng không nhất thiết phải bắt đầu thực thi ngay
- Running: vi xử lý bắt đầu thực thi thread code
- Non-Runnable (Blocked): bao gồm blocked on I/O và blocked on Synchronization. Đây là trạng thái khi luồng vẫn còn tồn tại, nhưng hiện tại không đủ điều kiện để chạy.
- Terminated: kết thúc thực thi.
14/ Bạn hãy giải thích sự khác nhau giữa phương thức đồng bộ (synchronized method) và đồng bộ khối (synchronized block)
Trong lập trình Java, mỗi đối tượng (object) có một khóa (lock). Một luồng có thể nhận được khóa cho một đối tượng bằng cách dùng từ khóa đồng bộ (synchronized keyword). Từ khóa synchronized có thể áp dụng ở cấp độ method (coarse grained lock) hoặc cấp độ block (fine grained lock).
15/ Làm thế nào để việc đồng bộ phương thức xảy ra bên trong một monitor? Các cấp độ nào của việc đồng bộ bạn có thể áp dụng?
JVM sử dụng khóa kết hợp với monitor. Monitor về cơ bản là công cụ giám sát theo dõi một chuỗi mã được đồng bộ hóa và đảm bảo rằng mỗi lần chỉ có một thread thực thi. Mỗi monitor được liên kết với một đối tượng tham chiếu. Thread không được phép thực cho đến khi nó nhận được khóa.
16/ Deadlock là gì?
Deadlock là một trạng thái xảy ra khi có hai processes mà process này chờ cho process kia thực thi xong trước khi tiếp tục. Kết quả là cả hai process đều chờ vô thời hạn.
17/ Làm thế nào để tránh deadlock trong Java?
Để tránh deadlock chúng ta có thể dùng các cách sau:
- Tránh Nested Locks: một deadlock có thể xảy ra khi bạn cung cấp các khóa cho nhiều thread. Vì vậy cần tránh cấp khóa cho multiple threads nếu đã cấp cho một thread.
- Tránh các khóa không cần thiết: chỉ cấp khóa cho các đối tượng cần.
- Dùng Thread.join() với thời gian thực thi tối đa
Tham khảo thêm: Tránh deadlock trong Java
Các câu hỏi về Java Collections
18/ Bạn hãy cho biết các interface cơ bản của bộ thư viện Java Collections framework.
Java Collections Framework cung cấp một tập hợp các intrefaces và classes được thiết kế để hỗ trợ các hoạt động trên một tập hợp các objects. Các giao diện cơ bản trong Java Collections Framework là:
- Collection interface: Collection Interface định nghĩa những phương thức cơ bản khi làm việc với tập hợp, đây là gốc cũng là nền móng để từ đó xây dựng lên cả bộ thư viện Java Collection Framework. Collection Interface được kế thừa từ Iterable Interface nên các bạn có thể dễ dàng duyệt qua từng phần tử thông qua việc sử dụng Iterator.
- Set interface: Set (tập hợp) là kiểu dữ liệu mà bên trong nó mỗi phần tử chỉ xuất hiện duy nhất một lần (tương tự như tập hợp trong toán học vậy) và Set Interface cung cấp các phương thức để tương tác với set. Set Interface được kế thừa từ Collection Interface nên nó cũng có đầy đủ các phương thức của Collection Interface.
- List interface: List (danh sách) là cấu trúc dữ liệu tuyến tính trong đó các phần tử được sắp xếp theo một thứ tự xác định. List Interface định nghĩa các phương thức để tương tác với list cũng như các phần tử bên trong list. Tương tự như Set Interface, List Interface cũng được kế thừa và có đầy đủ các phương thức của Collection Interface.
- Queue interface: Queue (hàng đợi) là kiểu dữ liệu nổi tiếng với kiểu vào ra FIFO (first-in-first-out hay vào trước ra trước), tuy nhiên với Queue Interface thì queue không chỉ còn dừng lại ở mức đơn giản như vậy mà nó cũng cấp cho bạn các phương thức để xây dựng các queue phức tạp hơn nhiều như priority queue (queue có ưu tiên), deque (queue 2 chiều), … Và cũng giống như 2 interface trước, Queue Interface cũng kế thừa và mang đầy đủ phương thức từ Collection Interface
- Map interface: Map (đồ thị/ánh xạ) là kiểu dữ liệu cho phép ta quản lý dữ liệu theo dạng cặp key-value, trong đó key là duy nhất và tương ứng với 1 key là một giá trị value. Map Interface cung cấp cho ta các phương thức để tương tác với kiểu dữ liệu như vậy. Không giống như các interface ở trên, Map Interface không kế thừa từ Collection Interface mà đây là 1 interface độc lập với các phương thức của riêng mình
Nguồn tham khảo: tổng quan về Collection trong Java
19/ Bạn hãy giải thích tại sao Collection không mở rộng Cloneable và Serializable interfaces?
Lý do là Collection là interface gốc của tất cả các lớp collection (như ArrayList, LinkedList). Nếu collection interface mở rộng Cloneable/Serializable interfaces thì nó bắt buộc tất cả các triển khai cụ thể của interface này để triển khai các cloneable and serializable interfaces. Để mang lại sự tự do cho các lớp triển khai cụ thể, giao diện Collection interface không mở rộng Cloneable hay Serializable interfaces.
Nguồn: Self learning Java
20/ Iterator là gì trong Java?
Iterator trong Java là một interface được sử dụng để thay thế Enumerations trong Java Collection Framework. Bạn có thể sử dụng iterator để:
- Duyệt các phần tử từ đầu đến cuối của một collection.
- Iterator cho phép xóa phần tử khi lặp một collection.
- Với một số phương thức của Iterator mà bạn có thể tham khảo.
Nguồn: codegym
21/ Bạn hãy giải thích sự khác nhau giữa Iterator và ListIterator
- Một Iterator có thể được dùng để duyệt các Set và List collections, trong khi ListIterator chỉ có thể dùng để lặp lại List .
- Iterator có thể duyệt một collection theo hướng chuyển tiếp trong khi ListIterator có thể duyệt theo hai hướng.
- ListIterator triển khai Iterator interface và chứa các chức năng bổ sung như thêm phần tử, thay thế phần tử, lấy vị trí index của các phần tử trước và sau…
22/ Bạn hãy cho biết sự khác nhau giữa fail-fast và fail-safe?
Thuộc tính fail-safe của Iterator hoạt động với bản sao của collection bên dưới và do đó, nó không bị ảnh hưởng bởi bất kỳ sửa đổi nào trong collection. Tất cả các collection classes trong gói java.util package là fail-fast, trong khi các collection classes trong java.util.concurrent là fail-safe. Fail-fast iterators Fail-fast iterators cho ra một ConcurrentModificationException, trong khi fail-safe iterator không bao giờ cho ra một ngoại lệ (exception ) như vậy.
Tham khảo thêm: Fail Fast vs Fail Safe
23/ Hashmap hoạt động thế nào trong Java?
Để trả lời câu hỏi phỏng vấn Java này bạn có thể tham khảo bài viết Hashmap là gì và Hashmap hoạt động thế nào trên Java đăng trên Codelearn.
24/ Hãy cho biết sự quan trọng của các phương thức hashCode() và equals()
Một Hashmap trong Java dùng hashCode và equals method để xác định chỉ mục của cặp key-value. Các phương thức này cũng được dùng để yêu cầu giá trị của một key nào đó. Nếu hai phương thức này không được triển khai đúng, hai key khác nhau có thể tạo ra hai giá trị hash giống nhau và như vậy sẽ được collection xem là bằng nhau. Ngoài ra, hai phương thức này còn được dùng để dò tìm các trùng lắp. Như vậy việc triển khai hai phương thức này là rất quan trọng cho tính chính xác và đúng đắn của HashMap
25/ Bạn hãy giải thích sự khác nhau giữa HashMap và Hashtable?
Sự sự khác nhau giữa HashMap và Hashtable được thể hiện qua bảng sau:
Nguồn: Viettuts
26/ Sự khác nhau giữa Array và ArrayList là gì?
Mảng (Array) là một cấu trúc dữ liệu có kích thước cố định, trong khi ArrayList là một lớp Collection có thể thay đổi được kích thước. Nghĩa là chúng ta không thể thay đổi kích thước của mảng khi đã tạo, nhưng ArrayList có thể được thay đổi.
Chúng ta không thể lưu giữ dữ liệu nguyên thủy trong ArrayList, nó chỉ có thể chứa các đối tượng. Nhưng mảng có thể chứa cả hai kiểu dữ liệu nguyên thủy và các đối tượng trong Java. Kể từ Java 5, kiểu nguyên thủy được tự động chuyển đổi trong các đối tượng được gọi là auto-boxing.
Nguồn: Codegym
27/ Bạn hãy cho biết sự khác nhau giữa ArrayList và LinkedList?
Bảng sau cho thấy sự khác nhau giữa ArrayList và LinkedList trong Java
Xem toàn bộ sự khác nhau tại đây
28/ Comparable và Comparator interface là gì?
Comparable và Comparator, đều là các giao diện (interface) và có thể được sử dụng để sắp xếp các phần tử của Collection
Bạn có thể xem đầu đủ về Comparable và Comparator interface tại đây
29/ Java Priority Queue là gì?
PriorityQueue là một hàng đợi không bị ràng buộc, dựa trên một heap ưu tiên và các phần tử của nó được sắp xếp theo thứ tự tự nhiên. Tại thời điểm tạo, bạn có thể cung cấp Comparator để chịu trách nhiệm sắp xếp thứ tự các phần tử của PriorityQueue. PriorityQueue không cho phép giá trị rỗng (null), những đối tượng không cung cấp thứ tự tự nhiên hoặc những đối tượng không có bất kỳ comparator nào được liên kết với chúng. Java PriorityQueue cũng không phải là thread-safe và yêu cầu thời gian O (log (n)) cho các hoạt động sắp xếp và xếp hàng của nó.
30/ Bạn biết gì về big-O notation (độ phức tạp của thuật toán)?
Big-O notation (ký hiệu Big-O) chỉ đơn giản mô tả một thuật toán mở rộng quy mô hoặc hoạt động tốt như thế nào trong trường hợp xấu nhất khi số lượng phần tử trong cấu trúc dữ liệu tăng lên. Big-O notation cũng có thể được sử dụng để mô tả các hành vi khác như tiêu thụ bộ nhớ. Vì các collection classes cũng là cấu trúc dữ liệu, chúng ta thường sử dụng Big-O notation để chọn cách triển khai tốt nhất dựa trên thời gian, bộ nhớ và hiệu suất. Big-O notation có thể cung cấp một dấu hiệu tốt về hiệu suất cho một lượng lớn dữ liệu.
Câu hỏi này bạn có thể gặp trong bất cứ cuộc phỏng vấn lập trình với ngôn ngữ khác chứ không riêng Java. Xem thêm về Big-O notation
31/ Khi nào thì nên dùng dãy không thứ tự (unordered array) khi nào dùng dãy có thứ tự (ordered array)?
Lợi ích chính giữa việc dùng dãy có thứ tự là thời gian tìm kiếm có độ phức tạp là O(log n) trong khi với dãy không thứ tự, độ phức tạp là O (n). Tuy nhiên, dãy có thứ tự cũng có hạn chế là các tác vụ insert lại có độ phức tạp O(n). Lý do là các phần tử với giá trị cao hơn phải được di chuyển để tạo khoản trống có các phần tử mới. Trong khi đó, tác vụ insert cho một dãy không có thứ tự cần thời gian cố định là O(1).
32/ Bạn hãy kể ra một số best practices liên quan đến Java Collection framework
Một số best practices liên quan đến Java Collection framework có thể kể đến
- Chọn đúng kiểu collection để sử dụng căn cứ vào yêu cầu của ứng dụng sẽ giúp cải thiện hiệu suất. Ví dụ nếu bạn biết được kích thước của các phần tử là cố định và biết được thứ tự, bạn sẽ dùng Array thay vì ArrayList
- Một số lớp collection cho phép bạn đặc tả sức chứa ban đầu. Như vậy nếu bạn ước tính được số phần tử sẽ được chứa, bạn có thể dùng nó để tránh rehashing hoặc là resizing.
- Luôn dùng Generics cho type-safety, dễ đọc và mạnh mẽ. Bên cạnh đó, bằng cách dùng Genetics bạn cũng tránh được ClassCastException trong thời gian thực thi.
- Dùng immutable classes trong Java Development Kit (JDK) để tránh việc triển khai phương thức hashCode và equals cho các custom class.
- Trả về các tập hợp hoặc mảng có độ dài bằng 0 thay vì trả về giá trị null trong trường hợp underlying collection thực sự trống.
Xem thêm: 18 Java Collections and Generics Best Practices
33/ Đâu là sự khác nhau giữa Enumeration và Iterator interfaces?
Sự khác biệt giữa Enumeration và Iterator
Nguồn: Viettuts
34/ Bạn hãy cho biết sự khác nhau giữa HashSet, LinkedhashSet và TreeSet
So sánh giữa HashSet, LinkedhashSet và TreeSet:
Bạn có thể xem toàn bộ sự so sánh tại đây
Các câu hỏi về Garbage Collectors
Garbage Collectors (Bộ dọn rác hay Bộ thu gom rác) được định nghĩa như là một quá trình tự động thực thi nhiệm vụ quản lý bộ nhớ trong Java. Code Java được dịch sang bytecode rồi chạy trên máy ảo (JVM). Trong quá trình chạy chương trình, các đối tượng được tạo ở vùng nhớ heap, một phần bộ nhớ dành cho chương trình. Sau cùng, sẽ có một vài đối tượng mà chương trình không cần dùng đến. Các đối tượng này sẽ được garbage collector truy tìm và xóa bỏ để thu hồi lại dung lượng bộ nhớ. Có khá nhiều câu hỏi phỏng vấn Java khiến bạn gặp khó khăn trong phần này.
35/ Mục đích của Garbage Collector là gì trong Java và khi nào nó được sử dụng
Mục đích của garbage collection là để xác định và loại bỏ những đối tượng không còn cần thiết của ứng dụng, để các tài nguyên được thu hồi và tái sử dụng.
36/ Các System.gc() và Runtime.gc() methods dùng để làm gì?
Các methods này có thể dùng như một dấu hiệu để JVM khởi động việc dọn rác. Tùy nhiên, tùy thuộc vào JVM mà garbage collection được khởi động ngay hoặc sau đó.
37/ Mục đích của finalization là gì? Khi nào thì phương thức finalize() được gọi?
Phương thức finalize() là một phương thức đặc biệt được cài đặt sẵn cho các lớp. Garbage Collector sẽ gọi phương thức này trước khi hủy một đối tượng. Vì vậy việc cài đặt một số thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu trong phương thức finalize() sẽ giúp cho người lập trình chủ động kiểm soát tốt quá trình hủy đối tượng thay vị giao cho trình dọn dẹp hệ thống tự động. Đồng thời việc cài đặt trong phương thức finalize() sẽ giúp cho bộ nhớ được giải phóng tốt hơn, góp phần cải tiến tốc độ chương trình.
Nguồn: laptrinh.vn
38/ Nếu một object reference được set là null thì Garbage Collector có ngay lập tức giải phóng bộ nhớ bị chiếm giữ bởi đối tượng đó?
Không, đối tượng sẽ sẵn sang cho việc thu gom rác trong chu kỳ tiếp theo chứ không phải ngay lập tức.
39/ Cấu trúc của Java Heap là gì? Không gian PermGen trong Heap là gì?
JVM có một vùng nhớ trong bộ nhớ (heap) là vùng runtime data mà trong đó bộ nhớ dành cho class instances và array được cấp phát. Nó được tạo ra khi JVM khởi động. Vùng nhớ heap cho các đối tượng được trả lại bởi hệ thống quản lý bộ nhớ tự động (garbage collector). Vùng nhớ heap chứa các đối tượng đang còn sử dụng (live objects) hoặc không (dead objects). Các đối tượng đang hoạt động có thể được truy cập bởi các ứng dụng và sẽ không là đối tượng của garbage collection. Các dead objects là các đối tượng sẽ không bao giờ được các ứng dụng truy cập nhưng chưa được thu dọn bởi garbage collector. Các đối tượng này chiếm giữ bộ nhớ cho đến khi được thu dọn.
PermGen là viết tắt của Permanent Generation và nó là vùng không gian heap đặc biệt được tách biệt với heap Java chính nơi JVM theo dõi metadata của các lớp đã được tải.
Tìm hiểu thêm về Permanent Generation tại đây
40/ Bạn hãy cho biết sự khác nhau giữa Serial và Throughput Garbage collector
Throughput Garbage Collector sử dụng một phiên bản song song của young generation collector (young generation là nơi chứa toàn bộ object mới được khởi tạo) và được sử dụng với các ứng dụng có tập dữ liệu trung bình đến lớn. Trong khi đó Serial Collector thường đủ cho hầu hết các ứng dụng nhỏ (những ứng dụng yêu cầu vùng nhớ heap lên đến xấp xỉ 100MB trên bộ xử lý hiện đại).
Tìm hiểu thêm về sự khác nhau giữa Serial và Throughput Garbage collector tại đây.
41/ Khi nào thì một objects đủ điều kiện để thu gom trong Java?
Một object trong Java có thể bị thu gom rác khi nó không thể truy cập được vào chương trình mà nó hiện đang được sử dụng.
42/ Garbage collection có xảy ra trong không gian permanent generation trong JVM không?
Permanent generation hay còn gọi là vùng nhớ Perm là vùng nhớ không chứa Object, nó chứa metadata của JVM như các thư viện Java SE, mô tả các class và các method của ứng dụng. Do đó, khi phải “dọn” các class, method không cần thiết, garbage collector sẽ tìm kiếm trong nhóm này. Nhưng hầu như garbage collector sẽ không “chạm” tới vùng nhớ này.
Nguồn: medium
Các câu hỏi về xử lý ngoại lệ trong phỏng vấn Java
43/ Bạn hãy cho biết hai kiểu Xử lý ngoại lệ (Exceptions) trong Java và sự khác nhau giữa chúng là gì?
Java có 2 kiểu xử lý ngoại lệ: checked exceptions và unchecked exceptions
Checked Exceptions: Là một ngoại lệ được kiểm tra và thông báo bởi trình biên dịch tại thời điểm biên dịch, chúng cũng có thể được gọi là ngoại lệ thời gian biên dịch (Compile-time Exceptions). Và lập trình viên không thể lường trước.
Ví dụ: Bạn muốn mở một file để đọc nhưng tệp được chỉ định lại không tồn tại. Thì FileNotFoundExeption sẻ xảy ra và trình biên dịch sẽ thông báo tới lập trình viên nhằm xử lý ngoại lệ đó.
Unchecked Exceptions: Là một ngoại lệ không được kiểm tra trong quá trình biên dịch. Chúng cũng được gọi là ngoại lệ thời gian chạy (Runtime Exceptions). Là ngoại lệ có thể tránh được bởi lập trình viên. Unchecked Exceptions kế thừa từ Runtime Exception.
Ví dụ: ArithmaticException, ArrayIndexOutOfBoundsException, NullPointerException,…chúng được kiểm tra tại Runtime.
Nguồn: codelearn
44/ Sự khác nhau giữa Exception và Error trong Java là gì?
- Trong Java, Exception là một sự kiện mà phá vỡ luồng chuẩn của chương trình. Nó là một đối tượng mà được ném tại Runtime. Một exception (ngoại lệ) trong Java là một vấn đề xảy ra trong quá trình thực hiện của chương trình. Một ngoại lệ có thể xảy ra với nhiều lý do khác nhau, như dưới đây:
- Người dùng nhập dữ liệu không hợp lệ.
- Một file cần được mở nhưng không thể tìm thấy.
- Kết nối mạng bị ngắt trong quá trình thực hiện giao tiếp hoặc JVM hết bộ nhớ.
- Lớp Error định nghĩa các ngoại lệ mà chương trình không chấp nhật bắt (hay bẫy). Vấn đề xảy ra vượt quá tầm kiểm soát của lập trình viên hay người dùng. Error được bỏ qua trong code của bạn vì bạn hiếm khi có thể làm gì đó khi chương trình bị error. Ví dụ như OutOfMemoryError, VirtualMachineError, AssertionError, … Nó được bỏ qua trong quá trình Java biên dịch.
Tham khảo thêm về Exception và Error trên Tạp chí lập trình
45/ Hãy cho biết sự khác nhau giữa throw và throws
Sự khác nhau giữa throw và throws
- Từ khoá throw trong java được sử dụng để ném ra một ngoại lệ (Exception) cụ thể.
- Từ khóa throws trong java được sử dụng để khai báo một ngoại lệ. Nó thể hiện thông tin cho lập trình viên rằng có thể xảy ra một ngoại lệ, vì vậy nó là tốt hơn cho các lập trình viên để cung cấp các mã xử lý ngoại lệ để duy trì luồng bình thường của chương trình.
throw |
throws |
Từ khóa throw trong java được sử dụng để ném ra một ngoại lệ rõ ràng. |
Từ khóa throws trong java được sử dụng để khai báo một ngoại lệ. |
Ngoại lệ checked không được truyền ra nếu chỉ sử dụng từ khóa throw. |
Ngoại lệ checked được truyền ra ngay cả khi chỉ sử dụng từ khóa throws. |
Sau throw là một instance. |
Sau throws là một hoặc nhiều class. |
Throw được sử dụng trong phương thức có thể quăng ra Exception ở bất kỳ dòng nào trong phương thức (sau đó dùng try-catch để bắt hoặc throws cho thằng khác sử lý) |
Throws được khai báo ngay sau dấu đóng ngoặc đơn của phương thức. Khi một phương thức có throw bên trong mà không bắt lại (try – catch) thì phải ném đi (throws) cho thằng khác xử lý. |
Không thể throw nhiều exceptions. |
Có thể khai báo nhiều exceptions, Ví dụ: public void method() throws IOException, SQLException { } |
Nguồn: gpcoder
46/ Bạn hãy cho biết sự quan trọng của finally block trong xử lý ngoại lệ
Một finally block luôn được thực thi, bất kể là một ngoại lệ có được xử lý hay không. Ngay cả trong trường hợp không có phát biểu catch và một ngoại lệ được quăng ra, finally block vẫn cứ được thực thi. Ngoài ra, finally block cũng được dùng để giải phóng tài nguyên như I/O buffers, database connections…
47/ Chuyện gì xảy ra đối với Exception object sau khi xử lý ngoại lệ?
Đối tượng ngoại lệ (exception object) sẽ được thu gom trong lần thu gom tiếp theo
48/ Finally block khác thế nào so với phương thức finalize() method?
- Một finally block được thực thi bất kể một ngoại lệ được quăng ra hay không và được dùng để giải phóng tài nguyện đang bị ứng dụng chiếm giữ
- Finalize là một phương thức được bảo vệ của lớp object, được gọi bởi Java Virtual Machine (JVM) ngay trước khi một object được trình dọn dẹp garbage collection thu hồi.
Các câu hỏi phỏng vấn về Java Applets
49/ Java Applets là gì?
Java Applet là chương trình Java chạy trên trình duyệt Web. Một applet có thể là một ứng dụng Java đầy đủ tính năng bởi vì nó có toàn bộ Java API tại cách bố trí của nó. Applet được sử dụng để tạo các ứng dụng web động và web tương tác.
50/ Bạn hãy mô tả vòng đời của một Applet
Một applet có thể ở những trạng thái sau:
- Init: Applet được khởi tạo mỗi lần tải.
- Start: bắt đầu thực thi một applet.
- Stop: Dừng việc thực thi applet.
- Destroy: Thực hiện việc dọn dẹp trước khi gỡ bỏ applet.
51/ Chuyện gì xảy ra khi một applet được tải?
Đầu tiên, một phiên bản của lớp điều khiển (controlling class ) của applet được tạo. Sau đó, applet tự khởi tạo và cuối cùng, nó bắt đầu chạy.
52/ Bạn hãy cho biết sự khác nhau giữa một Applet và một ứng dụng Java?
Java Application |
Java Applet |
Ứng dụng Java đơn thuần là một chương trình Java có thể thực thi một cách độc lập mà không cần đến trình duyệt web. |
Applet là một chương trình Java chạy trên trình duyệt web và Java trên các trình duyệt này phải được bất lên. |
Cần phải có các chức năng chính để thực thi |
Không cần đến các chức năng chính vẫn có thể thực thi |
Ứng dụng Java có thể truy cập vào hệ thống file và network nội bộ. |
Các applets không thể truy cập vào đĩa cứng và mạng |
Ứng dụng có thể truy cập vào bất cứ tài nguyên nào có trên hệ thống. |
Applets chỉ có thể một số dịch vụ giới hạn và không thể truy cập vào các hệ thống nội bộ |
Ứng dụng có thể thực thi các chương trình từ hệ thống nội bộ |
Applets không thể chạy các chương trình từ máy tính |
Cần phải có chương trình ứng dụng để thực hiện các tác vụ cho user. |
Một chương trình applet thực thi các tác vụ nhỏ hoặc một phần của tác vụ. |
Tìm hiểu thêm: Difference between a Java Application and a Java Applet
53/ Applet có những hạn chế gì?
Vì lý do bảo mật, Java applets có một số hạn chế sau:
- Java applet không thể load các thư viện hay định nghĩa các phương thức tự nhiên (native method)
- Applet không thể đọc hay ghi file trên các máy chủ đang thực thi
- Applet không thể đọc một số thuộc tính của hệ thống
- Applet không thể tạo kết nối mạng ngoại trừ với máy chủ mà nó đến.
- Applet không thể chạy bất cứ chương trình nào trên máy chủ mà nó đang thực thi
54/ Bạn hãy cho biết applet không tin cậy (untrusted applets) là gì?
Untrusted applets là những Java applets không thể truy cập hoặc thực thi các file hệ thống nội bộ. Mặc định tất cả các applets được tải xuống đều được xem là không tin cậy
55/ Bạn hãy cho biết sự khác nhau giữa các applet được tải qua internet và các applet được tải qua hệ thống file là gì?
Đối với trường hợp một applet được tải qua internet, applet được tải bởi applet classloader và phải tuân theo các hạn chế do trình quản lý bảo mật applet thực thi. Với trường hợp một applet được tải từ đĩa nội bộ, applet được tải bởi trình tải hệ thống file (file system loader). Applet được tải qua hệ thống file được phép đọc file, ghi file và tải thư viện trên máy đó. Ngoài ra, các ứng dụng được tải qua hệ thống file được phép thực thi các quy trình và cuối cùng, các ứng dụng được tải qua hệ thống file không được chuyển qua trình xác minh bytecode (bytecode verifier).
Thông tin thêm: Bytecode verifier tức trình xác minh bytecode, kiểm tra xem byte code có được tạo ra phù hợp hay không. Nếu xác minh là không thành công, sẽ thông báo lỗi verify.
56/ Applet Classloader là gì và nó có nhiệm vụ gì?
Java Classloader hay còn gọi là Trình nạp lớp là một phần của JRE làm nhiệm vụ tự động nạp các class Java vào JVM. Nó bổ sung tính bảo mật bằng cách tách gói cho các lớp của hệ thống file cục bộ từ các gói được nhập từ các nguồn mạng.
57/ Trình quản lý bảo mật applet (applet security manager) là gì và nó có nhiệm vụ gì?
Trình quản lý bảo mật applet là một cơ chế để áp đặt các hạn chế đối với các Java applet. Một trình duyệt chỉ có thể có một trình quản lý bảo mật. Trình quản lý bảo mật được thiết lập khi khởi động và sau đó nó không thể bị thay thế, quá tải, ghi đè hoặc mở rộng.
Các câu hỏi phỏng vấn về Swing
Chúng ta hãy xem Java Swing là gì? Java Swing là một phần của Java Foundation Classes (JFC) được thiết kế để cho phép phát triển các ứng dụng Java quy mô lớn cho doanh nghiệp. Nó được xây dựng dựa trên Abstract Windowing Toolkit (AWT) Application Interface (API) và được viết bằng Java. Khác với AWT, Java Swing độc lập nền tảng và các thành phần nhẹ hơn.
JFC là một tập hợp các thành phần giao diện mà được phát triển cho các ứng dụng Desktop (ứng dụng đơn lẻ trên từng máy).
Java Swing là một bộ API cung cấp giao diện người dùng đồ họa (GUI) cho các chương trình Java. Java Swing còn được gọi là bộ công cụ widget Java GUI.
Java Swing hoặc Swing được phát triển dựa trên các API trước đó được gọi là Bộ công cụ trừu tượng Windows (AWT). Swing cung cấp các thành phần GUI phong phú và phức tạp hơn AWT. Các thành phần GUI có phạm vi từ một nhãn đơn giản đến cây và bảng phức tạp. Gói javax.swing cung cấp các lớp cho Java Swing API như JButton, JTextField, JTextArea, JRadioButton, JCheckbox, JMenu, JColorChooser…
Gói javax.swing chứa tập hợp các lớp interface mở rộng và cải tiến các thành phần của gói java.awt cho phép tạo giao diện đẹp hơn.
Gói javax.swing không thay thế gói java.awt mà được sử dụng đồng thời trong cùng một giao diện.
Các thành phần của gói javax.swing đều bắt đầu bằng ký tự J như: JButton, JFrame,…
JFrame có cấu trúc nhiều tầng, mỗi tầng tương ứng một Container. Trong đó, tầng trung gian có tên ContentPane, thường được dùng để chứa các đối tượng hiển thị trên giao diện.
Nguồn: Codelearn
Hãy cùng lượt qua một số câu hỏi phỏng vấn bạn có thể gặp về Swing khi đi phỏng vấn Java
58/ Sự khác nhau giữa Choice và List là gì?
- Đối tượng của lớp Choice được sử dụng để hiển thị menu popup của các lựa chọn. Lựa chọn do người dùng lựa chọn được hiển thị ở đầu trình đơn. Nó kế thừa lớp Component.
- Đối tượng của lớp List thể hiện một danh sách các mục văn bản. Với sự giúp đỡ của đối tượng List, người dùng có thể chọn một trong hai mục hoặc nhiều mục. Nó kế thừa lớp Component.
59/ Layout manager trong Java Swing là gì?
Layout manager điều khiển cách trình bày vật lý của các phần tử GUI như là button, textbox, option button v.v… Một layout manager tự động bố trí các thành phần này trong container.
Tất cả các thành phần mà chúng ta vừa tạo sử dụng layout manager mặc định. Cho ví dụ, ‘FlowLayout’ là cách trình bày mặc định của một applet. Layout manager này sẽ tự động sắp xếp các thành phần. Tất cả các thành phần được đặt trong một container, và được sắp xếp đến layout manager tương ứng. Layout manager được thiết lập bằng phương thức
được gọi là ‘setLayout()’.
Nguồn và thông tin thêm: vncoder
60/ Sự khác nhau giữa một Scrollbar và một JScrollPane ?
Một Scrollbar là một Component nhưng không phải là một Container. Đối tượng của lớp Scrollbar được sử dụng để thêm thanh cuộn ngang và dọc. Scrollbar là một thành phần GUI cho phép chúng ta thấy số hàng và cột vô hình.
Một ScrollPane là một Comtainer. ScrollPane xử lý các sự kiện của chính nó và thực hiện cuộn của nó.
61/ Bạn hãy cho biết phương thức Swing nào là thread-safe (luồng an toàn)?
Mã xử lý sự kiện Swing (Swing event handling code ) chạy trên một luồng đặc biệt được gọi là luồng điều phối sự kiện (event dispatch thread). Hầu hết các code gọi phương thức Swing cũng chạy trên luồng này. Điều này là cần thiết vì hầu hết các phương thức đối tượng Swing không phải là thread-safe: việc gọi chúng từ nhiều thread có nguy cơ gây nhiễu luồng (thread interference) hoặc lỗi nhất quán bộ nhớ (memory consistency errors). Chỉ một số phương thức Swing được gắn nhãn thread-safe trong đặc tả API; chúng có thể được gọi một cách an toàn từ bất kỳ thread nào. Tất cả các phương thức Swing khác phải được gọi từ event dispatch thread. Các chương trình bỏ qua quy tắc này có thể hoạt động chính xác nhưng có thể xảy ra các lỗi không thể đoán trước và rất khó để tái tạo (tức reproduce để debug).
Có 3 phương thức thread-safe trong Swing: repaint, revalidate và invalidate không cần phải thực thi trong event dispatch thread.
62/ Hãy kể tên 3 component lớp con (Component subclasses) hỗ trợ vẽ.
Ba component là Canvas, Frame, Panel hỗ trợ vẽ (painting).
63/ Bạn hãy cho biết clipping là gì?
Clipping là giới hạn vẽ trong một khu vực nhất định. Điều này được thực hiện vì lý do hiệu quả và để tạo ra các hiệu ứng khác nhau. Khi làm việc với clip, chúng ta phải làm việc với bản sao của đối tượng Graphics hoặc khôi phục thuộc tính clip gốc. Việc thay đổi clip không ảnh hưởng đến các pixel hiện có; nó chỉ ảnh hưởng đến kết xuất trong tương lai.
64/ Bạn hãy cho biết sự khác nhau giữaMenuItem và CheckboxMenuItem ?
Lớp CheckboxMenuItem mở rộng lớp MenuItem và hỗ trợ một mục menu có thể được chọn hoặc bỏ chọn.
65/ Hãy cho biết các phần tử của BorderLayout được tổ chức như thế nào?
Các phần tử của BorderLayout được tổ chức ở các đường biên (North, South, East và West) và trung tâm của một vùng chứa.
66/ Hãy cho biết các phần tử của một GridBagLayout được tổ chức như thế nào?
Các phần tử của GridBagLayout được tổ chức theo một lưới. Các phần tử có kích thước khác nhau và có thể chiếm nhiều hơn một hàng hoặc cột của lưới. Do đó, các hàng và cột có thể có kích thước khác nhau.
67/ Hãy cho biết sự khác nhau giữa Window và Frame ?
Lớp Frame mở rộng lớp Window và định nghĩa một cửa sổ ứng dụng chính có thể có thanh menu.
68/ Hãy cho biế mối quan hệ giữa clipping và repainting ?
Khi một cửa sổ được vẽ lại bởi AWT painting thread, nó sẽ đặt các vùng cắt thành vùng của cửa sổ yêu cầu vẽ lại.
Java AWT (Abstract Window Toolkit) là một API để phát triển các ứng dụng dựa trên GUI hoặc cửa sổ trong java.
69/ Hãy cho biết mối quan hệ giữa event-listener interface và lớp event-adapter?
Giao diện trình xử lý sự kiện (event-listener interface ) xác định các phương thức phải được thực thi bởi trình xử lý sự kiện cho một sự kiện cụ thể. Bộ điều hợp sự kiện (event-adapter) cung cấp triển khai mặc định của giao diện trình xử lý sự kiện.
70/ Làm cách nào để một thành phần GUI có thể xử lý các sự kiện của chính nó
Thành phần GUI có thể xử lý các sự kiện của chính nó bằng cách triển khai giao diện trình xử lý sự kiện (event-listener interface) tương ứng và thêm chính nó làm event-listener của nó.
71/ Hãy cho biết lợi thế của Java layout manager so với các hệ thống cửa sổ truyền thống (traditional windowing systems)?
Java sử dụng layout managers để bố trí các thành phần theo cách nhất quán trên tất cả các nền tảng cửa sổ. Vì trình quản lý bố cục không bị ràng buộc với định vị và kích thước tuyệt đối, chúng có thể xác định sự khác biệt theo nền tảng cụ thể (platform-specific ) giữa các hệ thống cửa sổ (windowing systems).
72/ Design pattern mà Java sử dụng cho tất cả các thành phần Swing là gì?
Design pattern mà Java sử dụng cho tất cả các thành phần Swing là Model View Controller (MVC) pattern.
Các câu hỏi phỏng vấn về JDBC
Bạn làm việc với ngôn ngữ Java thì không thể không biết đến JDBC. Hãy xem các câu hỏi phỏng vấn về JDBC trong Java có làm cho bạn gặp khó khăn không.
73/ JDBC là gì?
Java JDBC (Java Database Connectivity) là một Java API được sử dụng để kết nối và thực hiện truy vấn với cơ sở dữ liệu. JDBC API sử dụng trình điều khiển jdbc để kết nối với cơ sở dữ liệu.
74/ Bạn hãy giải thích vai trò của driver trong JDBC?
JDBC Driver là một thành phần phần mềm cho phép ứng dụng Java tương tác với cơ sở dữ liệu. Một trong những nhiệm vụ của JDBC Driver là chuyển đổi kiểu dữ liệu của Java thành kiểu dữ liệu của JDBC tương ứng trước khi gửi giá trị dữ liệu tới Database. Ví dụ như nó chuyển kiểu int trong Java thành kiểu INTEGER trong SQL.
75/ Bạn hãy cho biết các thành phần của JDBC?
Các thành phần của JDBC Api về cơ bản bao gồm:
- DriverManager – class này chịu trách nhiệm quản lý danh sách các database driver, và chịu trách nhiệm tạo kết nối tương ứng đến database cụ thể được chỉ định.
- Driver – Interface chịu trách nhiệm xử lý các hoạt động giao tiếp giữa ứng dụng với database.
- Connection – Interface cung cấp tất cả các hàm cho việc thao tác với database.
- Statement – dùng các object được tạo ra từ interface này để thực thi các câu lệnh SQL xuống database.
- ResultSet: Lưu trữ kết quả trả về từ database.
- SQLException – Xử lý các lỗi xảy ra trong database.
76/ Bạn hãy cho biết sự vượt trội của PreparedStatement so với Statement ?
PreparedStatements được biên dịch trước và do đó, hiệu suất của chúng tốt hơn nhiều. Ngoài ra, PreparedStatement objects có thể được sử dụng lại với các giá trị đầu vào khác nhau cho các truy vấn của chúng.
77/ Bạn hãy cho biết CallableStatement dùng để làm gì ?
CallableStatement được dùng để thực thi các stored procedures. Stored procedures được tạo ra và nhằm thực hiện các lện sql theo từng nhóm việc cụ thể thay vì tưng thao tác như insert, update… Stored procedures có thể nhận thông số đầu vào (input) và trả về kết quả. Bạn có thể xem thêm về CallableStatement tại link này
78/ Bạn hãy cho biết ý nghĩa của Connection pooling?
Tương tác với cơ sở dữ liệu có thể tốn nhiều tài nguyên và đòi hỏi nhiều chi phí. Đặc biệt, khi số lượng database clients tăng lên, chi phí này rất cao và tiêu tốn một lượng lớn tài nguyên và ảnh hưởng đến hiệu suất. Connnection Pooling là là kỹ thuật cho phép tạo và duy trì 1 tập các kết nối dùng chung nhằm tăng hiệu suất cho các ứng dụng bằng cách sử dụng lại các kết nối khi có yêu cầu thay vì việc tạo kết nối mới.
Bạn có thể tham khảo thêm về Connection Pooling trên gpcoder
Các câu hỏi về Remote Method Invocation (RMI)
79/ Bạn hãy cho biết Java RMI là gì?
Java RMI (Remote Method Invocation) là một API cung cấp cơ chế tạo ứng dụng phân tán trong Java. RMI cho phép một đối tượng gọi các phương thức (method) trên một đối tượng đang chạy trong JVM khác. RMI cung cấp giao tiếp từ xa giữa các ứng dụng bằng cách sử dụng hai đối tượng stub và skelethon.
80/ Nguyên tắc căn bản của kiến trúc RMI là gì?
Kiến trúc RMI dựa trên một nguyên tắc rất quan trọng trong đó nói rằng định nghĩa của hành vi và việc thực hiện hành vi đó, là những khái niệm riêng biệt. RMI cho phép code xác định hành vi và code thực hiện hành vi tách biệt và chạy trên các JVM riêng biệt.
81/ Hãy cho biết các lớp của kiến trúc RMI (RMI Architecture) ?
Kiến trúc RMI bao gồm các lớp sau:
- Lớp Stub và Skeleton: Lớp này nằm ngay dưới ứng dụng, chịu trách nhiệm cho việc chặn các các phương thức cuộc gọi tạo bởi client đến interface và chuyển hướng các cuộc gọi này đến các dịch vụ RMI từ xa.
- Lớp Remore Reference (RRL): đây là lớp thứ hai của kiến trúc RMI xử lý việc giải thích các tham chiếu được tạo từ client đến các đối tượng từ xa của server. Lớp này thông dịch và quản lý các tham chiếu được tạo từ client đến các đối tượng dịch vụ từ xa. Kết nối là liên kết một-một (unicast).
- Lớp Transport: Lớp này có nhiệm vụ kết nối hai JVM tham gia vào dịch vụ.Lớp này dựa trên các kết nối TCP / IP giữa các máy trong mạng.Nó cung cấp kết nối cơ bản, cũng như một số chiến lược thâm nhập tường lửa.
Bạn có thể tham khảo thêm về kiến trúc RMI tại tutorialspoint.
Kiến trúc RMI trong Java. Ảnh Tutorialspoint
82/ Bạn hãy cho biết vai trò của lớp java.rmi.Naming?
Lớp java.rmi.Naming cung cấp các phương thức để lưu trữ và lấy tham chiếu đến các đối tượng từ xa trong remote object registry. Mỗi phương thức của lớp Naming lấy tên là một String ở định dạng URL.
83/ Biding trong RMI có ý nghĩa gì?
Biding là quá trình liên kết hoặc đăng ký tên cho một remote object có thể được sử dụng sau này để tra cứu remote object đó. Một remote object có thể được liên kết với một tên bằng cách sử dụng các phương thức bind() hoặc rebind() của lớp Naming.
84/ Bạn hãy cho biết sự khác nhau giữa cách sử dụng phương thức bind() hoặc rebind() của lớp Naming?
Phương thức bind() chịu trách nhiệm liên kết tên được chỉ định với một remote object, trong khi phương thức rebind() chịu trách nhiệm liên kết tên được chỉ định với một new remote object. Trong trường hợp tồn tại binding cho tên đó, binding sẽ được thay thế.
85/ Hãy cho biết các bước cần thiết để một chương trình RMI hoạt động đúng?
Các bước dưới đây là cần thiết để một RMI hoạt động đúng:
- Biên dịch tất cà source files
- Khởi tạo stubs sử dụng rmic.
- Khởi động rmiregistry.
- Khởi động RMIServer.
- Chạy chương trình client.
86/ Hãy giải thích vai trò của stub trong RMI?
Stub là một object, hoạt động như một cổng vào cho phía client . Tất cả các yêu cầu gửi đi đều được chuyển qua nó. Stub nằm ở phía client và đại diện cho đối remote object. Khi caller gọi phương thức stub object, nó sẽ thực hiện các tác vụ sau:
- Bắt đầu kết nối với Máy ảo từ xa (JVM)
- Ghi và truyền (marshals) các tham số đến Máy ảo từ xa (JVM)
- Chờ đợi kết quả
- Đọc (unmarshals) giá trị trả về hoặc ngoại lệ
- Và cuối cùng, trả về giá trị cho người gọi.
87/ Distributed Garbage Collection (DGC) là gì và hoạt động thế nào?
DGC viết tắt của Distributed Garbage Collection. Remote Method Invocation (RMI) sử dụng DGC cho hoạt động dọn rác tự động. Vì lý do RMI liên quan đến các đối tượng tham chiếu từ xa (remote object references) trên các JMV, việc dọn rác là khá khó khăn. DGC dùng giải thuật quản lý memory bằng việc đếm số lượng tham chiếu (reference counting algorithm) để thực hiện việc quản lý memory tự động cho các remote objects.
88/ Hãy giải thích Marshalling và demarshalling là gì?
Khi một ứng dụng muốn chuyển các đối tượng bộ nhớ của nó qua mạng đến một máy chủ lưu trữ khác hoặc duy trì nó trong bộ nhớ, đối tượng đó phải được chuyển đổi sang một định dạng phù hợp. Quá trình này được gọi là marshalling và hoạt động ngược lại được gọi là demarshalling
89/ Hãy giải thích Serialization và Deserialization là gì?
Java cung cấp một cơ chế, được gọi là tuần tự hóa đối tượng (object serialization ) trong đó một object có thể được biểu diễn dưới dạng một chuỗi byte và bao gồm dữ liệu của object, cũng như thông tin về loại object và các loại dữ liệu được lưu trữ trong object. Vì vậy, serialization có thể được coi là một cách làm phẳng các đối tượng, để được lưu trữ trên đĩa và sau đó, đọc lại và hoàn nguyên. Deserialisation là quá trình ngược lại chuyển đổi một đối tượng từ trạng thái phẳng thành một live object.
Các câu hỏi liên quan đến Servlets
90/ Servlet là gì?
Các Servlets là các chương trình Java chạy trên các web server hoặc application sever với điều kiện các server này cho phép chạy Java (Java-enabled). Servlets được dùng để xử lý các các yêu cầu nhận được từ máy chủ, xử lý yêu cầu, tạo phản hồi và sau đó gửi phản hồi lại cho máy chủ
Các đặc tính của Servlets:
- Servlet chạy trên server
- Servlet có khả năng xử lý các yêu cầu phức tạp từ máy chủ
91/ Hãy giải thích kiến trúc của một Servlet.
Ảnh về kiến trúc Servlet:
:
92/ Bạn hãy cho biết sự khác nhau giữa một Applet và một Servlet?
Sự khác nhau giữa một Applet và một Servlet thể hiện qua bảng sau:
Số. |
Từ khóa |
Applets |
Servlets |
1 |
Thực thi |
Applets thực thi trên client-side như trên trình duyệt trên máy client |
Servlets thực thi trên máy chủ. |
2 |
Parent packages |
Parent package của Applet bao gồm java.applet.* và java.awt.* |
Parent package của Servlet bao gồmjavax.servlet.* và java.servlet.http.* |
3 |
Phương thức |
Các phương thức quan trọng của applet bao gồm init(), stop(), paint(), start(), destroy(). |
Phương thức vòng đời (Lifecycle methods) của servlet là init( ), service( ), and destroy( ). |
4 |
Giao diện người dùng |
Giao diện người dùng (user interface) là cần phải cớ ví dụ AWT hay swing để thực thi applet. |
Không cần giao diện người dùng để thực thi servlet |
5 |
Băng thông |
Applet cần giao diện người dùng trên client để thực thi nên cần nhiều băng thông |
Cần ít băng thông do chạy trên server |
6 |
Bảo mật |
Các applets có nhiều rủi ro bảo mật do chạy trên máy client |
Servlets bảo mật hơn do chạy dưới sự bảo mật của server. |
Nguồn: Tutorialspoint
93/ Hãy cho biết sự khác nhau giữa GenericServlet và HttpServlet ?
GenericServlet ngày nay hiếm khi được sử dụng. Tuy nhiên bạn có thể gặp câu hỏi so sánh giữa GenericServlet và HttpServlet trong các buổi phỏng vấn về Java.
GenericServlet cung cấp các framework để tạo một Servlet cho bất kỳ giao thức nào, ví dụ bạn có thể viết Servlet để nhận nội dung từ FTP, SMTP… Trong khi đó HttpServlet là Servlet có sẵn (built-in) trong Java để xử lý các HTTP requests.
Bạn có thể tham khảo thêm sự khác nhau giữa GenericServlet và HttpServlet tại đây
94/ Bạn hãy cho biết vòng đời của một Servlet.
Vòng đời của Servlet có thể được định nghĩa như là một tiến trình đầy đủ từ khi được tạo ra đến khi bị hủy. Vòng đời của Servlet chủ yếu đi qua 4 giai đoạn sau:
- Tải Servlet.
- Khởi tạo Servlet.
- Yêu cầu xử lý.
- Hủy Servlet.
Bạn có thể tham khảo chi tiết về vòng đời của Servlet tại đây
95/ Hãy cho biết sự khác nhau giữa doGet() và doPost() ?
Sự khác nhau giữa doGet() và doPost() được thể hiện qua bảng sau:
# |
doGet() |
doPost() |
1 |
Trong doGet() các thông số được gắn vào URL và gửi cùng với thông tin header. |
doPost() gửi thông tin thông qua một socket đến webserver và nó không hiện trên URL bar |
2 |
Thông tin bạn có thể gửi trả về dùng GET bị giới hạn bởi các URL chỉ có thể dài tối đa 1024 ký tự. |
Bạn có thể gửi nhiều thông tin hơn đến máy chủ theo cách này – và nó cũng không bị giới hạn đối với dữ liệu dạng văn bản. Có thể gửi các tập tin và thậm chí cả dữ liệu nhị phân như các đối tượng Java được tuần tự hóa (serialized Java objects)! |
3 |
doGet () là một yêu cầu cung cấp thông tin; nó không (hoặc không nên) thay đổi bất cứ điều gì trên máy chủ. (doGet() phải là idempotent) |
doPost () cung cấp thông tin (chẳng hạn như đặt hàng cho hàng hóa) mà máy chủ dự kiến sẽ ghi nhớ |
4 |
Các thông số không được mã hóa |
Các thông số được mã hóa |
5 |
doGet () nhanh hơn nếu chúng ta cài đặt độ dài nội dung phản hồi vì cùng một connection được sử dụng. Do đó tăng hiệu suất |
doPost () thường được sử dụng để cập nhật hoặc đăng một số thông tin lên máy chủ. doPost chậm hơn so với doGet vì doPost không ghi độ dài nội dung |
6 |
doGet() should be idempotent. i.e. doget should be able to be repeated safely many times doGet () phải là idmpotent, tức là doget có thể được lặp lại một cách an toàn nhiều lần. Hay nói cách khác sau vô số lần gọi, nó vẫn trả về kết quả như nhau |
Phương pháp này không cần phải là idmpotent. Các hoạt động được yêu cầu thông qua POST có thể có các phản ứng lề(side effects) mà người dùng có thể phải chịu trách nhiệm. |
7 |
doGet() should be safe without any side effects for which user is held responsible doGet () phải được an toàn mà không có bất kỳ phản ứng lề(side effects) nào khiến người dùng phải chịu trách nhiệm |
Phương pháp này không cần phải an toàn |
8 |
Cho phép bookmarks. |
Không cho phép bookmarks. |
Nguồn: javatopinterviewquestions
Bạn có thể tìm hiểu thêm Idmpotent là gì tại đây
96/ Servlet Chaining là gì?
Servlet Chaining là phương thức mà đầu ra của một servlet được gửi đến một servlet thứ hai. Đầu ra của servlet thứ hai có thể được gửi đến servlet thứ ba, v.v. Servlet cuối cùng trong chuỗi chịu trách nhiệm gửi phản hồi đến client.
97/ Làm sao bạn nhận biết được máy client nào đang tạo request tới servlet?
Lớp ServletRequest có các chức năng để tìm ra địa chỉ IP hoặc host name của máy client . getRemoteAddr () lấy địa chỉ IP của máy client và getRemoteHost () lấy host name của máy client. Bạn có thể xem ví dụ tại đây
98/ Hãy cho biết cấu trúc của phản hồi HTTP (HTTP response)?
Phản hồi HTTP bao gồm ba phần:
- Status Code (Mã trạng thái): mô tả trạng thái của phản hồi.Nó có thể được sử dụng để kiểm tra xem yêu cầu đã được hoàn thành thành công hay chưa.Trong trường hợp yêu cầu không thành công, mã trạng thái có thể được sử dụng để tìm ra lý do đằng sau sự thất bại.Nếu servlet của bạn không trả về mã trạng thái, mã trạng thái thành công, HttpServletResponse.SC_OK, được trả về theo mặc định.
- HTTP Headers (Tiêu đề HTTP): chứa nhiều thông tin hơn về phản hồi.Ví dụ: tiêu đề có thể chỉ định ngày / giờ mà sau đó phản hồi được coi là cũ hoặc hình thức mã hóa được sử dụng để chuyển đối tượng một cách an toàn đến người dùng
- Body (Phần thân): chứa nội dung của phản hồi.Phần nội dung có thể chứa mã HTML, hình ảnh, v.v. Phần nội dung bao gồm các byte dữ liệu được truyền trong thông điệp giao dịch HTTP ngay sau các tiêu đề.
99/ Cookie là gì?Bạn hãy cho biết sự khác nhau giữa session và cookie?
Đây là câu hỏi mà bạn có thể gặp trong bất kỳ cuộc phỏng vấn lập trình nào chứ không phải chỉ với Java
Cookie là một mẩu thông tin mà máy chủ Web gửi đến trình duyệt. Trình duyệt lưu trữ các cookie cho mỗi máy chủ Web trong một tập tin nội bộ. Cookie được sử dụng để ghi nhớ trạng thái thông tin (ví dụ, món ăn trong giỏ hàng mua sắm trên một trang thương mại điện tử), ghi nhớ hoạt động của người dùng thực hiện trong quá trình truy cập và duyệt một trang web (ví example, the press or the future user link). Cookie cũng được sử dụng để lưu lại các thông tin khác mà người dùng nhập hoặc điền vào trang web như tên, địa chỉ, mật khẩu, v.v … Khi có một request trong tương lai, trình duyệt, cùng với request, sẽ gửi tất cả cookie được lưu trữ cho máy chủ Web cụ thể đó.
Sự khác nhau giữa session và cookie:
- Session sẽ luôn hoạt động, bất kể setting trên trình duyệt client là như thế nào.Client có thể chọn tắt cookie.Tuy nhiên, các session vẫn hoạt động, vì máy client không có khả năng vô hiệu hóa chúng ở server side
- Session và cookie cũng khác nhau về lượng thông tin có thể lưu trữ.Session HTTP có khả năng lưu trữ bất kỳ Java object nào, trong khi cookie chỉ có thể lưu trữ các đối tượng Chuỗi.
100/ Giao thức nào được trình duyệt và servlet sử dụng để giao tiếp?
Trình duyệt giao tiếp với servlet bằng cách sử dụng giao thức HTTP.
Các câu hỏi phỏng vấn về JSP
Nếu bạn là Java web developer thì bạn không xa lạ gì về JSP. Hãy cùng tìm hiểu một số câu hỏi phỏng vấn về Java Server Page (JSP)
101/ JSP là gì?
- JSP là viết tắt của Java Server Pages.
- JSP là công nghệ server-side , tức chạy trên máy chủ.
- JSP được sử dụng để tạo ứng dụng web.
- JSP được sử dụng để tạo nội dung web động.
- Thẻ JSP (JSP tag) được sử dụng để chèn mã JAVA vào các trang HTML.
- JSP là một phiên bản nâng cao của Công nghệ Servlet.
- JSP là một công nghệ dựa trên Web giúp bạn tạo ra các trang web động và độc lập với nền tảng.
- Với JSP, mã Java có thể được chèn vào các trang HTML / XML hoặc cả hai.
- JSP đầu tiên được chuyển đổi thành servlet bởi JSP container trước khi xử lý yêu cầu của client.
102/ Hãy cho biết những điểm nổi trội của JSP
Những điểm nổi trội của việc sử dụng công nghệ JSP:
- Các trang JSP được biên dịch động thành các servlet và do đó, các developer có thể dễ dàng cập nhật code.
- Các trang JSP có thể được biên dịch trước.
- Các trang JSP có thể dễ dàng kết hợp với các static templates, bao gồm các đoạn HTML hoặc XML, với mã tạo ra nội dung động.
- Các developer có thể cung cấp các thư viện thẻ JSP tùy chỉnh mà các tác giả trang truy cập bằng cú pháp giống như XML.
- Các developer có thể thực hiện các thay đổi logic ở cấp component mà không cần chỉnh sửa các trang riêng lẻ sử dụng logic của ứng dụng.
Các nguồn câu hỏi phỏng vấn Java khác
Ngoài các câu hỏi phỏng vấn Java trên bạn có thể tham khảo thêm các nguồn sau:
- Câu hỏi phỏng vấn Java về Danh sách liên kết (Linked List)
- 100 câu hỏi phỏng vấn về Cấu trúc dữ liệu và Giải thuật cho lập trình viên Java
- 80 câu hỏi về Thread trong phỏng vấn Java
- Câu hỏi phỏng vấn lập trình viên Java có kinh nghiệp
Kết luận
Các câu hỏi phỏng vấn Java trên đây không phải là tất cả những câu hỏi mà bạn cần chuẩn bị cho buổi phỏng vấn. Chúng tôi sẽ tiếp tục cập nhật danh sách câu hỏi này. Tuy nhiên bạn cần tìm hiểu từ nhiều nguồn khác nhau và chuẩn bị kiến thức cho riêng mình. Chúc bạn thành công!
Bạn có biết?
tham gia cộng đồng ITguru trên Linkedin, Facebook và các kênh mạng xã hội khác có thể giúp bạn nhanh chóng tìm được những chủ đề phát triển nghề nghiệp và cập nhật thông tin về việc làm IT mới nhất
Linkedin Page:
Facebook Group:
cơ hội việc làm IT : ITguru.vn