JavaRush /Blog Java /Random-VI /Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấ...

Phân tích các câu hỏi và câu trả lời từ các cuộc phỏng vấn dành cho nhà phát triển Java. Phần 2

Xuất bản trong nhóm
Xin chào mọi người một lần nữa! Chúng tôi tiếp tục tìm kiếm câu trả lời cho hơn 250 câu hỏi dành cho các nhà phát triển cấp cơ sở, cấp trung và cấp cao. Các câu hỏi khá thú vị và bản thân tôi thích phân tích chúng: những lúc như vậy, bạn có thể khám phá ra những lỗ hổng kiến ​​​​thức lý thuyết và ở những nơi không ngờ nhất. Phân tích câu hỏi và câu trả lời phỏng vấn.  Phần 2 - 1Phần trước có thể được tìm thấy trong bài viết này . Nhưng trước khi chúng ta bắt đầu, tôi muốn nhắc bạn rằng:
  1. Mình sẽ bỏ qua những câu hỏi liên quan đến loạt bài này để không trùng lặp thông tin một lần nữa. Tôi khuyên bạn nên đọc những tài liệu này vì chúng chứa các câu hỏi phỏng vấn Java Core (phổ biến) phổ biến nhất.
  2. Các câu hỏi về DOU được trình bày bằng tiếng Ukraina, nhưng ở đây tôi sẽ có mọi thứ bằng tiếng Nga.
  3. Các câu trả lời có thể được mô tả chi tiết hơn, nhưng tôi sẽ không làm vậy, vì khi đó câu trả lời cho mỗi câu hỏi có thể chiếm cả một bài viết. Và họ sẽ không hỏi bạn chi tiết như vậy ở bất kỳ cuộc phỏng vấn nào.
Nếu cần, tôi sẽ để lại liên kết để nghiên cứu sâu hơn. Hãy bay 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ề bản sao của đối tượng hiện tại;
  • String toString() — lấy biểu diễn chuỗi của một đố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 (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() - chuyển luồng hiện tại sang chế độ chờ (đóng băng nó) trên màn hình hiện tại, chỉ hoạt động trong một khối được đồng bộ hóa cho đến khi một số thông báo hoặc thông báo Tất cả đánh thức luồng;
  • void wait(long timeout) - cũng đóng băng luồng hiện tại trên màn hình hiện tại (trên màn hình được đồng bộ hóa hiện tại), nhưng có bộ hẹn giờ để thoát trạng thái này (hoặc một lần nữa: cho đến khi thông báo hoặc thông báoTất cả thức dậy);
  • void wait(long timeout, int nanos) - một phương pháp tương tự như phương pháp được mô tả ở trên, nhưng có bộ hẹn giờ chính xác hơn để thoát khỏi trạng thái đóng băng;
  • void Finalize() - trước khi xóa đối tượng này, trình thu gom rác gọi phương thức này (cuối cùng). Nó được sử dụng để dọn sạch các tài nguyên bị chiếm dụng.
Để sử dụng chính xác các phương thức hashCode , Equals​ , clone , toString và hoàn thiện, chúng phải được xác định lại, có tính đến nhiệm vụ và hoàn cảnh hiện tại.

12. Sự khác biệt giữa thử với tài nguyên và thử bắt cuối cùng khi xử lý 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 một loại toán tử try-with-resources mới , tương tự như try-catch-finally để giải phóng tài nguyên, nhưng nhỏ gọn và dễ đọc hơn. Chúng ta hãy nhớ thử-bắt-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();
}
Bằng cách nào đó nó trở nên dễ dàng hơn, bạn có nghĩ vậy không? Ngoài việc đơn giản hóa, có một số điểm:
  1. Trong try-with-resources , các tài nguyên được khai báo trong dấu ngoặc đơn (sẽ bị đóng) phải triển khai giao diện AutoClosizable và phương thức duy nhất của nó, close() .

    Phương thức đóng được thực thi trong khối lệnh ngầm ẩn cuối cùng , nếu không thì làm sao chương trình có thể hiểu chính xác cách đóng một tài nguyên nhất định?

    Tuy nhiên, rất 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.

  2. Trình tự thực hiện khối:

    1. thử chặn .
    2. Ẩn ý cuối cùng .
    3. Một khối bắt để bắt các ngoại lệ ở các bước trước.
    4. Rõ ràng cuối cùng .

    Theo quy định, các ngoại lệ xuất hiện ở vị trí thấp hơn trong danh sách sẽ làm gián đoạn những ngoại lệ xuất hiện ở vị trí cao hơn.

