Header Ads Widget

Responsive Advertisement

Nổi bật

6/recent/ticker-posts

Câu hỏi phỏng vấn Java P2- Java-Core (String)


1. String trong Java là gì? String là một kiểu dữ liệu?
String là một Class trong java và được định nghĩa trong gói java.lang. Nó không phải là một kiểu dữ liệu nguyên thủy như int long. Lớp String đại diện cho chuỗi ký tự. String được sử dụng trong hầu hết các ứng dụng Java và có một số điều thú vị mà chúng ta nên biết về String. String immutable final trong Java và JVM sử dụng String Pool để lưu trữ tất cả các đối tượng String. Một số điều thú vị khác về String là cách chúng ta có thể khởi tạo một đối tượng String bằng cách sử dụng dấu ngoặc kép và nạp chồng toán tử “+” để nối.

2. Các cách khác nhau để tạo String Objcet là gì?
    Chúng ta có thể tạo đối tượng String bằng cách sử dụng toán tử new giống như bất kỳ lớp java bình thường nào hoặc chúng ta có thể sử dụng dấu ngoặc kép để tạo đối tượng String. Có một số hàm tạo có sẵn trong lớp String để lấy String từ mảng char, mảng byte, StringBuffer StringBuilder.

String str = new String ( "abc" );

String str1 = "abc" ;


Khi chúng tôi tạo một String bằng cách sử dụng dấu ngoặc kép, JVM sẽ tìm trong String pool để tìm xem có bất kỳ String nào khác được lưu trữ với cùng giá trị hay không. Nếu được tìm thấy, nó chỉ trả về tham chiếu đến đối tượng String đó, nếu không nó sẽ tạo một đối tượng String mới với giá trị đã cho và lưu trữ nó trong String pool.

Khi chúng ta sử dụng toán tử new, JVM tạo đối tượng String nhưng không lưu trữ nó vào String pool. Chúng ta có thể sử dụng phương thức intern() để lưu trữ đối tượng String vào String pool hoặc trả về tham chiếu nếu đã có một chuỗi có giá trị bằng nhau trong nhóm.
  
3. Viết phương thức kiểm tra String đầu vào có phải là Palindrome hay không?

Một chuỗi được cho là Palindrome nếu giá trị của nó bằng nhau khi đảo ngược. Ví dụ “aba” là một chuỗi Palindrome.

Lớp String không cung cấp bất kỳ phương thức nào để đảo ngược lớp String nhưng lớp StringBuffer StringBuilder có phương thức đảo ngược mà chúng ta có thể sử dụng để kiểm tra xem String có phải là palindrome hay không.

private static boolean isPalindrome(String str) {    

if (str == null)         return false;

    StringBuilder strBuilder = new StringBuilder(str);    

strBuilder.reverse();     return strBuilder.toString().equals(str); }

Đôi khi người phỏng vấn yêu cầu không sử dụng bất kỳ lớp nào khác để kiểm tra điều này, trong trường hợp đó, chúng tôi có thể so sánh các ký tự trong String từ cả hai đầu để tìm xem đó có phải là palindrome hay không.

private static boolean isPalindrome(String str) {     if (str == null)         return false;

    StringBuilder strBuilder = new StringBuilder(str);     strBuilder.reverse();     return strBuilder.toString().equals(str); }


4. Viết phương thức xóa ký tự đã cho khỏi Chuỗi?

Chúng ta có thể sử dụng phương thức ReplaceAll để thay thế tất cả sự xuất hiện của một Chuỗi bằng một Chuỗi khác. Điểm quan trọng cần lưu ý là nó chấp nhận String làm đối số, vì vậy chúng ta sẽ sử dụng lớp Character để tạo Chuỗi và sử dụng nó để thay thế tất cả các ký tự bằng Chuỗi trống.

private static String removeChar(String str, char c) {     if (str == null)         return null;     return str.replaceAll(Character.toString(c), "");

}


5. Làm thế nào chúng ta có thể tạo String viết hoa hoặc viết thường?
    Chúng ta có thể sử dụng các phương thức toUpperCase toLowerCase của lớp String để lấy String trong tất cả các trường hợp viết hoa hoặc viết thường. Các phương thức này có một biến thể chấp nhận đối số Ngôn ngữ và sử dụng quy tắc ngôn ngữ đó để chuyển đổi Chuỗi thành chữ hoa hoặc chữ thường.

6. Phương thức String subSequence là gì?
    Java 1.4 đã giới thiệu interface CharSequenceString thực hiện interface này, đây là lý do duy nhất cho việc triển khai phương thức subSequence trong lớp String. Bên trong nó gọi phương thức chuỗi con String.

