
- Mình sẽ bỏ qua những câu hỏi trùng lặp với loạt bài này để không trùng lặp thông tin một cách không cần thiết. Tôi khuyên bạn nên đọc những bài viết này vì chúng đề cập đến các câu hỏi phỏng vấn Java Core (phổ biến) phổ biến nhất.
- Tôi có thể mô tả các câu trả lời chi tiết hơn, nhưng tôi sẽ không làm vậy, vì khi đó mỗi câu trả lời có thể kéo dài cả bài viết. Và sẽ không ai hỏi bạn mức độ chi tiết đó trong bất kỳ cuộc phỏng vấn việc làm nào.
11. Kể tên tất cả các phương thức của lớp Object
Lớp Object có 11 phương thức:-
Class<?> getClass() — lấy lớp của đối tượng hiện tại;
-
int hashCode() - lấy mã băm của đối tượng hiện tại;
-
boolean bằng(Object obj) - so sánh đối tượng hiện tại với đối tượng khác;
-
Object clone() - tạo và trả về một bản sao của đối tượng hiện tại;
-
String toString() — lấy biểu diễn chuỗi của đối tượng;
-
void notification() - đánh thức một luồng đang chờ trên màn hình của đối tượng này (việc lựa chọn luồng là ngẫu nhiên);
-
void notificationAll() — đánh thức tất cả các luồng đang chờ trên màn hình của đối tượng này;
-
void wait() - làm cho luồng hiện tại chờ trên màn hình hiện tại (đóng băng luồng hiện tại) cho đến khi một lệnh gọi notification hoặc notificationAll đánh thức luồng (chỉ hoạt động trong một khối được đồng bộ hóa);
-
void wait(long timeout) - làm cho luồng hiện tại chờ trên màn hình hiện tại (trên khối được đồng bộ hóa hiện tại), nhưng có thời gian chờ để thoát khỏi trạng thái chờ (hoặc một lần nữa, cho đến khi lệnh gọi notification hoặc notificationAll đánh thức luồng);
-
void wait(long timeout, int nanos) - phương pháp này giống như phương pháp trước, nhưng có thời gian chờ chính xác hơn;
-
void Finalize() - phương thức này được gọi (cuối cùng) trước khi đối tượng bị trình thu gom rác xóa. Nó được sử dụng để dọn sạch các tài nguyên có được.
12. Sự khác biệt giữa thử với tài nguyên và thử bắt cuối cùng khi làm việc với tài nguyên là gì?
Thông thường, khi sử dụng try-catch-finally , khối cuối cùng được sử dụng để đóng tài nguyên. Java 7 giới thiệu câu lệnh try-with-resources mới . Nó tương tự như try-catch-final để giải phóng tài nguyên, nhưng nhỏ gọn và dễ đọc hơn. Hãy nhớ lại try-catch-cuối cùng trông như thế nào:
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Bây giờ hãy viết lại mã này nhưng sử dụng try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
Giờ thì việc đó đơn giản hơn một chút, bạn có nghĩ vậy không? Ngoài mã đơn giản hơn, có một số điểm khác cần lưu ý:
-
Trong try-with-resources , các tài nguyên được khai báo trong dấu ngoặc đơn (tài nguyên sẽ bị đóng) phải triển khai giao diện AutoCloseable và phương thức close() duy nhất của nó .
Phương thức đóng được thực thi trong khối lệnh ẩn cuối cùng , nếu không, làm thế nào chương trình có thể tìm ra chính xác cách đóng tài nguyên?
Nhưng có thể bạn sẽ hiếm khi viết các triển khai tài nguyên của riêng mình và phương pháp đóng chúng.
-
Các khối được thực hiện theo thứ tự sau:
- Khối thử .
- Khối ngầm cuối cùng .
- Khối bắt , bắt các ngoại lệ xảy ra ở các bước trước.
- Khối cuối cùng rõ ràng .
Theo quy định, các ngoại lệ được đưa xuống thấp hơn trong danh sách sẽ làm gián đoạn những ngoại lệ được đưa lên cao hơn.
13. Hoạt động bitwise là gì?
Các phép toán theo bit là các phép toán trên chuỗi bit. Chúng bao gồm các phép toán logic và dịch chuyển bitwise. Toán tử logic:-
bitwise AND - So sánh các giá trị bit. Bất kỳ bit nào được đặt thành 0 (sai) sẽ đặt bit tương ứng trong kết quả thành 0. Nghĩa là, nếu một bit là 1 (đúng) trong cả hai giá trị được so sánh thì bit kết quả cũng sẽ là 1.
Ký hiệu là AND hoặc &
Ví dụ: 10111101 & 01100111 = 00100101
-
bitwise HOẶC - Thao tác này ngược lại với thao tác trước. Bất kỳ bit nào được đặt thành 1 sẽ đặt bit tương ứng trong kết quả thành 1. Theo đó, nếu bit bằng 0 trong cả hai giá trị được so sánh thì bit kết quả cũng sẽ là 0.
Ký hiệu là OR hoặc |
Ví dụ: 10100101 | 01100011 = 11100111
-
bitwise NOT - Toán tử này được áp dụng cho một giá trị duy nhất. Nó lật (đảo ngược) các bit. Nghĩa là, các bit 1 trở thành 0; và những cái 0 trở thành 1.
Ký hiệu là KHÔNG hoặc ~
Ví dụ: ~10100101 = 01011010
-
loại trừ bitwise HOẶC - So sánh các giá trị bit. Nếu cả hai bit là 1 thì bit kết quả là 0. Nếu cả hai bit là 0 thì bit kết quả là 0. Nói cách khác, để bit kết quả là 1, chỉ một trong các bit phải là 1 và bit còn lại phải bằng 0.
Ký hiệu là XOR hoặc ^
Ví dụ: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000