Hãy tưởng tượng một tình huống khi sử dụng try-catch-finally bạn sẽ nhận được một ngoại lệ trong try . Theo đó, một khối bắt cụ thể ngay lập tức bắt đầu thực thi , trong đó bạn viết một ngoại lệ khác (ví dụ: với thông báo mô tả lỗi chi tiết hơn) và bạn muốn phương thức này ném ngoại lệ này đi xa hơn. Tiếp theo là việc thực thi khối cuối cùng và một ngoại lệ cũng được đưa vào đó. Nhưng điều này thì khác. Phương pháp này cuối cùng sẽ đưa ra trường hợp ngoại lệ nào trong hai trường hợp này? Ngoại lệ được ném bởi khối cuối cùng ! Nhưng cũng có một điểm với try-with-resources . Bây giờ chúng ta hãy xem hành vi của các tài nguyên dùng thử trong tình huống tương tự. Chúng tôi nhận được một ngoại lệ trong khối thử khi chúng tôi cố gắng đóng tài nguyên trong phương thức close() , nghĩa là trong hàm ngầm cuối cùng . Những trường hợp ngoại lệ nào sẽ xảy ra ? Cái được ném bởi khối try ! Một ngoại lệ từ hàm ngầm cuối cùng (từ phương thức close() ) sẽ bị bỏ qua. Việc bỏ qua này còn được gọi là ngăn chặn ngoại lệ.

13. Hoạt động bitwise là gì?

Hoạt động theo bit là các hoạt động trên chuỗi bit bao gồm các hoạt động logic và dịch chuyển bitwise. Các phép toán logic:
  • bitwise AND - so sánh các giá trị bit và trong quá trình này, bất kỳ bit nào được đặt thành 0 (sai) sẽ đặt bit tương ứng trong kết quả là 0. Nghĩa là, nếu trong cả hai giá trị được so sánh, bit đó là 1 (đúng), thì kết quả cũng sẽ là 1

    Ký hiệu là - AND , &

    Ví dụ: 10111101 & 01100111 = 00100101

  • bitwise OR là hoạt động nghịch đảo của hoạt động trước đó. Bất kỳ bit nào được đặt thành 1 sẽ đặt bit tương tự trong kết quả là 1. Và 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à - HOẶC , |

    Ví dụ: 10100101 | 01100011 = 11100111

  • bitwise KHÔNG - áp dụng cho một giá trị, lật (đảo ngược) các bit. Nghĩa là, những bit vốn là 1 sẽ trở thành 0; và những gì là 0 sẽ trở thành 1.

    Ký hiệu là - KHÔNG , ~

    Ví dụ: ~10100101 = 01011010

  • Loại trừ bitwise HOẶC - so sánh các giá trị bit và nếu trong cả hai giá trị, bit bằng 1 thì kết quả sẽ là 0 và nếu trong cả hai giá trị, bit là 0 thì kết quả sẽ là 0. Nghĩa là, để kết quả bằng 1, chỉ một trong các bit phải bằng 1 và bit thứ hai phải bằng 0.

    Ký hiệu là - XOR , ^

    Ví dụ: 10100101 ^ 01100011 = 11000110