Kiểm tra bài đăng này để biết ví dụ về String subSequence


7. Làm thế nào để so sánh hai chuỗi trong chương trình java?

Java String triển khai interface có thể so sánh được và nó có hai biến thể của phương thức CompareTo().

Phương thức CompareTo(String anotherString) so sánh đối tượng String với đối số String được truyền vào. Nếu đối tượng String đứng trước đối số được truyền, nó sẽ trả về số nguyên âm và nếu đối tượng String theo sau đối số String được truyền, nó trả về số nguyên dương. Nó trả về 0 khi cả hai chuỗi có cùng giá trị, trong trường hợp này, phương thức equals(String str) cũng sẽ trả về true.

CompareToIgnoreCase(String str): Phương thức này tương tự như phương thức đầu tiên, ngoại trừ việc nó bỏ qua trường hợp. Nó sử dụng Bộ so sánh chuỗi CASE_INSENSITIVE_ORDER để so sánh không phân biệt chữ hoa chữ thường. Nếu giá trị bằng 0 thì equalsIgnoreCase (String str) cũng sẽ trả về true.

Kiểm tra bài đăng này để biết ví dụ về String compareTo


8. Làm thế nào để chuyển đổi String sang char và ngược lại?

Đây là một câu hỏi khó vì String là một chuỗi các ký tự, vì vậy chúng ta không thể chuyển nó thành một ký tự duy nhất. Chúng ta có thể sử dụng phương thức charAt() để lấy ký tự tại chỉ số đã cho hoặc chúng ta có thể sử dụng phương thức toCharArray() để chuyển đổi Chuỗi ký tự thành mảng ký tự.

Kiểm tra bài đăng này để biết chương trình mẫu về chuyển đổi String to character array to String.


9. Làm thế nào để chuyển đổi String sang mảng byte và ngược lại?
    Chúng ta có thể sử dụng phương thức String getBytes() để chuyển đổi String thành mảng byte và chúng ta có thể sử dụng phương thức khởi tạo String new String (byte [] arr) để chuyển mảng byte thành Chuỗi.

Kiểm tra bài đăng này để biết ví dụ về String to byte array.


10. Chúng ta có thể sử dụng String trong Switch- case không?
    Đây là một câu hỏi khó được sử dụng để kiểm tra kiến ​​thức của bạn về các phát triển Java hiện tại. Java 7 cũng mở rộng khả năng của switch case để sử dụng String, các phiên bản java trước đó không hỗ trợ điều này.

Nếu bạn đang triển khai luồng có điều kiện cho Chuỗi, bạn có thể sử dụng điều kiện if-else và bạn có thể sử dụng switch case nếu bạn đang sử dụng Java 7 hoặc các phiên bản cao hơn.

Kiểm tra bài đăng này để biết ví dụ về Java Switch Case String .


11. Viết chương trình in tất cả các hoán vị của Chuỗi?
    Đây là một câu hỏi khó và chúng ta cần sử dụng đệ quy để tìm tất cả các hoán vị của một Chuỗi, ví dụ hoán vị “AAB” sẽ là “AAB”, “ABA” và “BAA”. Chúng ta cũng cần sử dụng Set để đảm bảo không có giá trị trùng lặp.

Kiểm tra bài đăng này để biết chương trình hoàn chỉnh để find all permutations of String.


12. Viết hàm tìm palindrome dài nhất trong một chuỗi đã cho?

Một Chuỗi có thể chứa các chuỗi palindrome trong đó và để tìm chuỗi palindrome dài nhất trong Chuỗi đã cho là một câu hỏi lập trình.

Kiểm tra bài đăng này để biết chương trình hoàn chỉnh để tìm palindrome dài nhất palindrome in a String.

13. Sự khác biệt giữa String, StringBuffer và StringBuilder?
    String là bất biến và cuối cùng trong java, vì vậy bất cứ khi nào chúng ta thực hiện thao tác với String, nó sẽ tạo ra một Chuỗi mới. Các thao tác với chuỗi tiêu tốn tài nguyên, vì vậy java cung cấp hai lớp tiện ích cho các thao tác với String - StringBuffer StringBuilder.

StringBuffer StringBuilder là các lớp có thể thay đổi. Các hoạt động của StringBuffer là luồng an toàn và được đồng bộ hóa khi các hoạt động của StringBuilder không an toàn cho luồng. Vì vậy, khi nhiều luồng đang làm việc trên cùng một chuỗi, chúng ta nên sử dụng StringBuffer nhưng trong môi trường luồng đơn, chúng ta nên sử dụng StringBuilder.

