Java Bài 13: Chuỗi (String)

Posted by

Được chỉnh sửa ngày 22/3/2017.

Chào mừng các bạn quay trở lại với bài học Java số 13 trong chương trình học Java 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. Các bạn cũng đã 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ề 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à 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 là làm quen với các Phương Thức này và lấy ra dùng khi 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 để xài mà bạn không có nhu cầu chỉnh sửa Chuỗi 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 kiểu dữ liệu nguyên thủy. 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 Ký tự nhé.

Nói về kiến thức sâu một tí thì hai cách khởi tạo hai 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ụ chuoi1chuoi2, bạn có thể gọi chuoi1.equals(chuoi2), kết quả trả về là một kiểu boolean với true là giống nhau và false là 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!”“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à falsefalse 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”“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!”“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ử ==

Ở mức độ của bài học hôm nay, chúng ta 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 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 giá trị Unicode 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ụ chuoi1.compareTo(chuoi2) 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”“1.5.6.1”, đây 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);
}

Nối Chuỗi

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 chuoi1.concat(chuoi2) thì kết quả cho ra sẽ là một Chuỗi mới tương tự như gọi chuoi1 + chuoi2 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!"));

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 hàm sau.

subString(int startIndex)

Nếu bạn gọi chuoi.subString(startIndex) 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ố 5

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 rootStr= "Hello World! Hello Yellow Code Books!";
System.out.println(rootStr.substring(13));

subString(int startIndex, int endIndex)

Tương tự như trên nhưng nếu bạn gọi chuoi.subString(startIndex, endIndex) 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ố 6

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 rootStr= "Hello World! Hello Yellow Code Books!";
System.out.println(rootStr.substring(13, rootStr.length() - 2));

Lưu ý ở bài thực hành này mình có gọi đến hàm length() của Chuỗi, hàm 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 chuoi.toUpperCase() 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ố 7

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 rootStr= "Hello World! Hello Yellow Code Books!";
rootStr = rootStr.toUpperCase();
System.out.println(rootStr);

toLowerCase()

Phương thức này ngược lại hoàn toàn với toUpperCase(), 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ố 8

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 rootStr= "   Hello World!       ";
rootStr = rootStr.trim();
System.out.println(rootStr);

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ố 9

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 rootStr= "Hello World! Hello Yellow Code Books!";
System.out.println("String start with Hello? " + rootStr.startsWith("Hello"));
System.out.println("String end with Hello? " + rootStr.endsWith("Hello"));

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

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ố 10

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 rootStr= "Hello World! Hello Yellow Code Books!";
System.out.println("The 11th char is " + rootStr.charAt(11));

replace()

Phương thức này có hai tham số truyền vào chính là hai Chuỗi, như này chuoi.replace(chuoi1, chuoi2). 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ố 11

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 rootStr= "Hello World! Hello Yellow Code Books!";
rootStr = rootStr.replace("Hello", "Hi");
System.out.println(rootStr);

indexOf()

Hàm 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 hàm.

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 vị trí của ký tự “!”.

String rootStr= "Hello World! Hello Yellow Code Books!";
System.out.println("The ! char at " + rootStr.indexOf("!")) ;

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.

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 đánh giá 5 sao nếu thấy thích bài viết, hãy comment bên dưới nếu có thắc mắc, hãy để lại địa chỉ email của bạn để nhận được thông báo mới nhất khi có bài viết mới, và nhớ chia sẻ các bài viết của Yellow Code Books đến nhiều người khác nữa nhé.

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

Advertisements
Rating: 5.0/5. From 4 votes.
Please wait...

Gửi phản hồi