
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 và 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 là immutable và 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.
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 và 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.
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 và 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); }
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 và 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 CharSequence và String 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
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
Đâ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.
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.
Đâ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 .
Đâ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.
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 và StringBuilder.
StringBuffer và 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.
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.
👉 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.
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.
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.
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.
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.
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.
Vì 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.
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);
}
}
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);
}
}
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);
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));
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);
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.
0 Nhận xét