Hiệu suất của StringBuilder nhanh hơn StringBuffer vì không có chi phí đồng bộ hóa.

Kiểm tra bài đăng này để biết thêm chi tiết về String vs StringBuffer vs StringBuilder. Đọc bài đăng này để biết điểm chuẩn giữa StringBuffer vs StringBuilder.


14. Tại sao String là bất biến hoặc cuối cùng trong Java

Có một số lợi ích của String vì nó không thay đổi và cuối cùng.

👉  String Pool là có thể vì String là bất biến trong java.

👉  Nó tăng tính bảo mật vì bất kỳ hacker nào cũng không thể thay đổi giá trị của nó và nó được sử dụng để lưu trữ thông tin nhạy cảm như tên người dùng cơ sở dữ liệu, mật khẩu, v.v.

👉  String là bất biến, nên nó an toàn khi sử dụng trong đa luồng và chúng tôi không cần bất kỳ đồng bộ hóa nào.

👉  Các chuỗi được sử dụng trong java classloader và tính bất biến cung cấp bảo mật rằng lớp chính xác đang được tải bởi Classloader.

Kiểm tra bài đăng này để biết thêm chi tiết why String is immutable in java.


15. Làm thế nào để tách chuỗi trong java?
    Chúng ta có thể sử dụng split(String regex) để chia Chuỗi thành mảng Chuỗi dựa trên biểu thức chính quy được cung cấp.

Tìm hiểu thêm tại java String split.


16. Tại sao mảng Char được ưu tiên hơn String để lưu trữ mật khẩu?
    String là bất biến trong java và được lưu trữ trong String pool. Sau khi được tạo, nó sẽ ở trong pool cho đến khi rác được thu gom, vì vậy, mặc dù chúng ta đã hoàn tất với mật khẩu, nó vẫn có trong bộ nhớ trong thời gian dài hơn và không có cách nào để tránh nó. Đó là một rủi ro bảo mật vì bất kỳ ai có quyền truy cập vào kết xuất bộ nhớ đều có thể tìm thấy mật khẩu dưới dạng văn bản rõ ràng.

Nếu chúng ta sử dụng mảng char để lưu trữ mật khẩu, chúng ta có thể đặt nó thành trống sau khi hoàn tất. Vì vậy, chúng tôi có thể kiểm soát thời gian nó có sẵn trong bộ nhớ để tránh mối đe dọa bảo mật với String.

17. Làm thế nào để bạn kiểm tra xem hai Chuỗi có bằng nhau trong Java hay không?

Có hai cách để kiểm tra xem hai Chuỗi có bằng nhau hay không - sử dụng toán tử “==” hoặc sử dụng phương thức equals. Khi chúng tôi sử dụng toán tử “==”, nó sẽ kiểm tra giá trị của Chuỗi cũng như tham chiếu nhưng trong lập trình, hầu hết thời gian chúng tôi chỉ kiểm tra sự khác nhau của chuỗi cho giá trị. Vì vậy, chúng ta nên sử dụng phương thức equals để kiểm tra xem hai Chuỗi có bằng nhau hay không.

Có một hàm khác là equalsIgnoreCase mà chúng ta có thể sử dụng để bỏ qua trường hợp.

String s1 = "abc";

String s2 = "abc";

String s3= new String("abc");

System.out.println("s1 == s2 ? "+(s1==s2)); //true

System.out.println("s1 == s3 ? "+(s1==s3)); //false

System.out.println("s1 equals s3 ? "+(s1.equals(s3))); //true


18. String Pool là gì?

Như tên cho thấy, String Pool là một nhóm các Chuỗi được lưu trữ trong bộ nhớ heap của Java. Chúng ta biết rằng String là lớp đặc biệt trong java và chúng ta có thể tạo đối tượng String bằng cách sử dụng toán tử mới cũng như cung cấp các giá trị trong dấu ngoặc kép.

Kiểm tra bài đăng này để biết thêm chi tiết về String Pool.


19. Phương thức String intern() làm gì?

Khi phương thức intern được gọi, nếu nhóm đã chứa một chuỗi bằng đối tượng Chuỗi này được xác định bởi phương thức equals(Object), thì chuỗi từ nhóm sẽ được trả về. Nếu không, đối tượng Chuỗi này được thêm vào nhóm và một tham chiếu đến đối tượng Chuỗi này được trả về.