Dịch chuyển theo bit - >> hoặc << dịch chuyển các bit của một giá trị theo hướng đã chỉ định, theo số đã chỉ định. Các vị trí trống được lấp đầy bằng số không. Ví dụ:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
Cũng có một ngoại lệ khi dịch chuyển sang phải một số âm. Như bạn nhớ, bit đầu tiên chịu trách nhiệm về dấu và nếu bit này bằng 1 thì số đó là số âm. Nếu bạn di chuyển một số âm, các vị trí trống sẽ không còn được lấp đầy bằng số 0 nữa mà bằng số 1, vì cần phải duy trì bit dấu. Ví dụ: 10100010 >> 2 = 11101000 Đồng thời, trong Java còn có thêm một toán tử dịch chuyển phải không dấu >>> Toán tử này tương tự như >>, khi dịch chuyển, các vị trí trống được điền bằng 0, bất kể có hay không số đó là âm hay dương. Ví dụ: 10100010 >>> 2 = 00101000 Đọc thêm về các phép toán bitwise tại đây . Phân tích câu hỏi và câu trả lời phỏng vấn.  Phần 2 - 2Để làm ví dụ về việc sử dụng dịch chuyển bit trong Java, bạn có thể trích dẫn phương thức hash() của HashMap, được sử dụng để xác định mã băm nội bộ đặc biệt cho một khóa: Phân tích câu hỏi và câu trả lời phỏng vấn.  Phần 2 - 3Phương pháp này cho phép bạn phân phối đồng đều dữ liệu trong HashMap để giảm thiểu số lần va chạm.

14. Các lớp bất biến tiêu chuẩn nào là đối tượng trong Java?

Bất biến là một đối tượng không cho phép thay đổi các tham số ban đầu của nó. Nó có thể có các phương thức trả về các đối tượng mới thuộc một kiểu nhất định, với các tham số mà bạn muốn thay đổi. Một số đối tượng bất biến tiêu chuẩn:
  • Cho đến nay, đối tượng bất biến nổi tiếng nhất trong Java là String;
  • 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 thường được sử dụng cho các số đặc biệt LỚN - BigInteger và BigDecimal;
  • một đối tượng là một đơn vị trong stacktraces (ví dụ: trong một stacktrace ngoại lệ) StackTraceElement;
  • đối tượng của lớp File - có thể thay đổi các tập tin, nhưng đồng thời bản thân nó không thể thay đổi được;
  • UUID - thường được sử dụng làm id duy nhất cho các phần tử;
  • tất cả các đối tượng lớp của gói java.time;
  • Địa điểm - được sử dụng để xác định khu vực địa lý, chính trị hoặc văn hóa.

15. Ưu điểm của vật bất biến so với vật thông thường là gì?

  1. Những đối tượng như vậy an toàn khi sử dụng trong môi trường đa luồng . Bằng cách sử dụng chúng, bạn không phải lo lắng về việc mất dữ liệu do tình trạng chạy đua luồng. Không giống như làm việc với các đối tượng thông thường: trong trường hợp này, bạn sẽ phải suy nghĩ rất kỹ và tìm ra cơ chế sử dụng đối tượng trong môi trường song song.
  2. Các đối tượng bất biến là những chìa khóa tốt trong bản đồ, bởi vì nếu bạn sử dụng một đối tượng có thể thay đổi và sau đó đối tượng thay đổi trạng thái, nó có thể trở nên khó hiểu khi sử dụng HashMap: đối tượng sẽ vẫn hiện diện và nếu bạn sử dụng containsKey() thì có thể không được tìm thấy.
  3. 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.
  4. “Tính nguyên tử đến 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ẽ vẫn không ở trạng thái (bị hỏng) không mong muốn.
  5. Những lớp học này rất dễ kiểm tra.
  6. Các cơ chế bổ sung như trình tạo bản sao và triển khai bản sao là không cần thiết.

Câu hỏi về OOP

Phân tích câu hỏi và câu trả lời phỏng vấn.  Phần 2 - 4

16. OOP nói chung có ưu điểm gì so với lập trình thủ tục?

