string-stringbuilder-stringbuffer

String, StringBuffer và StringBuilder trong Java

NỘI DUNG BÀI VIẾT

Khi làm việc với các dữ liệu văn bản, Java cung cấp cho bạn 3 class StringStringBuffer và StringBuilder. Nếu làm việc với các dữ liệu lớn bạn nên sử dụng StringBuffer hoặc StringBuilder để đạt hiệu năng nhanh nhất. Về cơ bản 3 class này có nhiều điểm giống nhau.

  • String là không thể thay đổi (immutable), khái niệm này sẽ được nói chi tiết ở trong tài liệu, và không cho phép có class con.
  • StringBufferStringBuilder có thể thay đổi (mutable)

StringBuilder và StringBuffer là giống nhau, nó chỉ khác biệt tình huống sử dụng có liên quan tới đa luồng (Multi Thread).

LUYỆN THI CHỨNG CHỈ OCA

  • Nếu xử lý văn bản sử dụng nhiều luồng (Thread) bạn nên sử dụng StringBuffer để tránh tranh chấp giữa các luồng.
  • Nếu xử lý văn bản sử dụng 1 luồng (Thread) nên sử dụng StringBuilder.

Sso sánh về tốc độ xử lý StringBuilder là tốt nhất, sau đó StringBuffer và cuối cùng mới là String.

String

Cú pháp:

String str = "Hello world"; // or String str = new String("Hello world");
Code language: JavaScript (javascript)

Trong Java, String là một class đặc biệt, nguyên nhân là nó được sử dụng một cách thường xuyên trong một chương trình, vì vậy đòi hỏi nó phải có hiệu suất và sự mềm dẻo. Đó là lý do tại sao String có tính đối tượng và vừa có tính nguyên thủy (primitive). Ví Dụ về tính nguyên thủy: Chúng ta hoàn toàn có thể khai báo: String s1 = "Hello word" Bạn cũng có thể sử dụng toán tử + để nối 2 string, toán tử này vốn quen thuộc và sử dụng cho các kiểu dữ liệu nguyên thủy như int, float, double. Tính đối tượng: Vì String là một class, vì vậy nó có thể được tạo ra thông qua toán tử new.

STTMethodsDescription
1char charAt(int index)Trả về một ký tự tại vị trí có chỉ số được chỉ định.
2int compareTo(Object o)So sánh một String với một Object khác.
3int compareTo(String anotherString)So sánh hai chuỗi theo từ điển. (Phân biệt chữ hoa chữ thường)
4int compareToIgnoreCase(String str)So sánh hai chuỗi theo từ điển. (Không phân biệt chữ hoa chữ thường)
5String concat(String str)Nối chuỗi được chỉ định đến cuối của chuỗi này.
6boolean contentEquals(StringBuffer sb)Trả về true nếu và chỉ nếu chuỗi này đại diện cho cùng một chuỗi ký tự như là StringBuffer quy định.
7static String copyValueOf(char[] data)Trả về một chuỗi đại diện cho chuỗi ký tự trong mảng quy định.
8static String copyValueOf(char[] data, int offset, int count)Trả về một chuỗi đại diện cho chuỗi ký tự trong mảng quy định.
9boolean endsWith(String suffix)Kiểm tra nếu chuỗi này kết thúc với hậu tố quy định.
10boolean equals(Object anObject)So sánh với một đối tượng
11boolean equalsIgnoreCase(String anotherString)So sánh với một String khác, không phân biệt chữ hoa chữ thường.
12byte[] getBytes()Mã hóa chuỗi này thành một chuỗi các byte bằng cách sử dụng bảng mã mặc định của flatform (nền tảng), lưu trữ kết quả vào một mảng byte mới.
13byte[] getBytes(String charsetName)Mã hóa chuỗi này thành một chuỗi các byte bằng cách sử dụng bảng mã cho trước, lưu trữ kết quả vào một mảng byte mới.
14void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)Copy các ký tự từ chuỗi này vào mảng ký tự đích. 
15int hashCode()Trả về một mã “hash code” cho chuỗi này.
16int indexOf(int ch)Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của ký tự cụ thể.
17int indexOf(int ch, int fromIndex)Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của ký tự được chỉ định, bắt đầu tìm kiếm từ chỉ số cụ thể đến cuối.
18int indexOf(String str)Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của chuỗi quy định.
19int indexOf(String str, int fromIndex)Trả về chỉ số trong chuỗi này xuất hiện đầu tiên của chuỗi quy định, bắt đầu từ chỉ số xác định.
20String intern()Returns a canonical representation for the string object.
21int lastIndexOf(int ch)Trả về chỉ số trong chuỗi này về sự xuất hiện cuối cùng của ký tự cụ thể.
22int lastIndexOf(int ch, int fromIndex)Trả về chỉ số trong chuỗi này về sự xuất hiện cuối cùng của ký tự được chỉ định, tìm kiếm lùi lại bắt đầu từ chỉ số xác định.
23int lastIndexOf(String str)Trả về chỉ số trong chuỗi này xảy ra cuối cùng bên phải của chuỗi quy định.
24int lastIndexOf(String str, int fromIndex)Trả về chỉ số trong chuỗi này về sự xuất hiện cuối cùng của chuỗi xác định, tìm kiếm lùi lại bắt đầu từ chỉ số xác định.
25int length()Trả về độ dài chuỗi.
26boolean matches(String regex)Kiểm tra chuỗi này khớp với biểu thức chính quy chỉ định hay không.
27boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)Kiểm tra chuỗi có một phần giống nhau.
28boolean regionMatches(int toffset, String other, int ooffset, int len)Kiểm tra chuỗi có một phần giống nhau.
29String replace(char oldChar, char newChar)Trả về một chuỗi mới từ thay thế tất cả các lần xuất hiện của ký tự oldChar trong chuỗi này với ký tự newChar.
30String replaceAll(String regex, String replacement)Thay thế tất cả các chuỗi con của chuỗi này khớp với biểu thức chính quy bởi String mới replacement
31String replaceFirst(String regex, String replacement)Thay thế chuỗi con đầu tiên của chuỗi này khớp với biểu thức chính quy bởi một String mới replacement
32String[] split(String regex)Tách chuỗi này thành các chuỗi con, tại các chỗ khớp với biểu thức chính quy cho trước.
33String[] split(String regex, int limit)Tách chuỗi này thành các chuỗi con, tại các chỗ khớp với biểu thức chính quy cho trước. Tối đa limit chuỗi con.
34boolean startsWith(String prefix)Kiểm tra nếu chuỗi này bắt đầu với tiền tố quy định.
35boolean startsWith(String prefix, int toffset)Kiểm tra nếu chuỗi này bắt đầu với tiền tố quy định bắt đầu một chỉ số xác định.
36CharSequence subSequence(int beginIndex, int endIndex)Trả về một chuỗi ký tự mới là một dãy con của dãy này.
37String substring(int beginIndex)Trả về một chuỗi ký tự mới là một dãy con của dãy này. Từ chỉ số cho trước tới cuối
38String substring(int beginIndex, int endIndex)Trả về một chuỗi ký tự mới là một dãy con của dãy này. Từ chỉ số bắt đầu cho tới chỉ số cuối.
39char[] toCharArray()
 
Chuyển chuỗi này thành mảng ký tự.
40String toLowerCase()
 
Chuyển tất cả các ký tự của chuỗi này sang chữ thường, sử dụng miền địa phương mặc định (default locale)
41String toLowerCase(Locale locale)
 
Chuyển tất cả các ký tự của chuỗi này sang chữ thường, sử dụng miền địa phương (locale) cho trước.
42String toString()Trả về String này.
43String toUpperCase()Chuyển tất cả các ký tự của chuỗi này sang chữ hoa, sử dụng miền địa phương mặc định (default locale)
44String toUpperCase(Locale locale)Chuyển tất cả các ký tự của chuỗi này sang chữ hoa, sử dụng miền địa phương (locale) cho trước.
45String trim()Trả về một String mới, sau khi loại bỏ các ký tự trắng (whitespace) bên trái và bên phải.
46static String valueOf(primitive data type x)Returns the string representation of the passed data type argument.

StringBuffer vs StringBuilder

  • StringBuilder và StringBuffer là khá giống nhau, điều khác biệt là tất cả các phương thức của StringBuffer đã được đồng bộ, nó thích hợp khi bạn làm việc với ứng dụng đa luồng, nhiều luồng có thể truy cập vào một đối tượng StringBuffer cùng lúc. Trong khi đó StringBuilder có các phương thức tương tự nhưng không được đồng bộ, vì vậy mà hiệu suất của nó cao hơn, bạn nên sử dụng StringBuilder trong ứng dụng đơn luồng, hoặc sử dụng như một biến địa phương trong một phương thức.
STTStringBufferStringBuilder
1StringBuffer là đồng bộ (synchronized) tức là luồng an toàn. Điều này có nghĩa là không thể có 2 luồng cùng truy cập phương thức của lớp StringBuffer đồng thời.StringBuilder là không đồng bộ (non-synchronized) tức là luồng không an toàn. Điều này có nghĩa là có 2 luồng cùng truy cập phương thức của lớp StringBuilder đồng thời.
2StringBuffer không hiệu quả bằng StringBuilder.StringBuilder hiệu quả hơn StringBuffer.

Tôi đang kiểm tra ảnh hưởng đến hiệu suất do đồng bộ hóa với chương trình mẫu thực hiện append() trên đối tượng StringBuffer StringBuilder nhiều lần

import java.util.GregorianCalendar; public class TestString { public static void main(String[] args) { System.gc(); long start=new GregorianCalendar().getTimeInMillis(); long startMemory=Runtime.getRuntime().freeMemory(); StringBuffer sb = new StringBuffer(); //StringBuilder sb = new StringBuilder(); for(int i = 0; i<10000000; i++){ sb.append(":").append(i); } long end=new GregorianCalendar().getTimeInMillis(); long endMemory=Runtime.getRuntime().freeMemory(); System.out.println("Time Taken:"+(end-start)); System.out.println("Memory used:"+(startMemory-endMemory)); } }
Code language: JavaScript (javascript)

Tôi cũng chạy code tương tự cho đối tượng StringBuffer để kiểm tra thời gian và giá trị bộ nhớ. Tôi đã thực hiện mã 5 lần cho mỗi trường hợp và sau đó tính toán các giá trị trung bình.

Value of iStringBuffer (Time, Memory)StringBuilder (Time, Memory)
10,00,000808, 149356704633, 149356704
1,00,00,0007448, 1477838886179, 147783888

Rõ ràng là StringBuilder hoạt động tốt hơn StringBuffer ngay cả trong trường hợp môi trường đơn luồng. Sự khác biệt về hiệu suất này có thể do đồng bộ hóa trong các phương thức StringBuffer.

Trên đây là những gì về String, StringBuilderStringBuffer, nếu có thắc mắc gì thì hãy comment nhé.

Happy learning!!!

HỌC JAVA CORE~


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Bài viết liên quan

Leave a Reply

Your email address will not be published.

TÀI LIỆU DEV WORLD
Cẩm nang phát triển bền vững với nghề lập trình!