Phương thức này luôn trả về một Chuỗi có cùng nội dung với chuỗi này, nhưng được đảm bảo là từ một nhóm các chuỗi duy nhất.


20. Chuỗi có an toàn trong Java không?
    Các chuỗi là bất biến, vì vậy chúng tôi không thể thay đổi giá trị của nó trong chương trình. Do đó, nó an toàn theo luồng và có thể được sử dụng an toàn trong môi trường đa luồng. Kiểm tra bài đăng này để biết Thread Safety in Java.


21. Tại sao String là khóa HashMap phổ biến trong Java?
    String là bất biến, HashMap của nó được lưu vào bộ nhớ đệm tại thời điểm tạo và nó không cần phải tính toán lại. Điều này làm cho nó trở thành một ứng cử viên sáng giá cho khóa trong Map và quá trình xử lý của nó nhanh hơn các đối tượng khóa HashMap khác. Đây là lý do tại sao Chuỗi chủ yếu được sử dụng Object làm các khóa HashMap.

22. Câu hỏi lập trình chuỗi

1. Kết quả của chương trình dưới đây là gì?    

package com.journaldev.strings;

public class StringTest {

    public static void main(String[] args) {        

                        String s1 = new String("pankaj");

        String s2 = new String("PANKAJ");

        System.out.println(s1 = s2);

    }

}

Đây là một chương trình đơn giản nhưng phức tạp, nó sẽ in ra “PANKAJ” vì chúng ta đang gán chuỗi s2 cho s1. Đừng nhầm lẫn với toán tử so sánh ==.

2. Kết quả của chương trình dưới đây là gì?    

package com.journaldev.strings;

public class Test {

     public void foo(String s) {      System.out.println("String");

     }  

     public void foo(StringBuffer sb){

     System.out.println("StringBuffer");

     }  

     public static void main(String[] args) {        

                        new Test().foo(null);

    }

}

Chương trình trên sẽ không biên dịch với lỗi là “The method foo(String) is ambiguous for the type Test”. Để làm rõ hoàn toàn đọc Understanding the method X is ambiguous for the type Y error.

3. Đầu ra của đoạn mã dưới đây là gì?    

String s1 = new String("abc");

String s2 = new String("abc");

System.out.println(s1 == s2);  

Nó sẽ in false vì chúng ta đang sử dụng toán tử new để tạo Chuỗi, vì vậy nó sẽ được tạo trong bộ nhớ heap và cả s1, s2 sẽ có tham chiếu khác nhau. Nếu chúng ta tạo chúng bằng cách sử dụng dấu ngoặc kép, thì chúng sẽ là một phần của nhóm chuỗi và nó sẽ in true.

4. Đầu ra của đoạn mã dưới đây là gì?    

String s1 = "abc";

StringBuffer s2 = new StringBuffer(s1);

System.out.println(s1.equals(s2));

Nó sẽ in false vì s2 không thuộc kiểu Chuỗi. Nếu bạn xem xét việc triển khai phương thức của bằng trong lớp String, bạn sẽ tìm thấy một kiểm tra bằng cách sử dụng toán tử instanceof để kiểm tra xem loại đối tượng được truyền có phải là String hay không? Nếu không, thì trả về false.

5. Kết quả của chương trình dưới đây là gì?    

String s1 = "abc";

String s2 = new String("abc"); s2.intern();

System.out.println(s1 ==s2);

Đó là một câu hỏi phức tạp và kết quả đầu ra sẽ là false. Chúng tôi biết rằng phương thức intern() sẽ trả về tham chiếu đối tượng String từ nhóm chuỗi, nhưng vì chúng tôi không gán lại nó cho s2, nên không có thay đổi nào trong s2 và do đó cả s1 và s2 đều có tham chiếu khác nhau. Nếu chúng ta thay đổi mã ở dòng 3 thành s2 = s2.intern(); thì đầu ra sẽ là true.

6. Có bao nhiêu đối tượng Chuỗi đã được tạo trong đoạn mã dưới đây?    

String s1 = new String ( "Hello" );  

String s2 = new String ( "Hello" );


Câu trả lời là 3.
Đầu tiên - dòng 1, đối tượng “Hello” trong nhóm chuỗi.
Thứ hai - dòng 1, Chuỗi mới với giá trị “Hello” trong bộ nhớ heap
Thứ ba - dòng 2, Chuỗi mới với giá trị “Hello” trong bộ nhớ heap. Ở đây, chuỗi "Hello" từ nhóm chuỗi được sử dụng lại

Đăng nhận xét

0 Nhận xét