14. Java có những đối tượng bất biến tiêu chuẩn nào?
Một đối tượng là bất biến nếu nó không cho phép các giá trị ban đầu của nó thay đổi. Nó có thể có các phương thức trả về các đối tượng mới cùng loại với các giá trị khác nhau. Một số đối tượng bất biến tiêu chuẩn bao gồm:- chắc chắn, loại bất biến nổi tiếng nhất của Java là String;
- các phiên bản của các lớp trình bao bọc bao bọc các kiểu tiêu chuẩn: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
- Các đối tượng BigInteger và BigDecimal, thường được sử dụng cho các số đặc biệt LỚN;
- Các đối tượng StackTraceElement tạo nên dấu vết ngăn xếp (ví dụ: dấu vết ngăn xếp của một ngoại lệ);
- một đối tượng của lớp File - nó có thể sửa đổi các tập tin, nhưng đồng thời đối tượng đó vẫn không thay đổi;
- UUID, thường được sử dụng để nhận dạng duy nhất các phần tử;
- tất cả các đối tượng của các lớp trong gói java.time;
- Đối tượng địa phương, được sử dụng để xác định khu vực địa lý, chính trị hoặc văn hóa.
15. Vật bất biến có ưu điểm gì so với vật thông thường?
-
Các đối tượng bất biến được an toàn khi sử dụng trong môi trường đa luồng . Họ làm điều đó để bạn không phải lo lắng về việc mất dữ liệu do điều kiện chủng tộc. Điều này khác với khi bạn làm việc với các đồ vật thông thường. Trong trường hợp đó, bạn phải suy nghĩ và đưa ra những cơ chế tốt khi sử dụng đối tượng trong môi trường song song.
-
Các đối tượng bất biến có tác dụng như chìa khóa trên bản đồ. Nếu bạn sử dụng một đối tượng có thể thay đổi làm khóa HashMap và sau đó trạng thái của đối tượng thay đổi thì cấu trúc dữ liệu có thể bị nhầm lẫn: đối tượng sẽ vẫn hiện diện, nhưng nếu bạn sử dụng containsKey(), bạn có thể không tìm thấy nó.
-
Các đối tượng bất biến rất tốt để lưu trữ dữ liệu bất biến (không đổi) không bao giờ được thay đổi trong khi chương trình đang chạy.
-
Một ưu điểm khác là tính nguyên tử của thất bại. Nếu một đối tượng bất biến ném ra một ngoại lệ, nó sẽ không ở trạng thái không mong muốn (bị hỏng).
-
Những lớp học này rất dễ kiểm tra.
-
Bạn không cần bất kỳ cơ chế bổ sung nào như hàm tạo bản sao hoặc triển khai nhân bản đối tượng.
Câu hỏi về OOP
16. OOP nói chung có ưu điểm gì so với lập trình thủ tục?
Được rồi, ưu điểm của OOP:-
Các ứng dụng phức tạp dễ viết bằng OOP hơn so với lập trình thủ tục vì mọi thứ được chia thành các mô-đun nhỏ - các đối tượng tương tác với nhau - và kết quả là việc lập trình bị giảm xuống các mối quan hệ giữa các đối tượng.
-
Các ứng dụng được viết bằng OOP dễ sửa đổi hơn nhiều (khi các nguyên tắc thiết kế được tuân thủ đúng cách).
-
Vì cả dữ liệu và hoạt động dữ liệu đều tạo thành một thực thể duy nhất nên chúng không bị nhòe trên toàn bộ ứng dụng (điều này thường xảy ra trong lập trình thủ tục).
-
Nguyên tắc đóng gói bảo vệ dữ liệu quan trọng nhất của người dùng.
-
Cùng một mã có thể được sử dụng lại với các dữ liệu khác nhau vì các lớp cho phép bạn tạo nhiều đối tượng, mỗi đối tượng có giá trị riêng.
-
Tính kế thừa và đa hình cũng cho phép bạn sử dụng lại và mở rộng mã hiện có (thay vì sao chép chức năng tương tự).
-
Việc mở rộng một ứng dụng đơn giản hơn so với cách tiếp cận theo thủ tục.
-
Cách tiếp cận OOP giúp bạn có thể trừu tượng hóa các chi tiết triển khai.
17. Hãy cho chúng tôi biết OOP có nhược điểm gì
Thật không may, chúng cũng tồn tại:-
OOP đòi hỏi rất nhiều kiến thức lý thuyết mà bạn phải nắm vững trước khi có thể viết bất cứ thứ gì.
-
Các ý tưởng OOP không dễ hiểu và dễ áp dụng trong thực tế (bạn cần phải là một triết gia nhỏ).
-
OOP làm giảm hiệu suất của chương trình một chút do độ phức tạp của hệ thống tăng lên.
-
Cách tiếp cận OOP yêu cầu nhiều bộ nhớ hơn vì mọi thứ đều bao gồm các lớp, giao diện, phương thức, chiếm nhiều bộ nhớ hơn các biến thông thường.
-
Thời gian cần thiết cho phân tích ban đầu lớn hơn so với cách tiếp cận theo thủ tục.
18. Đa hình tĩnh và đa hình động là gì?
Tính đa hình cho phép các đối tượng cùng lớp hoặc giao diện hoạt động khác nhau. Có hai loại đa hình, còn được gọi là liên kết sớm và liên kết muộn. Đa hình tĩnh hoặc liên kết sớm:- xảy ra tại thời điểm biên dịch (đầu vòng đời của chương trình);
- quyết định phương thức nào sẽ thực thi tại thời điểm biên dịch;
- nạp chồng phương thức là một ví dụ về đa hình tĩnh;
- ràng buộc sớm bao gồm các phương thức riêng tư, tĩnh và cuối cùng;
- thừa kế không liên quan đến ràng buộc sớm;
- đa hình tĩnh không liên quan đến các đối tượng cụ thể mà là thông tin về loại lớp xuất hiện ở bên trái tên biến.
- xảy ra trong thời gian chạy (trong khi chương trình đang chạy);
- tính đa hình động quyết định việc triển khai cụ thể nào mà một phương thức sẽ có trong thời gian chạy;
- ghi đè phương thức là một ví dụ về đa hình động;
- ràng buộc muộn có nghĩa là gán một đối tượng cụ thể, một tham chiếu về loại của nó hoặc siêu lớp của nó;
- sự kế thừa gắn liền với tính đa hình động.
GO TO FULL VERSION