So sánh chuỗi với ký tự đặc biệt java năm 2024

Ý nghĩa: Trả về một số nguyên là kết quả so sánh hai chuỗi st1, st2. Nếu hai chuỗi đó bằng nhau thì kết quả bằng 0, nếu chuỗi st1 < st2 thì kết quả là số âm, ngược lại nếu chuỗi st1 > st2 thì kết quả là số dương.

Cách thực hiện so sánh:

  • Hai chuỗi được coi là bằng nhau nếu như chúng giống nhau hoàn toàn.

Ví dụ:

public class VDCompareTo {

public static void main(String[] args) {

String st1 = “HOA HAU”;

String st2 = “HOA HAU”;

System.out.println(st1.compareTo(st2));

}

}

Kết quả: 0

  • Nếu st1 và st2 là các chuỗi có độ dài khác nhau và st1 là đoạn đầu của st2 thì st1

Ví dụ:

public class VDCompareTo {

public static void main(String[] args) {

String st1 = “THI”;

String st2 = “THIUNGXU”;

System.out.println(st1.compareTo(st2));

}

}

Kết quả: -5

  • Chuỗi st1 > st2 nếu kí tự đầu tiên khác nhau giữa chúng kể từ trái sang trong chuỗi st1 có mã ASCII lớn hơn. (Kết quả số nguyên trả về là giá trị mã ASCII chênh lệch)

Ví dụ:

public class VDCompareTo {

public static void main(String[] args) {

String st1 = “AD”;//D:68

String st2 = “AB”;//B:66

System.out.println(st1.compareTo(st2));

}

}

Kết quả: 2

  1. Phương thức indexOf()

Cú pháp: st1.indexOf(String st2 [,int fromIndex]);

Ý nghĩa: Trả về một số nguyên là vị trí xuất hiện đầu tiên của chuỗi st2 trong st1 hoặc bắt đầu tử chỉ số fromIndex nếu có. Nếu chuỗi st2 không có trong chuỗi st1 thì kết quả trả về -1.

Ví dụ:

So sánh chuỗi với ký tự đặc biệt java năm 2024

  1. Phương thức lastIndexOf()

Cú pháp: st1.lastIndexOf(String st2);

Ý nghĩa: Trả về một số nguyên là vị trí xuất hiện cuối cùng của chuỗi st2 trong st1. Nếu chuỗi st2 không có trong chuỗi st1 thì kết quả trả về -1.

Ví dụ:

So sánh chuỗi với ký tự đặc biệt java năm 2024

  1. Phương thức replace()

Cú pháp: st1.replace(char oldChar, char newChar);

Ý nghĩa: Thực hiện thay thế ký tự oldChar bằng ký tự newChar trong chuỗi st1. Nếu ký tự cần thay thế không có trong chuỗi st1 thì chương trình sẽ trả về chuỗi st1.

Ví dụ:

So sánh chuỗi với ký tự đặc biệt java năm 2024

Lưu ý: Phương thức replaceAll(): tương tự như phương thức replace() nhưng chỉ thực hiện thay thế chuỗi.

Phương thức replaceFirst(): tương tự như phương thức replaceAll() nhưng chỉ thực hiện thay thế chuỗi con đầu tiên có trong st1.

Ví dụ:

So sánh chuỗi với ký tự đặc biệt java năm 2024

  1. Phương thức split()

Cú pháp: st1.split(String st2, int limit)

Ý nghĩa: Trả về một mảng các chuỗi con bằng cách tách các phần tử trong chuỗi st1 bằng chuỗi st2.

limit: kiểm soát số lượng các chuỗi con kết quả.

Ví dụ:

So sánh chuỗi với ký tự đặc biệt java năm 2024
So sánh chuỗi với ký tự đặc biệt java năm 2024

  1. Phương thức substring()

Cú pháp: st.substring(int startIndex [, int endIndex]);

Ý nghĩa: Tạo một chuỗi con từ vị trí có chỉ số là stratIndex trong chuỗi st. Trong trường hợp có endIndex, thì phương thức sẽ tạo một chuỗi con bắt đầu từ vị trí có chỉ số là startIndex và kết thúc tại vị trí có chỉ số endIndex – 1 trong chuỗi st.

Ví dụ:

So sánh chuỗi với ký tự đặc biệt java năm 2024

  1. Phương thức trim()

Cú pháp: st.trim();

Ý nghĩa: Thực hiện sẽ loại bỏ các khoảng trắng thừa ở đầu và cuối chuỗi st. Nếu chuỗi đó không có khoảng trắng thừa thì chương trình sẽ trả về chuỗi gốc.

