Series

Series "Câu hỏi tuyển dụng": Vị trí Java

Khái niệm về ngành nghề Java

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à việc bắt gặp một yêu cầu tuyển dụng lập trình viên Java không phải là quá khó. Tuy nhiên để có sự chuẩn bị cho buổi phỏng vấn tốt nhất dù bạn là người tuyển dụng hay là một lập trình viên Java thì đều cần có sẵn một hệ thống kiến thức nhất định cần - phải - biết để vượt qua được vòng phỏng vấn cơ bản nhấ. 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 tham gia các cuộc phỏng vấn Java để chắn chắn rằng bạn có một buổi phỏng vấn an toàn.

Dưới đây là Series "Câu hỏi tuyển dụng" với các câu hỏi phỏng vấn cơ bản và cần thiết nhất được team viecTOP gợi ý, ngoài giúp ứng viên thì còn hỗ trợ các HR đánh giá sàng lọc ứng viên trong vị trị LẬP TRÌNH VIÊN JAVA hiệu quả hơn, tránh trường hợp bỏ lỡ nhân tài cho công ty.

câu hỏi phỏng vấn vị trí java

Câu hỏi giới thiệu bản thân

  • Bạn hãy giới thiệu đôi nét về bản thân mình?

  • Tại sao bạn lại chọn làm công việc này?

  • Bạn cảm thấy mình có những tố chất gì phù hợp với công việc này/Tố chất gì để có thể thành công với nghề này?

  • Định hướng của bạn muốn phát triển trong lĩnh vực, nghề nghiệp nào trong tương lai?

  • Mục tiêu ngắn hạn - dài hạn của bạn là gì?

  • Bạn đã từng phải chịu áp lực trong công việc hay cuộc sống chưa? Ví dụ? Bạn làm thế nào để vượt qua nó?

  • Điểm mạnh của bạn là gì? Bạn có điểm yếu gì không và bạn nghĩ mình có thể khắc phục được không? Làm gì để khắc phục những điểm yếu đó?

Câu hỏi về kiến thức & kỹ năng

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)?

Câu trả lời: 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à:

  1. 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.
  2. 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.
  3. 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.

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.

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++.

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/ 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 phỏng vấn Java Threads

1/ 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).

2/ 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.

3/ 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:

  1. 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()
  2. 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
  3. Running: vi xử lý bắt đầu thực thi thread code
  4. 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.
  5. Terminated: kết thúc thực thi.

4/ 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).

5/ 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.

6/ 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.

7/ 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

Các câu hỏi phỏng vấn Java Collections

1/ 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

2/ 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.

3/ 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.

4/ 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…

5/ 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.

Các câu hỏi về xử lý ngoại lệ trong phỏng vấn Java

1/ 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.

2/ 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.

3/ 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.

4/ 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…

5/ 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

6/ 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 Java Applets

1/ 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.

2/ 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.

3/ 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.

4/ Bạn hãy cho biết sự khác nhau giữa một Applet và một ứng dụng Java?

5/ 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

6/ 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

7/ 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.

Câu hỏi về thái độ nghề nghiệp

  • Bạn có mong muốn/kỳ vọng gì khi gia nhập Công ty chúng tôi?

  • Định hướng nghề nghiệp của bạn trong 2-5 năm nữa là gì?

  • Định hướng nghề nghiệp của bạn trong thời gian 5-10 năm nữa như thế nào?

  • Khách hàng/đồng nghiệp/bạn bè nhân xét về bạn như thế nào?

  • Bạn đã bao giờ thất bại chưa?

  • Điều gì tạo động lực cho bạn?

  • Bạn cân bằng công việc và cuộc sống như thế nào?

  • Đánh giá kỹ năng giao tiếp, khả năng sử dụng ngôn ngữ, tư duy?

  • Đánh giá kỹ năng xử lý tình huống?

  • Đánh giá thái độ của ứng viên khi trao đổi với nhà tuyển dụng? (hứng thú/tẻ nhạt)

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. Tuy nhiên bạn có thể tham khảo bộ câu hỏi phỏng vấn Java trên và cần tìm hiểu từ nhiều nguồn khác nhau, chuẩn bị kiến thức cho riêng mình. 

--------------------------------------------------------------------------------------------

Để giảm nguy cơ tuyển dụng nhân sự sai người, việc xây dựng chương trình phỏng vấn phù hợp và chuẩn xác cho mỗi vị trí là một trong những ưu tiên hàng đầu của doanh nghiệp.

Chuỗi bài đăng Series “Câu hỏi tuyển dụng” tại viecTOP sẽ giúp bạn tìm được ứng viên tài năng cho doanh nghiệp mình.

Xem ưu đãi và nhận tư vấn dịch vụ Đăng tuyển dụng miễn phí

Bình luận