Chương 1.) Lưu ý: Lớp StringBuilder được giới thiệu trong phiên bản Java 1. Nếu bạn đang sử dụng trình biên dịch Java cũ hơn, bạn phải sử dụng StringBuffer thay thế. TẠO ĐỐI TƯỢNG STRINGBUILDER Bạn không thể gán trực tiếp các chuỗi chữ của đối tượng StringBuilder, như bạn có thể làm với đối tượng String. Tuy nhiên, lớp StringBuilder có một hàm tạo chấp nhận một chuỗi làm tham số.
Vì vậy, để tạo một đối tượng StringBuilder, bạn sử dụng một câu lệnh như sau: StringBuilder sb = new StringBuilder("Today is the day!"); Bên trong, một đối tượng StringBuilder duy trì một khu vực bộ nhớ cố định nơi nó lưu trữ một giá trị chuỗi. Khu vực bộ nhớ này được gọi là bộ đệm. Chuỗi được giữ trong bộ đệm này không cần phải sử dụng toàn bộ bộ đệm. Do đó, một đối tượng StringBuilder có cả chiều dài và dung lượng.
Chiều dài đại diện cho chiều dài hiện tại của chuỗi được duy trì bởi StringBuilder và dung lượng đại diện cho kích thước của bộ đệm chính nó. Lưu ý rằng chiều dài không thể vượt quá dung lượng. Khi bạn tạo một đối tượng StringBuilder, ban đầu dung lượng được đặt là chiều dài của chuỗi cộng 16. Lớp StringBuilder tự động tăng dung lượng của nó khi cần, vì vậy bạn không cần phải lo lắng về việc vượt quá dung lượng.
SỬ DỤNG CÁC PHƯƠNG THỨC CỦA STRINGBUILER Bảng 1-2 liệt kê những phương thức hữu ích nhất của lớp StringBuilder. Lưu ý rằng lớp StringBuffer sử dụng các phương thức giống nhau. Nếu bạn phải sử dụng StringBuffer thay vì StringBuilder, chỉ cần thay đổi tên lớp và sử dụng các phương thức tương tự. BẢNG 1-2 StringBuilder Methods Phương thức Mô tả append(primitiveType) Thêm vào cuối chuỗi biểu diễn của kiểu nguyên thủy.
append(Object) Gọi phương thức toString của đối tượng và thêm kết quả vào cuối chuỗi. append(CharSequence) Thêm chuỗi vào cuối giá trị chuỗi của StringBuilder. Tham số có thể là String, StringBuilder hoặc StringBuffer. char charAt(int) Trả về ký tự tại vị trí chỉ định trong chuỗi.
delete(int, int) Xóa các ký tự bắt đầu từ vị trí int đầu tiên và kết thúc trước ký tự int thứ hai. deleteCharAt(int) Xóa ký tự tại vị trí chỉ định. ensureCapacity(int) Đảm bảo rằng dung lượng của StringBuilder ít nhất bằng giá trị int; tăng dung lượng nếu cần. int capacity() Trả về dung lượng của StringBuilder này.
int indexOf(String) Trả về chỉ mục của lần xuất hiện đầu tiên 20 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 của chuỗi được chỉ định. Nếu chuỗi không xuất hiện, trả về -1. int indexOf(String, int) Trả về chỉ mục của lần xuất hiện đầu tiên của chuỗi được chỉ định, bắt đầu tìm kiếm từ vị trí chỉ định. Nếu chuỗi không xuất hiện, trả về -1.
insert(int, primitiveType) Chèn vào vị trí được chỉ định bởi đối số int biểu diễn chuỗi của kiểu nguyên thủy. insert(int, Object) Gọi phương thức toString của đối tượng tham số, sau đó chèn chuỗi kết quả vào vị trí được chỉ định bởi đối số int. insert(int, CharSequence) Chèn chuỗi vào vị trí được chỉ định bởi đối số int. Tham số thứ hai có thể là String, StringBuilder hoặc StringBuffer.
int lastIndexOf(String) Trả về chỉ mục của lần xuất hiện cuối cùng của chuỗi được chỉ định. Nếu chuỗi không xuất hiện, trả về -1. Int lastIndexOf(String, int) Trả về chỉ mục của lần xuất hiện cuối cùng của chuỗi được chỉ định, bắt đầu tìm kiếm từ vị trí chỉ định. Nếu chuỗi không xuất hiện, trả về -1.
int length() Trả về độ dài của chuỗi này. replace(int, int, String) Thay thế chuỗi con được chỉ định bởi hai tham số đầu tiên bằng chuỗi được cung cấp bởi tham số thứ ba. reverse() Đảo ngược thứ tự các ký tự. setCharAt(int, char) Đặt ký tự tại vị trí chỉ định thành ký tự được chỉ định.
setLength(int) Đặt độ dài của chuỗi. Nếu độ dài đó nhỏ hơn độ dài hiện tại, chuỗi sẽ bị cắt bớt; nếu nó lớn hơn độ dài hiện tại, các ký tự mới - là các số không hexa - sẽ được thêm vào. String substring(int) Trích xuất một chuỗi con, bắt đầu từ vị trí được chỉ định bởi tham số int và tiếp tục đến cuối chuỗi. String Trích xuất một chuỗi con, bắt đầu từ vị trí được chỉ định bởi tham số đầu tiên và kết substring(int, int) thúc tại vị trí trước giá trị của tham số thứ hai.
String toString() Trả về giá trị hiện tại dưới dạng một chuỗi. String trimToSize() Giảm dung lượng của StringBuffer để phù hợp với kích thước của chuỗi. XEM MỘT VÍ DỤ VỀ STRINGBUILDER Để minh họa cách lớp StringBuilder hoạt động, dưới đây là một phiên bản của chương trình MarkVowels sử dụng StringBuilder từ trước trong chương này: 21 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 import java.Scanner; public class StringBuilderApp { static Scanner sc = new Scanner(System.in); public static void main(String[] args) { System.print("Enter a string: "); String s = sc.nextLine(); StringBuilder sb = new StringBuilder(s); int vowelCount = 0; for (int i = 0; i < s.toString()); } } Chương trình này sử dụng phương thức setCharAt để trực tiếp thay thế bất kỳ nguyên âm nào nó tìm thấy bằng dấu hoa thị. Điều này hiệu quả hơn nhiều so với việc nối chuỗi con (điều này làm cho phiên bản String của chương trình này hoạt động).
SỬ DỤNG GIAO DIỆN CHARSEQUENCE API Java bao gồm một giao diện hữu ích được gọi là CharSequence. Tất cả ba lớp được thảo luận trong chương này — String, StringBuilder và StringBuffer — đều thực hiện giao diện này. Phương pháp này chủ yếu tồn tại để cho phép bạn sử dụng String, StringBuilder và StringBuffer một cách tương đồng. Với mục tiêu đó, một số phương thức của các lớp String, StringBuilder và StringBuffer sử dụng CharSequence như là kiểu tham số.
Đối với những phương thức đó, bạn có thể truyền vào một đối tượng String, StringBuilder hoặc StringBuffer. Lưu ý rằng một chuỗi chữ được xử lý như một đối tượng String, vì vậy bạn có thể sử dụng một chuỗi chữ bất kỳ nơi nào cần một CharSequence. Trong trường hợp bạn quan tâm, giao diện CharSequence định nghĩa bốn phương thức: char charAt(int): Trả về ký tự tại vị trí được chỉ định. int length(): Trả về độ dài của chuỗi.
subSequence(int start, int end): Trả về chuỗi con được chỉ định bởi các tham số start và end. toString(): Trả về biểu diễn dưới dạng chuỗi của chuỗi. 22 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 Nếu bạn có ý định sử dụng CharSequence như là kiểu tham số cho một phương thức để phương thức đó hoạt động với một đối tượng String, StringBuilder hoặc StringBuffer, hãy lưu ý rằng bạn chỉ có thể sử dụng bốn phương thức này. Biên dịch sang tiếng việt Chương 2 Chương 2: Sử dụng mảng Nội dung trong chương này: Làm việc với mảng một chiều cơ bản Sử dụng trình khởi tạo mảng để thiết lập giá trị ban đầu của một mảng Sử dụng vòng lặp for với mảng Làm việc với mảng hai chiều Làm việc với lớp Arrays Mảng là một khía cạnh quan trọng của bất kỳ ngôn ngữ lập trình nào, và Java không phải là một ngoại lệ.
Trong chương này, bạn sẽ khám phá mọi thứ bạn cần biết về việc sử dụng mảng. Tôi sẽ giới thiệu về mảng một chiều thông thường; mảng đa chiều; và hai lớp được sử dụng để làm việc với mảng, có tên là Array và Arrays. HIỂU VỀ MẢNG Một mảng là một tập hợp các biến được tham chiếu bằng cách sử dụng một tên biến duy nhất kết hợp với một số chỉ mục. Mỗi phần tử của mảng được gọi là một phần tử.
Tất cả các phần tử trong mảng phải thuộc cùng một loại. Do đó, mảng chính nó có một loại chỉ định loại phần tử mà nó có thể chứa. Ví dụ, một mảng int có thể chứa giá trị int, và một mảng String có thể chứa chuỗi. Số chỉ mục được viết sau tên biến và được đặt trong dấu ngoặc vuông.
Vì vậy, nếu tên biến là x, bạn có thể truy cập một phần tử cụ thể với một biểu thức như x[5]. Bạn có thể nghĩ rằng x[5] sẽ tham chiếu đến phần tử thứ năm trong mảng. Nhưng số chỉ mục bắt đầu từ không cho phần tử đầu tiên, vì vậy x[5] thực sự tham chiếu đến phần tử thứ sáu. Chi tiết nhỏ này là một trong những nguyên nhân chính gây ra vấn đề khi làm việc với mảng, đặc biệt nếu bạn đã bắt đầu lập trình mảng trong một ngôn ngữ mà mảng được đánh chỉ mục từ một thay vì từ không.
Vì vậy, trong Java, hãy quen việc đếm từ không thay vì từ một. Sức mạnh thực sự của mảng đến từ sự thực tế đơn giản là bạn có thể sử dụng một biến hoặc thậm chí là một biểu thức hoàn chỉnh như một chỉ số mảng. Vì vậy (ví dụ), thay vì mã hóa x[5] để tham chiếu đến một phần tử mảng cụ thể, bạn có thể mã hóa x[i] để tham chiếu đến phần tử được chỉ định bởi biến chỉ số i. Bạn sẽ thấy nhiều ví dụ về biến chỉ số trong toàn bộ chương này.
Dưới đây là một số thông tin thêm về mảng để cân nhắc trước khi bạn đi vào chi tiết về việc tạo và sử dụng mảng: Một mảng chính nó là một đối tượng. Bạn có thể tham chiếu đến đối tượng mảng như một toàn bộ, thay vì đến một phần tử cụ thể của mảng, bằng cách sử dụng tên biến của mảng mà không có chỉ số. Do đó, nếu x[5] tham chiếu đến một phần tử của mảng, thì x tham chiếu đến mảng chính nó. 23 Downloaded by ANH BACH (bachvan15@gmail.com) lOMoARcPSD|39150642 Một mảng có chiều dài cố định được thiết lập khi mảng được tạo.
Chiều dài này xác định số lượng phần tử có thể được lưu trữ trong mảng. Giá trị chỉ mục tối đa bạn có thể sử dụng với bất kỳ mảng nào là một ít hơn một so với chiều dài của mảng. Do đó, nếu bạn tạo một mảng có mười phần tử, bạn có thể sử dụng giá trị chỉ mục từ 0 đến 9. Bạn không thể thay đổi chiều dài của mảng sau khi bạn đã tạo mảng.
Bạn có thể truy cập chiều dài của mảng bằng cách sử dụng trường length của biến mảng.length sẽ trả về chiều dài của mảng x. TẠO MẢNG Trước khi bạn có thể tạo một mảng, bạn phải khai báo một biến tham chiếu đến mảng. Khai báo biến này nên chỉ định loại các phần tử được lưu trữ bởi mảng, theo sau là một bộ ngoặc vuông trống, như sau: String[] names; Đây là một biến được đặt tên là "names". Loại của nó là một mảng các đối tượng String.
Chỉ để đảm bảo rằng bạn càng bối rối càng tốt, trong Java bạn cũng có thể đặt dấu ngoặc vuông trên tên biến thay vì trên loại.