Chào mừng các bạn đến với bài học Java số 13, bài học về Chuỗi. Bài học này nằm trong của Yellow Code Books.

Các bài trước chúng ta đã dành hết công lực để nói và học về mảng. Qua đó chúng ta đã biết rằng mảng là một cấu trúc dữ liệu khá mạnh và hiệu quả, chúng giúp quản lý danh sách các phần tử có cùng một kiểu dữ liệu, và còn giúp truy xuất rất nhanh đến một phần tử bất kỳ nữa. Hôm nay bạn lại được làm quen với một ứng dụng khá hay nữa của mảng, đó là mảng các ký tự, hay được gọi với một cái tên ngắn gọn và dễ hiểu hơn, đó là chuỗi.

Khái Niệm Chuỗi

Chuỗi, hay còn gọi là String đơn giản là một mảng các ký tự. Tuy nhiên về khái niệm cơ bản thì là vậy, còn về mặt cấu trúc thì chuỗi là một đối tượng (khái niệm mới mẻ này chúng ta sẽ nói đến ở mục hướng đối tượng – OOP ở vài bài sau nữa). Và vì nó là đối tượng, nó sẽ được hệ thống xây dựng sẵn các phương thức hữu ích. Việc của chúng ta ở bài học hôm nay là làm rõ khái niệm quan trọng của chuỗi, làm quen với việc khởi tạo chuỗi, và quen với các phương thức cần thiết, như phương thức so sánh chuỗi, cắt chuỗi, thay thế, tìm độ dài, tìm chuỗi con,….

Khi làm quen với chuỗi, bạn sẽ được nghe đâu đó nói rằng chuỗi là không thể thay đổi được, tiếng Anh gọi là immutable. Bạn có thể hiểu là một khi bạn khởi tạo một chuỗi thì giá trị khởi tạo đó sẽ là cố định. Mỗi khi bạn thay đổi giá trị cho chuỗi, hệ thống sẽ tạo ra một chuỗi mới. Do đó sẽ không ảnh hưởng lắm nếu như chương trình của bạn tạo ra các chuỗi để dùng mà bạn không có nhu cầu chỉnh sửa chúng hay chỉ chỉnh chút ít như các bài tập của bài học hôm nay. Nhưng nếu bạn có một chuỗi nào đó mà liên tục liên tục bị thay đổi giá trị, thì thay vì khai báo một chuỗi kiểu String, bạn có thể sử dụng kiểu StringBuffer hay StringBuilder thay thế. Bài hôm nay sẽ không đủ để nói về StringBuffer và StringBuilder, mình sẽ tập trung vào String và hẹn các bạn tiếp tục ở bài kế tiếp.

Khai Báo Và Khởi Tạo Một Chuỗi

Mình xin trắc nghiệm các bạn một tí. Dựa vào tất cả những gì mình nói ở trên đây, giả sử như như bây giờ mình kêu các bạn hãy thử khai báo một chuỗi và khởi tạo chuỗi đó với nội dung là “Hello World!”, bạn sẽ nghĩ ngay đến khai báo sau đúng không nào.

char[] chuoi = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};

Chưa đúng đâu nhé, code trên đây chỉ giúp bạn khởi tạo một mảng các ký tự thôi, với chuỗi thì dễ hơn nhiều đấy bạn, bạn có thể chọn một trong hai cách khai báo và khởi tạo như sau.

Khởi tạo theo kiểu “nguyên thủy”: tức là bạn xem chuỗi như là một biến với vậy (bạn biết thực chất không phải mà đúng không). Mình đưa ra ví dụ khai báo cho chuỗi “Hello World!” luôn chứ không đưa cú pháp như sau.

String myLiteralStr = "Hello World!";

Hoặc khởi tạo theo kiểu “đối tượng”: tức là bạn dùng từ khóa new để khởi tạo như những gì bạn thao tác với Scanner hay mảng ở bài trước, bạn xem.

String myObjectStr = new String("Hello World!");

Bạn chú ý ở khai báo và thao tác với chuỗi chúng ta bao chuỗi trong dấu nháy kép (” “) chứ không phải nháy đơn (‘ ‘) như với nhé.

Nói về kiến thức sâu một tí thì hai cách khởi tạo chuỗi trên đây thực ra là khác nhau, là bởi vì liên quan đến tính chất không thể thay đổi được mà mình đã nhắc ở trên. Nhưng mình sẽ không nói sâu về sự khác nhau đó ở đây. Còn nhớ khi mới tiếp cận Java mình cũng chỉ ghi nhớ hai cách khởi tạo trên, và mình thích cách đầu tiên nhất, cách đó trực quan và rất nhanh. Mình sẽ lập một mục riêng để bàn về hai cách khởi tạo này ở một bài viết khác nhé.

