2012-06-30 21 views
12

thể trùng lặp:
String, StringBuffer, and StringBuilderNơi để sử dụng StringBuffer/StringBuilder hơn Chuỗi

Chúng ta biết rằng String là không thay đổi nơi StringBuffer/StringBuilder là có thể thay đổi. Nhưng đôi khi chúng ta bị lẫn lộn những gì cần sử dụng trong mã của chúng tôi .. Chuỗi hoặc StringBuffer/StringBuilder ?? Thực tế trong mã tối đa/mã nhanh của chúng tôi, chúng tôi sử dụng để thích String hơn StringBuffer/StringBuilder.

Câu hỏi này là để giải quyết sự nhầm lẫn, nếu bạn có bất kỳ ý tưởng nào & lý do chính đáng cho điều đó, thì vui lòng trả lời.

+0

Có liên kết này hữu ích. –

Trả lời

25

Dưới đây là sự khác biệt chính giữa ba lớp được sử dụng phổ biến nhất này.

  • Đối tượng lớp chuỗi không thay đổi trong khi StringBuffer và Đối tượng StringBuilder có thể thay đổi.
  • StringBuffer được đồng bộ hóa trong khi StringBuilder không được đồng bộ hóa.
  • Toán tử ghép nối "+" được triển khai nội bộ bằng cách sử dụng StringBuffer hoặc StringBuilder.

Tiêu chuẩn lựa chọn giữa Chuỗi, StringBufferStringBuilder

  • Nếu giá trị đối tượng sẽ không thay đổi sử dụng Chuỗi lớp vì một đối tượng String là không thay đổi.
  • Nếu giá trị đối tượng có thể thay đổi và sẽ chỉ được truy cập từ một chuỗi đơn , hãy sử dụng StringBuilder vì StringBuilder là không đồng bộ.
  • Trong trường hợp giá trị đối tượng có thể thay đổi và sẽ được sửa đổi theo nhiều chủ đề , hãy sử dụng StringBuffer vì StringBuffer được đồng bộ hóa.
+1

** Ans của bạn rất hữu ích **, nhưng thực sự chúng tôi làm theo điều này ?? Tôi nghĩ rằng ans là ** NO ** –

1

StringBuffers an toàn theo luồng, có nghĩa là chúng có phương pháp đồng bộ để kiểm soát quyền truy cập để chỉ một chuỗi có thể truy cập mã đồng bộ của đối tượng StringBuffer tại một thời điểm. Vì vậy, các đối tượng StringBuffer nói chung là an toàn để sử dụng trong môi trường đa luồng.

Chuỗi Quyền truy cập của người xây dựng không được đồng bộ hóa để không an toàn chỉ. Bằng cách không được đồng bộ, hiệu suất của StringBuilder có thể tốt hơn StringBuffer. Vì vậy, nếu bạn đang làm việc trong một môi trường đơn luồng, việc sử dụng StringBuilder thay vì StringBuffer có thể dẫn đến hiệu suất tăng lên.

+2

Lưu ý rằng rất, rất hiếm khi hai luồng sẽ sử dụng cùng một StringBuffer/StringBuilder. Không bao giờ trải nghiệm điều đó. –

+0

Đúng :) Tôi đồng ý và cảm ơn vì đã chỉ ra nó :) – verisimilitude

3

Ý tưởng chính là Chuỗi không thay đổi được. Vì vậy, khi bạn đang cố gắng sửa đổi nó, đối tượng mới được tạo ra. StringBuffer và StringBuilder có thể thay đổi. Và sự khác biệt là cái đầu tiên là an toàn chỉ.

Cách tiếp cận chung để sử dụng StringBuilder là phân tích cú pháp thứ gì đó khi bạn lặp lại tạo đối tượng String trong môi trường an toàn luồng NON. Ví dụ: bạn có một mảng số [1, 2, 3]. Để tạo đối tượng "String1String2String3" bạn có thể sử dụng một StringBuilder

StringBuilder builder = new StringBuilder(); 
foreach(Integer num : array) { 
    builder.append("String").append(num); 
} 
builder.toString(); 

Đó là tốt hơn so với chỉ sử dụng String string = string + ("String" + num);. AFAIK, trình biên dịch sẽ tối ưu hóa việc sử dụng chuỗi nối trong vòng lặp tới StringBuilder, nhưng tốt hơn nên sử dụng nó theo cách thủ công.

StringBuffer được sử dụng khi bạn đã chia sẻ các trạng thái, được sửa đổi bởi các chuỗi đồng thời.

Các vấn đề liên quan