CodeGym/Blog Java/Ngẫu nhiên/Khám phá các câu hỏi và câu trả lời từ cuộc phỏng vấn xin...
John Squirrels
Mức độ
San Francisco

Khám phá các câu hỏi và câu trả lời từ cuộc phỏng vấn xin việc cho vị trí nhà phát triển Java. Phần 2

Xuất bản trong nhóm
Xin chào lần nữa mọi người! Chúng tôi tiếp tục tìm kiếm câu trả lời cho các câu hỏi dành cho các nhà phát triển Java cấp cơ sở, cấp trung và cấp cao. Các câu hỏi siêu thú vị. Cá nhân tôi thích phân tích chúng vì nó giúp tôi tìm ra những lỗ hổng trong kiến ​​thức lý thuyết của mình và đôi khi ở những nơi không ngờ tới nhất. Khám phá các câu hỏi và câu trả lời từ cuộc phỏng vấn xin việc cho vị trí nhà phát triển Java.  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 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.
  2. 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.
Tôi sẽ để lại liên kết để nghiên cứu sâu hơn nếu bạn muố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:
  1. Class<?> getClass() — lấy lớp của đối tượng hiện tại;

  2. int hashCode() - lấy mã băm của đối tượng hiện tại;

  3. boolean bằng(Object obj) - so sánh đối tượng hiện tại với đối tượng khác;

  4. Object clone() - tạo và trả về một bản sao của đối tượng hiện tại;

  5. String toString() — lấy biểu diễn chuỗi của đối tượng;

  6. 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);

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

  8. 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);

  9. 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);

  10. 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;

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

Để sử dụng chính xác các phương thức hashCode , Equals , clone , toStringhoàn thiện chúng phải được ghi đè theo đặc thù của tác vụ 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 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 ý:
  1. 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.

  2. Các khối được thực hiện theo thứ tự sau:

    1. Khối thử .
    2. Khối ngầm cuối cùng .
    3. Khối bắt , bắt các ngoại lệ xảy ra ở các bước trước.
    4. 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.

Hãy tưởng tượng rằng bạn đang sử dụng try-catch-cuối cùng và bạn nhận được một ngoại lệ trong khối thử . Sau đó, khối bắt được chỉ định ngay lập tức bắt đầu thực thi, trong đó chúng tôi đã 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ém ngoại lệ này lên trên. Sau đó, khối cuối cùng được thực thi và một ngoại lệ cũng được đưa vào đó. Nhưng lần này lại 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 bây giờ chúng ta đã đến một điểm khác về try-with-resources . Hãy xem xét cách hoạt động của try-with-resource 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 cố gắng đóng tài nguyên trong phương thức close() , tức là trong khối cuối cùng ẩn . Khối Catch sẽ bắt được trường hợp ngoại lệ nào sau đây ? Cái được ném bởi khối thử ! Ngoại lệ từ khối ngầm định cuối cùng (từ phương thức loss() ) sẽ bị bỏ qua. Việc bỏ qua các ngoại lệ này còn được gọi là ngăn chặn ngoại lệ.

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

Dịch chuyển bit ( >><< ) dịch chuyển các bit của toán hạng theo hướng đã chỉ định, theo số vị trí đã 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
Ngoại lệ là khi bạn dịch số âm sang phải. Như bạn sẽ nhớ lại, bit đầu tiên của số có dấu biểu thị dấu. Nếu bit này là 1 thì số đó là âm. Nếu bạn dịch chuyển một số âm, các vị trí trống sẽ không được điền bằng số 0 mà bằng số 1, vì bit dấu phải được giữ nguyên. Ví dụ: 10100010 >> 2 = 11101000 Điều đó nói lên rằng, Java 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ư >>, nhưng khi dịch chuyển, các vị trí trống sẽ được điền bằng 0, bất kể toán hạng là số âm hay số dương. Ví dụ: 10100010 >>> 2 = 00101000 Đọc thêm về các phép toán bitwise tại đây . Khám phá các câu hỏi và câu trả lời từ cuộc phỏng vấn xin việc cho vị trí nhà phát triển Java.  Phần 2 - 2Bạn có thể lấy phương thức hash() trong HashMaps làm ví dụ về dịch chuyển bit trong Java. Phương pháp này được sử dụng để xác định mã băm nội bộ đặc biệt của khóa: Khám phá các câu hỏi và câu trả lời từ cuộc phỏng vấn xin việc cho vị trí nhà phát triển Java.  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ượng xung đột.

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?

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

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

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

  5. Những lớp học này rất dễ kiểm tra.

  6. 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:
  1. 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.

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

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

  4. Nguyên tắc đóng gói bảo vệ dữ liệu quan trọng nhất của người dùng.

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

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

  8. 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:
  1. 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ì.

  2. 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ỏ).

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

  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 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.
Đ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ể 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.

19. Đưa ra định nghĩa về nguyên lý trừu tượng trong OOP

Trong OOP, trừu tượng hóa là một cách để cô lập một tập hợp các đặc điểm có ý nghĩa của một đối tượng, đồng thời 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 chung mà không đi sâu vào chi tiết triển khai chúng. Trong Java, tính trừu tượng được thực hiện thông qua các giao diện . Ví dụ, bạn có một chiếc ô tô và đó sẽ là một giao diện. Và các tương tác khác nhau với nó — ví dụ: khởi động động cơ, sang số — là các 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. Thật vậy, khi đang lái xe, bạn không nghĩ chính xác hộp số thực hiện 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à nếu bạn thay thế việc triển khai một số chức năng (ví dụ: động cơ), bạn thậm chí có thể không nhận thấy nó. Điều đó không quan trọng với bạn: bạn không đi sâu vào chi tiết triển khai. Điều quan trọng với bạn là hành động đó có được thực hiện hay không. Về bản chất, điều này trừu tượng hóa các chi tiết thực hiện. Tại thời điểm này, hôm nay chúng ta sẽ dừng lại: để tiếp tục!
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào