1. StringTokenizer
lớp học
Và bây giờ là một vài kịch bản phổ biến hơn liên quan đến làm việc với chuỗi. Làm thế nào để bạn chia một chuỗi thành nhiều phần? Có nhiều hướng khác nhau để làm điều đó.
split()
phương pháp
Cách đầu tiên để tách một chuỗi thành nhiều phần là sử dụng split()
phương thức. Một biểu thức chính quy xác định một chuỗi phân cách đặc biệt phải được chuyển thành đối số. Bạn sẽ tìm hiểu biểu thức chính quy là gì trong nhiệm vụ Đa luồng Java .
Ví dụ:
Mã số | Kết quả |
---|---|
|
Kết quả sẽ là một mảng gồm ba chuỗi:
|
Đơn giản, nhưng đôi khi cách tiếp cận này là quá mức. Nếu có nhiều dấu phân cách (ví dụ: khoảng trắng, ký tự xuống dòng, tab, dấu chấm), thì bạn phải xây dựng một biểu thức chính quy khá phức tạp. Nó khó đọc và do đó khó sửa đổi.
StringTokenizer
lớp học
Java có một lớp đặc biệt mà toàn bộ công việc của nó là chia một chuỗi thành các chuỗi con.
Lớp này không sử dụng các biểu thức chính quy: thay vào đó, bạn chỉ cần chuyển vào một chuỗi bao gồm các dấu phân cách. Ưu điểm của phương pháp này là nó không phá vỡ toàn bộ chuỗi thành từng mảnh cùng một lúc mà thay vào đó di chuyển từ đầu đến cuối từng bước một.
Lớp này có một hàm tạo và hai phương thức quan trọng. Chúng tôi chuyển cho hàm tạo một chuỗi mà chúng tôi chia thành các phần và một chuỗi bao gồm một tập hợp các ký tự phân cách.
phương pháp | Sự miêu tả |
---|---|
|
Trả về chuỗi con tiếp theo |
|
Kiểm tra xem có nhiều chuỗi con hơn không. |
Lớp này phần nào gợi nhớ đến lớp Scanner, lớp này cũng có các phương thức nextLine()
và hasNextLine()
.
Bạn có thể tạo một StringTokenizer
đối tượng bằng lệnh này:
StringTokenizer name = new StringTokenizer(string, delimiters);
Đâu string
là chuỗi được chia thành các phần. Và delimiters
là một chuỗi và mỗi ký tự trong đó được coi là dấu phân cách. Ví dụ:
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Lưu ý rằng mỗi ký tự trong chuỗi được truyền dưới dạng chuỗi thứ hai cho StringTokenizer
hàm tạo được coi là dấu phân cách.
2. String.format()
phương thức và StringFormatter
lớp
Một phương thức thú vị khác của lớp String là format()
.
Giả sử bạn có nhiều biến lưu trữ dữ liệu. Làm thế nào để bạn hiển thị chúng trên màn hình trong một dòng? Ví dụ: chúng tôi có một số dữ liệu (cột bên trái) và đầu ra mong muốn (cột bên phải):
Mã số | Đầu ra bảng điều khiển |
---|---|
|
|
Mã của bạn có thể sẽ giống như thế này:
Mã chương trình |
---|
|
Mã như vậy không phải là rất dễ đọc. Và nếu tên biến dài hơn, thì mã sẽ trở nên khó khăn hơn:
Mã chương trình |
---|
|
Không phải là rất dễ đọc, phải không?
Nhưng đây là một tình huống phổ biến trong các chương trình trong thế giới thực, vì vậy tôi muốn nói với bạn về cách viết mã này đơn giản và ngắn gọn hơn.
String.format
Lớp Chuỗi có một format()
phương thức tĩnh: nó cho phép bạn chỉ định một mẫu để tập hợp một chuỗi có dữ liệu. Giao diện chung của lệnh như sau:
String name = String.format(pattern, parameters);
Ví dụ:
Mã số | Kết quả |
---|---|
|
|
|
|
|
|
Tham format()
số đầu tiên của phương thức là một chuỗi định dạng chứa tất cả văn bản mong muốn cùng với các ký tự đặc biệt được gọi là định dạng định dạng (chẳng hạn như %d
và %s
) ở những nơi bạn cần chèn dữ liệu.
Phương thức này format()
thay thế các thông số này %s
và %d
định dạng bằng các tham số tuân theo chuỗi định dạng trong danh sách tham số. Nếu chúng ta muốn chèn một chuỗi, thì chúng ta viết %s
. Nếu chúng ta muốn chèn một số, thì định dạng định dạng là %d
. Ví dụ:
Mã số | Kết quả |
---|---|
|
s bằng"a=1, b=4, c=3" |
Đây là một danh sách ngắn các định dạng định dạng có thể được sử dụng bên trong chuỗi định dạng:
công cụ xác định | Nghĩa |
---|---|
|
String |
|
liên lạc: byte , short , int ,long |
|
số thực: float ,double |
|
boolean |
|
char |
|
Date |
|
% tính cách |
Các bộ xác định này cho biết loại dữ liệu, nhưng cũng có các bộ xác định cho biết thứ tự của dữ liệu. Để lấy một đối số theo số của nó (việc đánh số bắt đầu từ một), bạn cần viết " " thay vì " ". Ví dụ:%1$d
%d
Mã số | Kết quả |
---|---|
|
s bằng"a=13, b=12, c=11" |
%3$d
sẽ nhận được đối số thứ 3, %2$d
sẽ nhận được đối số thứ hai và %d
sẽ nhận được đối số đầu tiên. Các bộ xác định định dạng %s
và %d
tham chiếu đến các đối số bất kể các bộ xác định như %3$d
hay%2$s
3. Bi-a dây
Mỗi chuỗi được chỉ định trong mã dưới dạng chuỗi ký tự được lưu trữ trong một vùng bộ nhớ được gọi là StringPool
khi chương trình đang chạy. StringPool
là một mảng đặc biệt để lưu trữ các chuỗi. Mục đích của nó là để tối ưu hóa lưu trữ chuỗi:
Đầu tiên, các chuỗi được chỉ định trong mã phải được lưu trữ ở đâu đó, phải không? Mã bao gồm các lệnh, nhưng dữ liệu (đặc biệt là các chuỗi lớn) phải được lưu trữ trong bộ nhớ tách biệt với mã. Chỉ các tham chiếu đến các đối tượng chuỗi xuất hiện trong mã.
Thứ hai, tất cả các chuỗi ký tự giống hệt nhau chỉ được lưu trữ trong bộ nhớ một lần. Và đó chỉ là cách nó hoạt động. Khi mã lớp của bạn được tải bởi máy Java, tất cả các ký tự chuỗi sẽ được thêm vào StringPool
nếu chúng chưa có ở đó. Nếu chúng đã ở đó, thì chúng tôi chỉ cần sử dụng tham chiếu chuỗi từ tệp StringPool
.
Theo đó, nếu bạn gán cùng một chữ cho một số String
biến trong mã của mình, thì các biến này sẽ chứa cùng một tham chiếu. Một chữ sẽ được thêm vào một StringPool
lần duy nhất. Trong tất cả các trường hợp khác, mã sẽ nhận tham chiếu đến chuỗi đã được tải trong tệp StringPool
.
Đây là cách nó hoạt động:
Mã số | Làm việc với StringPool |
---|---|
|
|
Đó là lý do tại sao các biến a
và b
sẽ lưu trữ các tham chiếu giống nhau.
intern()
phương pháp
Và phần tốt nhất là bạn có thể lập trình thêm bất kỳ chuỗi nào vào tệp StringPool
. Để làm điều này, bạn chỉ cần gọi phương thức String
của biến intern()
.
Phương intern()
thức sẽ thêm chuỗi vào StringPool
nếu nó chưa có ở đó và sẽ trả về một tham chiếu đến chuỗi trong tệp StringPool
.
Nếu hai chuỗi giống hệt nhau được thêm vào phương thức StringPool
sử dụng intern()
, phương thức này sẽ trả về cùng một tham chiếu. Điều này có thể được sử dụng để so sánh các chuỗi theo tham chiếu. Ví dụ:
Mã số | Ghi chú |
---|---|
|
|
|
|
Bạn sẽ không thường xuyên sử dụng phương pháp này, nhưng mọi người lại thích hỏi về nó trong các cuộc phỏng vấn . Vì vậy, tốt hơn là biết về nó hơn là không biết.