- vừa được xem lúc

String, StringBuffer và StringBuilder trong java

0 0 7

Người đăng: Do Khanh Toan

Theo Viblo Asia

1.Quan Hệ Thừa Kế

  • Khi làm việc với dữ liệu kiểu text trong Java cung cấp 3 class String, StringBuffer và StringBuilder.
  • Cơ bản về 3 class này như sau:
  • String là không thể thay đổi (immutable), và không cho phép có class con.
  • StringBuffer, StringBuilder 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). => về tốc độ xử lý StringBuilder là tốt nhất, sau đó StringBuffer và cuối cùng mới là String.

2.String

  • 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.
    String object = new String("Hello World");
    
  • Các đối tượng String được lưu trữ trên Heap, yêu cầu quản lý bộ nhớ phức tạp và tốn không gian lưu trữ. Hai đối tượng String có nội dung giống nhau lưu trữ trên 2 vùng bộ nhớ khác nhau của Heap.

Phương thức Equals vs ==

Phương thức equals() sử dụng để so sánh 2 đối tượng, với String nó có ý nghĩa là so sánh nội dung của 2 string. Đối với các kiểu tham chiếu (reference) toán tử == có ý nghĩa là so sánh địa chỉ vùng bộ nhớ lưu trữ của đối tượng.

  • Ví dụ:
String s1 = "Hello";
String s2 = "Hello"; String s3 = s1; String s4 = new String("Hello"); String s5 = new String("Hello"); s1 == s1; // true
s1 == s2; // true
s1 == s3; // true
s1 == s4; // false
s4 == s5; // false s1.equals(s3); // true, cùng nội dung
s1.equals(s4); // true, cùng nội dung
s4.equals(s5); // true, cùng nội dung.

Các phương thức của String

STT Methods Description
1 char charAt(int index) Trả về một ký tự tại vị trí có chỉ số được chỉ định.
2 int compareTo(Object o) So sánh một String với một Object khác.
3 int compareToIgnoreCase(String str)) So sánh hai chuỗi .
4 String concat(String str) Nối chuỗi
5 static String copyValueOf(char[] data) Trả về một chuỗi đại diện cho chuỗi ký tự trong mảng quy định.
6 boolean equals(Object anObject) So sánh với một đối tượng
7 int 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ể.
8 int 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..
9 int length() Trả về độ dài chuỗi.
10 String[] 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.
11 String substring(int beginIndex) TTrả 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
12 static String valueOf(primitive data type x) Returns the string representation of the passed data type argument.

Trên đây là 1 số phương thức hay dùng khi làm việc với String. Chi tiết xin xem tại: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

3.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.
STT StringBuffer StringBuilder
1 StringBuffer 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.
2 StringBuffer không hiệu quả bằng StringBuilder. StringBuilder hiệu quả hơn StringBuffer.
  • Ví dụ về StringBufer:
public class BufferString { public static void main(String[] args) { StringBuffer buffer = new StringBuffer("Hello"); buffer.append("Word"); System.out.println(buffer); }
}
  • Ví dụ về StringBuider:
public class BuiderString { public static void main(String[] args) { StringBuffer buider = new StringBuffer("Hello"); buffer.append("Word"); System.out.println(buider); }
}

=> Cả 2 đều cho ra output là : HelloWord. Nhưng về tốc độ xử lý, chúng ta hãy đoạn code sau:

public class TestPerform{ public static void main(String[] args){ long startTime = System.currentTimeMillis(); StringBuffer buffer = new StringBuffer("Hello"); for (int i=0; i<100000; i++){ buffer.append("Word"); } System.out.println("StringBuffer is: " + (System.currentTimeMillis() - startTime) + "ms"); startTime = System.currentTimeMillis(); StringBuilder buider = new StringBuilder("Hello"); for (int i=0; i<100000; i++){ buider.append("Word"); } System.out.println("StringBuilder is: " + (System.currentTimeMillis() - startTime) + "ms"); } } 

=> Out put: StringBuffer is: 11ms StringBuilder is: 5ms Từ đó t có thể có nhận xét về tốc độ khi xử lý chuỗi của StringBuider sẽ nhanh hơn StringBuffer!

4. Lời kết.

Trên đây chúng ta có thể hiểu rõ hơn về String, StringBuider, StringBuffer. Tùy từng trường hợp mà ta có các cách sử dụng khác nhau sao cho phù hợp và để đảm bảo hiệu suất tốt nhất!..Thanks

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 528

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 408

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 772

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 368

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 460

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 436