Vì vậy, ưu điểm của OOP:
  1. Các ứng dụng phức tạp dễ viết hơn lập trình thủ tục, vì mọi thứ đều đượ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à, lập trình tập trung vào mối quan hệ giữa các đối tượng.
  2. Các ứng dụng được viết bằng OOP dễ sửa đổi hơn nhiều (miễn là tuân theo các khái niệm thiết kế).
  3. Vì dữ liệu và các thao tác trên đó tạo thành một thực thể duy nhất nên chúng không bị nhòe trong toàn bộ ứng dụng (điều này thường xảy ra với lập trình thủ tục).
  4. Đóng gói thông tin bảo vệ dữ liệu quan trọng nhất từ ​​​​người dùng.
  5. Có thể sử dụng lại cùng một mã 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ó các giá trị thuộc tính riêng.
  6. 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ự).
  7. Khả năng mở rộng ứng dụng dễ dàng hơn so với cách tiếp cận thủ tục.
  8. Cách tiếp cận OOP giúp bạn có thể trừu tượng hóa khỏi các chi tiết triển khai.

17. Hãy cho chúng tôi biết OOP có những thiếu sót gì

Thật không may, họ cũng có mặt:
  1. OOP đòi hỏi rất nhiều kiến ​​thức lý thuyết cần phải nắm vững trước khi bạn có thể viết bất cứ thứ gì.Phân tích câu hỏi và câu trả lời phỏng vấn.  Phần 2 - 5
  2. Các ý tưởng của OOP không dễ hiểu và dễ áp ​​dụng trong thực tế (bạn cần phải có một chút triết gia).
  3. Khi sử dụng OOP, hiệu suất của phần mềm giảm đi một chút do tổ chức hệ thống phức tạp hơn.
  4. 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.
  5. Thời gian cần thiết cho phân tích ban đầu lớn hơn so với phân tích 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 hoạt động khác nhau đối với cùng một lớp hoặc giao diện. Có hai loại đa hình, còn được gọi là liên kết sớmliên kết muộn . Đa hình tĩnh hoặc ràng buộc trước đó:
  • 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à đầu cuối;
  • 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à liên quan đến thông tin về lớp, loại của lớp được biểu thị ở bên trái tên biến.
Đa hình động hoặc liên kết muộ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ể 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 là việc gán một đối tượng cụ thể, một tham chiếu về kiểu 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.
Bạn có thể đọc thêm về sự khác biệt giữa ràng buộc sớm và muộn trong bài viết này .

19. Xác định nguyên tắc trừu tượng trong OOP

Tính trừu tượng trong OOP là một cách làm nổi bật một tập hợp các đặc điểm quan trọng của một đối tượng, loại trừ các chi tiết không quan trọng. Nghĩa là, khi thiết kế một chương trình theo cách tiếp cận OOP, bạn tập trung vào các mô hình nói chung mà không đi sâu vào chi tiết triển khai chúng. Trong Java, các giao diện chịu trách nhiệm trừu tượng hóa . Ví dụ: bạn có một chiếc máy và đây sẽ là giao diện. Và các tương tác khác nhau với nó - ví dụ: khởi động động cơ, sử dụng hộp số - đây là những chức năng mà chúng tôi sử dụng mà không đi sâu vào chi tiết triển khai. Rốt cuộc, tại thời điểm bạn đang lái một chiếc ô tô, bạn không nghĩ về việc hộp số thực hiện chính xác mục đích của nó như thế nào, chìa khóa khởi động động cơ như thế nào, hoặc vô lăng quay bánh xe chính xác như thế nào. Và ngay cả khi việc triển khai một trong các chức năng này được thay thế (ví dụ: động cơ), bạn có thể không nhận thấy điều đó. Điều này không quan trọng với bạn: bạn không đi sâu vào chi tiết việc triển khai. Điều quan trọng đối với bạn là hành động được thực hiện. Trên thực tế, đây là sự trừu tượng hóa từ các chi tiết triển khai. Đây là nơi chúng ta sẽ dừng lại ngày hôm nay: được tiếp tục!Phân tích câu hỏi và câu trả lời phỏng vấn.  Phần 2 - 6
Các tài liệu khác trong loạt bài:
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION