> Java > java지도 시간 > String, StringBuilder, StringBuffer를 파악해야 합니다.

String, StringBuilder, StringBuffer를 파악해야 합니다.

无忌哥哥
풀어 주다: 2018-07-20 09:37:07
원래의
1311명이 탐색했습니다.

String, StringBuilder 및 StringBuffer의 세 가지 클래스 간의 관계와 차이점은 항상 Java에서 고전적인 문제였습니다. 이번에는 이 세 가지 클래스에 대한 지식에 대해 이야기하겠습니다.

1. 간단한 비교

  • 문자열: 문자 상수

  • StringBuilder: 문자 변수

  • StringBuffer: 문자 변수

String은 상수 유형이며 최종 클래스로 선언되므로 모든 속성도 최종 유형이므로 String 개체가 생성되면 이를 수 없습니다.
두 클래스 StringBuilder / StringBuffer는 변수 유형이며 변경될 수 있습니다. 둘 다 문자열 접합으로 인해 생성되는 중간 객체가 너무 많은 문제를 해결하기 위해 제공되는 클래스입니다. StringBuilder > 제거됨 StringBuffer에는 스레드로부터 안전한 부분이 있으므로 오버헤드가 효과적으로 줄어듭니다. 따라서

StringBuilder는 대부분의 경우 문자열 접합 작업을 위한 첫 번째 선택입니다.
  • 2. 문자열의 문자열 처리

  • 예 1:
  • String s = "abcd";
    s = s + "fgh";
    로그인 후 복사

    많은 사람들이 이러한 문자열 처리를 수행할 때 String 유형이 가변이라고 잘못 생각합니다.

  • 그러나 실제로 JVM이 이 코드를 처리하는 과정은 다음과 같습니다. 먼저 s 객체를 생성하고 "abcd" 값을 할당한 다음 두 번째 코드 줄을 처리할 때 또 다른 s 객체를 생성하고 "abcdfgh" 값을 할당합니다. "를 선택한 다음 첫 번째 개체 가비지 수집을 추가합니다.
  • 따라서 첫 번째 s는 변경되지 않고 두 번째 s는 새 객체가 되는 것과 동일합니다

  • 예 2:
String str = “This is only a” + “simple” + “test”;
로그인 후 복사

이 코드는 String str = “This is only a simple test”;< /code와 같습니다. ><strong></strong>예제 3:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">String str2 = &quot;This is only a&quot;; String str3 = &quot;simple&quot;; String str4 = &quot;test&quot;; String str1 = str2 +str3 + str4;</pre><div class="contentsignin">로그인 후 복사</div></div><h1>이 코드도 예 1</h1><h3>Three의 프로세스에 따라 처리됩니다. StringBuilder / StringBuffer 구성 특성</h3><p>이 두 개체의 구성 과정에서 먼저 기본값에 따라 하나를 적용합니다. size 문자 배열(char[]), 기본 용량은 16자이지만 이를 초과하는 경우 Arrays.copyOf()를 사용하여 용량을 16, 32, 64, 128...로 두 배로 늘립니다. 물론 이는 영향을 미칩니다. </p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">//默认 16 个字符 public StringBuilder() { super(16); } //构造函数定义容量 public StringBuilder(int capacity) { super(capacity); }</pre><div class="contentsignin">로그인 후 복사</div></div><p> 4. 문자열 접합 처리 시 String과 StringBuilder 비교</p><p>우리 모두는 문자열 접합 작업에 StringBuilder가 권장된다는 것을 알고 있지만 항상 사용하는 것이 좋습니다. 문자열 대신 StringBuilder? 분명히 그렇지 않습니다. </p><h3>예제 1: </h3><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">String str = &quot;123&quot;; String str1 = str + &quot;456&quot;; String str2 = new StringBuilder().append(str).append(&quot;def&quot;).toString();</pre><div class="contentsignin">로그인 후 복사</div></div><p><code>String str = “This is only a simple test”;

例三:

String str = "";
for (int i = 0; i < 1000; i++) {
    str += "12345";
}

StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    stringBuilder.append("12345");
}
로그인 후 복사

这段代码同样会按照例一的过程来处理

三. StringBuilder / StringBuffer 构造特性

这两个对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128...,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量

String str1 = "123" + "456" + "789";

String str2 = new StringBuilder("123").append("456").append("789").toString();
로그인 후 복사

四. String 与 StringBuilder 处理字符串拼接对比

我们都知道,进行字符串拼接操作时推荐使用 StringBuilder,但是是不是什么时候都推荐使用 StringBuilder 来代替 String 进行字符串拼接?显然不是的。

例一:

rrreee

在这种情况下,两种处理方式效率差别不大

JDK 8 中, String 的字符串拼接操作会被编译器自动转换为 StringBuilder 并调用 append 方法,由于这样的优化方案,使得两个类在这种情况下的处理效率差别不大;而在 JDK 9 中,为了更加统一字符串操作优化,提供了 StringConcatFactory,作为一个统一的入口,更加优化了字符串拼接操作。

例二:

rrreee

这种情况下,StringBuilder 更快

在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗。

简单来说,在循环中对同一个字符串对象做字符串拼接,优先选择 StringBuilder

例三

rrreee

这种情况下,String 更快

我们都知道 String str1 = "123" + "456" + "789"; 其实是等同于 String str1 = "123456789";이 경우 두 처리 방법의 효율성 차이는 거의 없습니다

🎜🎜🎜JDK 8🎜에서는 String의 문자열 접합 작업이 컴파일러에 의해 자동으로 StringBuilder로 변환되어 추가됩니다. 이러한 최적화 체계로 인해 이 경우 두 클래스의 처리 효율성에는 거의 차이가 없습니다. 🎜JDK 9🎜에서는 문자열 작업을 보다 균일하게 최적화하기 위해 StringConcatFactory가 통합 입구로 제공됩니다. . 문자열 연결 작업이 더욱 최적화되었습니다. 🎜🎜예제 2: 🎜rrreee🎜🎜이 경우 StringBuilder가 더 빠릅니다🎜🎜🎜루프에서 "+"가 실행될 때마다 String 개체가 생성되므로 개체 생성 및 소비가 많이 발생합니다. 재활용. 🎜🎜간단히 말하면, 🎜loop🎜에서 동일한 문자열 객체를 연결할 때 StringBuilder가 선호됩니다🎜

예제 3

rrreee🎜🎜이 경우 String이 더 빠릅니다🎜🎜🎜us 우리 모두는 String str1 = "123" + "456" + "789";는 실제로 String str1 = "123456789";와 동일하지만 StringBuilder에서는 추가 메서드를 여러 번 호출해야 합니다. 🎜

위 내용은 String, StringBuilder, StringBuffer를 파악해야 합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