Một Số Phương Thức Hữu Ích Của Chuỗi

Đến đây mình không biết trình bày theo kiểu nào là tốt nhất. Vì về nguyên tắc chuỗi vẫn là một khái niệm hướng đối tượng (OOP), nó sẽ xa vời với đa số các bạn mới làm quen với lập trình. Nhưng mình nghĩ là không sao, việc sử dụng chuỗi khá là dễ, mình sẽ cố gắng liệt kê tất cả các phương thức hữu ích của chuỗi, bạn hãy làm quen với cách sử dụng các phương thức này, sau đó nếu có gặp lại ở đâu đó thì bạn hãy nhớ đến bài học hôm nay vậy.

So Sánh Chuỗi

Khi bạn có hai chuỗi, và muốn biết chúng giống hay khác nhau, hay khác nhau là khác nhau như thế nào, thì có thể dùng đến các hàm so sánh như sau.

equals()

Nếu có hai chuỗi, mình ví dụ chuoi1 và chuoi2, bạn có thể gọi

String myLiteralStr = "Hello World!";

8, kết quả trả về là một kiểu boolean với kết quả là true nếu chúng giống nhau và false nếu không giống nhau.

Bài Thực Hành Số 1

Với chuỗi gốc là “Hello World!”, bạn hãy in ra kết quả của so sánh chuỗi gốc với hai chuỗi “HelloWorld!” và “hello world!” nhé.

String rootStr = "Hello World!"; System.out.println("Compare 1: " + rootStr.equals("HelloWorld!")); System.out.println("Compare 2: " + rootStr.equals("hello world!"));

Kết quả của hai câu lệnh in ra console trên hiển nhiên là false và false rồi.

equalsIgnoreCase()

Cách sử dụng của phương thức này cũng giống với equals(), nhưng equalsIgnoreCase() lại trả về kết quả của sự so sánh mà không phân biệt chữ hoa-thường. Tức là Chuỗi “A” và “a” sẽ là như nhau trong phép so sánh này.

Bài Thực Hành Số 2

Bạn hãy in ra kết quả so sánh chuỗi “Hello World!” và “hello world!” nhé.

String rootStr = "Hello World!"; System.out.println("Compare: " + rootStr.equalsIgnoreCase("hello world!"));

Kết quả của câu lệnh so sánh chắc chắn là true.

So Sánh Với Toán Tử ==

Tuy đưa toán tử == ra đây, nhưng ở mức độ của bài học hôm nay, chúng ta lại không bàn về việc dùng toán tử == để so sánh hai chuỗi trong Java. Về mặt ngữ pháp lập trình thì không sai, bạn có thể thử dùng toán tử này để thực hành so sánh nếu chuoi1 == chuoi2. Nhưng một khi bạn chưa hiểu rõ về chuỗi và về hướng đối tượng thì mình khuyên bạn nên bỏ khỏi đầu ý định so sánh hai chuỗi trong Java bằng toán tử == nhé, mình sẽ nói tại sao ở một bài khác.

compareTo()

Phương thức so sánh này khá đặc biệt, nó sẽ lấy từng ký tự ra so sánh, với mỗi ký tự nó sẽ lấy ra rồi tiến hành phép trừ các ký tự này, một khi đã phát hiện ta ký tự khác biệt (phép trừ cho ra kết quả âm hay dương) thì sẽ ngừng việc trừ lại.

Cụ thể như ví dụ

String myLiteralStr = "Hello World!";

9 thì.

  • Kết quả trả về là một số âm khi chuoi1 có thứ tự ký tự trong Unicode nhỏ hơn chuoi2.
  • Kết quả trả về là số 0 khi chuoi1 giống hệt chuoi2.
  • Kết quả trả về là một số dương khi chuoi1 có thứ tự ký tự trong Unicode lớn hơn chuoi2.
Bài Thực Hành Số 3

Giả sử bạn lấy đâu đó ra hai chuỗi “1.5.5.3” và “1.5.6.1” chính là hai version của ứng dụng. Bằng cách nào bạn có thể in ra console version nào là version mới nhất?

String version1 = "1.5.5.3"; String version2 = "1.5.6.1"; int compare = version1.compareTo(version2); if (compare < 0) {

System.out.println(version2 + " mới hơn " + version1);
} else if (compare > 0) {
System.out.println(version1 + " mới hơn " + version2);
} else {
System.out.println(version1 + " giống " + version2);
}

