String, StringBuilder 및 StringBuffer의 세 가지 클래스 간의 관계와 차이점은 항상 Java에서 고전적인 문제였습니다. 이번에는 이 세 가지 클래스에 대한 지식에 대해 이야기하겠습니다.
문자열: 문자 상수
StringBuilder: 문자 변수
StringBuffer: 문자 변수
String은 상수 유형이며 최종 클래스로 선언되므로 모든 속성도 최종 유형이므로 String 개체가 생성되면 이를 수 없습니다.
두 클래스 StringBuilder / StringBuffer는 변수 유형이며 변경될 수 있습니다. 둘 다 문자열 접합으로 인해 생성되는 중간 객체가 너무 많은 문제를 해결하기 위해 제공되는 클래스입니다. StringBuilder > 제거됨 StringBuffer에는 스레드로부터 안전한 부분이 있으므로 오버헤드가 효과적으로 줄어듭니다. 따라서
2. 문자열의 문자열 처리
String s = "abcd"; s = s + "fgh";
많은 사람들이 이러한 문자열 처리를 수행할 때 String 유형이 가변이라고 잘못 생각합니다.
따라서 첫 번째 s는 변경되지 않고 두 번째 s는 새 객체가 되는 것과 동일합니다
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 = "This is only a";
String str3 = "simple";
String str4 = "test";
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 = "123";
String str1 = str + "456";
String str2 = new StringBuilder().append(str).append("def").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"); }
这段代码同样会按照例一的过程来处理
这两个对象在构造的过程中,首先按照默认大小申请一个字符数组(char[]), 默认容量为 16 个字符,但如果超出,会使用 Arrays.copyOf() 成倍扩容 16,32,64, 128...,当然这样会影响性能,因此可以在创建对象时按照需要自定义其容量
String str1 = "123" + "456" + "789"; String str2 = new StringBuilder("123").append("456").append("789").toString();
我们都知道,进行字符串拼接操作时推荐使用 StringBuilder,但是是不是什么时候都推荐使用 StringBuilder 来代替 String 进行字符串拼接?显然不是的。
在这种情况下,两种处理方式效率差别不大
在 JDK 8 中, String 的字符串拼接操作会被编译器自动转换为 StringBuilder 并调用 append 方法,由于这样的优化方案,使得两个类在这种情况下的处理效率差别不大;而在 JDK 9 中,为了更加统一字符串操作优化,提供了 StringConcatFactory,作为一个统一的入口,更加优化了字符串拼接操作。
这种情况下,StringBuilder 更快
在循环中,每执行一次 “+”,都会创建一个 String 对象,因此会有大量对象创建和回收的消耗。
简单来说,在循环中对同一个字符串对象做字符串拼接,优先选择 StringBuilder
这种情况下,String 更快
我们都知道 String str1 = "123" + "456" + "789";
其实是等同于 String str1 = "123456789";
이 경우 두 처리 방법의 효율성 차이는 거의 없습니다
String str1 = "123" + "456" + "789";
는 실제로 String str1 = "123456789";
와 동일하지만 StringBuilder에서는 추가 메서드를 여러 번 호출해야 합니다. 🎜
위 내용은 String, StringBuilder, StringBuffer를 파악해야 합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!