Khi bạn có hai chuỗi, và muốn nối chúng lại với nhau, bạn có thể dùng đến các hàm sau.

Nối Chuỗi Với Toán Tử +

Thật dễ dàng như 1 + 1 = 2 vậy, bạn hãy xem qua ví dụ sau.

String str1 = "Hello World!"; String str2 = str1 + " Hello Yellow Code Books!"; System.out.println(str2);

Với cách nối chuỗi bằng toán tử + này thì bạn có thể nối thoải mái bao nhiêu chuỗi lại với nhau cũng được. Và nên nhớ là không hề có các toán tử –, * hay / với chuỗi nhé bạn.

Với ví dụ nối chuỗi bằng toán tử + trên đây thì bạn hãy nhớ lại đi, bạn đã và đang làm quen với cách nối chuỗi này từ các bài học trước và kể cả bài học hôm nay, ở các bài thực hành ở trên, đó là các hàm in ra console, bạn kiểm chứng lại nhé.

concat()

Với việc gọi

String myObjectStr = new String("Hello World!");

0 thì kết quả cho ra sẽ là một chuỗi mới tương tự như gọi

String myObjectStr = new String("Hello World!");

1 trên đây vậy.

Bài Thực Hành Số 4

Bạn hãy viết lại câu lệnh nối chuỗi với toán tử + trên đây bằng hàm concat() nhé.

String str1 = "Hello World!"; System.out.println(str1.concat(" Hello Yellow Code Books!"));

join()

Một phương thức khá hay nữa của chuỗi. Phương thức này cho phép bạn truyền vào bao nhiêu tham số cũng được, chỉ cần các tham số đó cũng là các chuỗi. Khi đó kết quả của phương thức này chính là một chuỗi mới được ghép lại từ các chuỗi truyền vào, nhưng được phân cách nhau bởi chuỗi đầu tiên. Nói thì khá khó hiểu, mời bạn đến với Bài thực hành bên dưới.

Bài Thực Hành Số 5

In ra màn hình tất cả các size áo có thể có của một cửa hàng, nội dung đại loại như sau “There are sizes: S, M, L, XL”. Bạn có thể đơn giản in hết nội dung này ra màn hình một lúc, nhưng khi dùng join() nó như sau.

String allSizes = String.join(", ", "S", "M", "L", "XL"); System.out.println("There are sizes: " + allSizes);

repeat()

Phương thức này được thêm vào từ Java 11, nó đơn giản là giúp lặp chuỗi với x lần để tạo ra chuỗi mới.

Bài Thực Hành Số 6

In ra màn hình dòng chữ “Are you sure? Sure! Sure! Sure! Sure! Sure! Sure!”.

String sureSixTimes = "Sure!".repeat(6); System.out.println("Are you sure? " + sureSixTimes);

Rút Trích Chuỗi Con

Nếu bạn có một chuỗi, và muốn lấy ra chuỗi con trong chuỗi gốc này, mời bạn làm quen với hai phương thức sau.

subString(int startIndex)

Nếu bạn gọi

String myObjectStr = new String("Hello World!");

2 thì kết quả sẽ trả về một chuỗi con với nội dung bắt đầu từ chỉ số startIndex của chuoi, lưu ý là giống như với mảng: chỉ số của các ký tự trong chuỗi được bắt đầu từ 0.

Bài Thực Hành Số 7

Với chuỗi gốc là “Hello World! Hello Yellow Code Books!”, bạn hãy trích ra chuỗi con là “Hello Yellow Code Books!” nhé.

String myLiteralStr = "Hello World!";

0

subString(int startIndex, int endIndex)

Tương tự như trên nhưng nếu bạn gọi

String myObjectStr = new String("Hello World!");

3 thì kết quả sẽ trả về một chuỗi con với nội dung bắt đầu từ chỉ số startIndex đến chỉ số endIndex của chuoi.

Bài Thực Hành Số 8

Với chuỗi gốc là “Hello World! Hello Yellow Code Books!”, bạn hãy thử trích ra chuỗi con là “Yellow Code Books” xem sao.

String myLiteralStr = "Hello World!";

1

Lưu ý ở bài thực hành này mình có gọi đến phương thức

String myObjectStr = new String("Hello World!");

4 của chuỗi, phương thức này sẽ trả về độ lớn của chuỗi, là tổng số ký tự trong chuỗi đó.

Chuyển Đổi In Hoa – In Thường

Ở chuỗi có các hàm sau để bạn có thể chuyển đổi về in hoa hay in thường cho tất cả các ký tự trong chuỗi.

toUpperCase()

Nếu bạn gọi

String myObjectStr = new String("Hello World!");

5 thì nó sẽ trả về một chuỗi mới với tất cả các ký tự được in hoa từ chuoi.

Bài Thực Hành Số 9

Với chuỗi gốc là “Hello World! Hello Yellow Code Books!”, bạn hãy in hoa hết tất cả các ký tự của chuỗi và in ra console.

String myLiteralStr = "Hello World!";

2

toLowerCase()

Phương thức này ngược lại hoàn toàn với

String myObjectStr = new String("Hello World!");

6, nó sẽ giúp trả về một chuỗi với tất cả các ký tự trong chuoi về thành ký tự thường.

Một Số Phương Thức Thông Dụng Khác Của Chuỗi

Dưới đây là một số phương thức thông dụng khác của chuỗi mà bạn cần phải biết.

trim()

Phương thức này loại bỏ các khoảng trắng ở trước và sau chuỗi.

Bài Thực Hành Số 10

Với chuỗi gốc là ” Hello World! “. Bạn hãy cắt bỏ các khoảng trắng ở đầu và cuối chuỗi rồi in ra console.

String myLiteralStr = "Hello World!";

3

startsWith() Và endsWith()

Hai phương thức này đều trả về một kiểu boolean, cho biết chuỗi có bắt đầu hay kết thúc với một chuỗi được so sánh hay không.

Bài Thực Hành Số 11

Với chuỗi gốc là “Hello World! Hello Yellow Code Books!”, hãy in ra console cho biết chuỗi này có bắt đầu là “Hello” và có kết thúc là “Hello” hay không.

String myLiteralStr = "Hello World!";

4

Kết quả của hai câu in ra console trên lần lượt là true và false.

charAt()

Phương thức này trả về ký tự của chuỗi tại chỉ mục được truyền vào.

Bài Thực Hành Số 12

Với chuỗi gốc là “Hello World! Hello Yellow Code Books!”, bạn hãy in ra console ký tự thứ 11 trong chuỗi.

String myLiteralStr = "Hello World!";

5

replace()

Phương thức này có hai tham số truyền vào chính là hai chuỗi, như này

String myObjectStr = new String("Hello World!");

7. Nếu chuoi1 có tồn tại trong chuoi thì tất cả những nơi nào xuất hiện chuoi1 trong chuoi sẽ bị thay bằng chuoi2.

Bài Thực Hành Số 13

Với chuỗi gốc là “Hello World! Hello Yellow Code Books!”, bạn hãy thay thế tất cả các “Hello” trong chuỗi gốc này thành “Hi” nhé.

String myLiteralStr = "Hello World!";

6

indexOf()

Phương thức này sẽ tìm trong chuỗi vị trí xuất hiện đầu tiên của ký tự được truyền vào trong phương thức.

Bài Thực Hành Số 14

Với Chuỗi gốc là “Hello World! Hello Yellow Code Books!”, bạn hãy in ra console vị trí của ký tự “!”.

String myLiteralStr = "Hello World!";

7

Kết quả câu lệnh này sẽ in ra console số 11.

Ngoài các phương thức được liệt kê trên đây thì chuỗi còn có khá nhiều các phương thức hữu ích khác, nhưng trong khuôn khổ bài viết này mình tạm không nói hết. Hoặc có những phương thức mang đậm tính Hướng đối tượng hơn, có thể khiến bạn phải hoang mang, nên mình sẽ dành khi nào dùng đến các phương thức đặc biệt này sẽ nói rõ hơn.

Kết Luận

Vậy là các bạn đã xem sơ qua về chuỗi trong Java. Về cá nhân mình thấy nhiêu đây vẫn chưa đủ kiến thức về chuỗi, vẫn còn nhiều điều hay ho nữa, có lẽ mình sẽ tạo một bài mới để nói được rõ ràng hơn.

Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách: – Đánh giá 5 sao ở mỗi bài viết nếu thấy thích. – Comment bên dưới mỗi bài viết nếu có thắc mắc. – Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới. – Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác. – Ủng hộ blog theo hướng dẫn ở thanh bên phải để blog ngày càng phát triển hơn.

Bài Kế Tiếp

Chúng ta sẽ nói tiếp về chuỗi, nhưng không phải String hôm nay mà là hai anh em khác của chuỗi đó là StringBuffer và StringBuilder. Bạn hãy chờ xem anh em họ khác nhau như thế nào nhé.