StringBuffer 和StringBuilder区别:
StringBuffer和StringBuilder都继承自抽象类AbstractStringBuilder。
StringBuffer是线程安全的。 StringBuilder是非线程安全的,在单线程使用是,速度更快。
String.intern()方法在StringBuffer上的不同表现:以下代码在JDK1.8版本下测试
System.out.println("*********START TO TEST***********"); String a1 = "abcdafds"; System.out.println("1:" + (a1 == a1.intern()));//true; 直接创建的字符串,保存在常量池中,返回true; String a2 = new String("abcdafds"); System.out.println("2:" + (a2 == a2.intern()));//false;通过new创建的字符串,保存在堆中,而该字符串之前已经创建,intern方法指向之前的对象,因此返回false; String a21 = new String("xyz"); System.out.println("21:" + (a21 == a21.intern()));//false;通过new创建的字符串,保存在堆中,而该字符串之前不存在,则把该字符串添加进常量池中,并返回指向该字符串的对象,因此返回false; String a22 = "xyz"; System.out.println("22:" + (a22 == a21.intern()));//true;直接创建的字符串,该字符串之前在常量池中存在,则直接指向该对象,因此返回true; String a3 = new StringBuffer("abcdafds").toString(); System.out.println("3:" + (a3 == a1.intern()));//false; 通过StringBuffer创建的字符串,保存在堆中,而由于常量池中已有该字符串,则返回false; String a31 = new StringBuffer("xab").toString(); System.out.println("4:" + (a31 == a31.intern()));//false;通过StringBuffer创建的字符串,保存在堆中,则返回false; String a4 = new StringBuffer("abcdafds").append("").toString(); System.out.println("5:" + (a4 == a1.intern()));//false;通过StringBuffer创建,并包含一个append的字符串,如果该完整字符串之前已经创建 ,则保存在堆中,而由于常量池中已有该字符串,则返回false; String a5 = new StringBuffer("abcd").append("afds").toString(); System.out.println("6:" + (a5 == a5.intern()));//false;通过StringBuffer创建,并包含一个append的字符串,如果该完整字符串之前已经创建 ,则保存在堆中,而由于常量池中已有该字符串,则返回false; String a6 = new StringBuffer("aaxx").append("bbfda").toString(); System.out.println("7:" + (a6 == a6.intern()));//true;通过StringBuffer创建,并包含一个append的字符串,如果该完整字符串之前不存在,则保存在堆中,调用intern方法后,常量池中添加一个指向堆中对象的引用,因此返回true; String a62 = new StringBuffer("ayyx").append("").toString(); System.out.println("8:" + (a62 == a62.intern()));//false;通过StringBuffer创建,并包含一个append为""的字符串,则保存在堆中,调用intern方法后,把该字符串添加进常量池中,因此返回false; String a63 = new StringBuffer("ayx").append("bz").append("xdsd").toString(); System.out.println("9:" + (a63 == a63.intern()));//true;通过StringBuffer创建,并包含二个append的字符串,如果该完整字符串之前不存在,则保存在堆中,调用intern方法后,常量池中添加一个指向堆中对象的引用,则返回true; String a64 = new StringBuffer("ayxbzxdsd").toString(); System.out.println("10:" + (a64 == a64.intern()));//false;通过StringBuffer创建,保存在堆中,因为该字符串的引用已经存在,因此返回false; String a65 = new StringBuffer("ayxb").append("zxdsd").toString(); System.out.println("11:" + (a65 == a65.intern()));//false;通过StringBuffer创建,保存在堆中,因为该字符串的引用已经存在,则返回false; System.out.println("112:" + (a64 == a65)); String a66 = new StringBuffer("ayb").append("xdsd").toString(); System.out.println("12:" + (a66 == a66.intern()));//true;通过StringBuffer创建,如果该完整字符串之前不存在,则保存在堆中,调用intern方法后,常量池中添加一个指向堆中对象的引用,则返回true; String a67 = new StringBuffer("ay").append("bxdsd").toString(); System.out.println("13:" + (a67 == a67.intern()));//false;通过StringBuffer创建,如果在堆中,因为该字符串的引用已经存在,则返回false; String a68 = new StringBuffer("ayb").append("xdsd").toString(); System.out.println("14:" + (a68 == a68.intern()));//false;通过StringBuffer创建,保存在堆中,因为该字符串的引用已经存在,则返回false; String a7 = new StringBuffer("ancddaf").toString(); System.out.println("15:" + (a7 == a7.intern()));//false;通过StringBuffer创建,不包含append的字符串,则保存在堆中,调用intern方法后,把该字符串添加进常量池中,返回false; String a8 = new StringBuffer("ancddaf").append("").toString(); System.out.println("ancddaf" == a8.intern());//true,常量池中已包含该字符串,则返回true;
针对StringBuffer的特殊表现,总结如下:
1,当使用StringBuffer创建字符串时,如果不包含append方法,或者包含的append方法字符串为"", 则该StringBuffer对象与String对象的表现一致,即: StringBuffer对象保存在堆中,并且在常量池中复制一份该字符串,与堆中的字符串不是同一对象。
2,当使用StringBuffer创建字符串,并且包含一个或多个append方法时,即:StringBuffer对象保存在堆中,在常量池中保存一份对该对象的引用。因此调用intern方法时,发现指向的是同一个对象。
相关推荐
字符串字面量和`String.intern()`方法都涉及到字符串池的概念。 本压缩包的“Chapter15”可能涵盖了以上部分或全部知识点,包括实例演示、上机练习参考答案和课后作业参考答案,为学习者提供了实践和巩固所学的宝贵...
在Java编程语言中,`String`和`StringBuffer`是两个非常重要的类,它们都用于表示文本字符串。然而,它们之间存在着本质的区别,这主要体现在它们的可变性、性能和使用场景上。 首先,`String`类是不可变的,意味着...
在Java编程语言中,`String`、`StringBuilder`和`StringBuffer`是处理字符串的三种主要类型,它们各自具有不同的特性和使用场景。下面将详细解释它们之间的主要区别。 首先,`String`类是最基本的字符串类型,它...
应优先考虑使用`StringBuilder`或`StringBuffer`(多线程环境)来累积字符串,它们提供了append方法,避免了不必要的内存开销。 3. **预定义常量**:对于重复使用的字符串,可以声明为静态常量,这样它们只会在类加载...
4. **String与StringBuilder/StringBuffer的区别**:比较在多线程环境下,何时使用StringBuilder/StringBuffer以提高性能。 5. **字符串常量池**:介绍Java内存模型中的字符串常量池,以及它的作用和工作原理。 6....
`StringBuilder`和`StringBuffer`都提供了`append()`方法来添加字符串。其中,`StringBuilder`是非线程安全的,适用于单线程环境;`StringBuffer`是线程安全的,适用于多线程环境。 #### 三、字符串的比较 **3.1 ...
可以使用new StringBuilder(String)方法将Java字符串转换为StringBuilder。 24. 如何检查Java字符串是否为空? 可以使用isEmpty()方法检查Java字符串是否为空。 25. 对于以下代码,创建了多少个对象? String s1...
3. **优化建议**:在进行大量字符串拼接时,应优先考虑使用`StringBuilder`或`StringBuffer`,避免频繁创建新对象,提高效率。 **StringTable的垃圾回收** 1. **G1中的去重操作**:G1垃圾收集器在处理StringTable...
4. 使用String.intern():这个方法会将字符串对象引用指向字符串常量池中的版本,如果池中已经存在该字符串,则返回池中的引用。例如,`String str = new String("test").intern();` 这样可以确保str引用的是池中的...
- `StringBuilder`和`StringBuffer`类提供了更高效的字符串连接方式,特别是在循环中。 4. **比较字符串**: - `==`比较的是对象引用,而`equals()`方法比较的是字符串内容。 - `compareTo()`和`...
`String`类的`intern()`方法用于获取常量池中的字符串引用。如果常量池中已存在该字符串,则返回其引用;否则,将字符串添加到常量池并返回引用。例如: ```java String str4 = new String("Hello").intern(); //...
总的来说,`String`类是Java开发中不可或缺的一部分,理解和掌握其特性和方法对于编写高质量的代码至关重要。通过深入研究源码,我们能更深入地理解Java内存管理以及如何优化字符串操作。在日常开发中,应充分利用`...
3. **String、StringBuffer和StringBuilder的区别是什么?** String是不可变的,适合不需修改的情况。而StringBuffer和StringBuilder都是可变的,它们提供线程安全(StringBuffer)和非线程安全(StringBuilder)的...
String对象的不可变性、拼接效率、常量池、intern()方法等都是面试官喜欢提问的重点。以下是对这十个经典Java String面试题的详细解答: 1. **String对象的创建** - 当使用`new`关键字创建String对象时,会在堆...
在给出的代码片段中,通过不同的方式创建了多个`String`对象,并进行了相等性的比较,还测试了字符串拼接的不同方法(包括直接拼接、使用`StringBuffer`等)的执行效率。 #### 字符串创建与比较 1. **字符串常量池...
总之,Java中的`String`对象不仅是一个简单的文本表示,它涉及到内存管理、常量池、不可变性和方法如`intern()`等,这些都是理解和使用`String`时需要深入理解的关键点。了解这些知识点有助于编写更高效、更易于维护...
对于大量拼接,建议使用`StringBuilder`或`StringBuffer`类。 5. **字符串与字符数组的转换** - `toCharArray()`:将字符串转换为字符数组。 - `String(char[] array)`:将字符数组转换为字符串。 6. **常量池**...
- **字符串拼接**:在进行字符串拼接时,如果是在循环中拼接字符串,应该使用`StringBuilder`(JDK 1.5及以上版本)或`StringBuffer`(线程安全),而不是使用`+`操作符,因为后者会导致频繁的对象创建和垃圾回收。...
5. **常量池**:Java虚拟机维护了一个字符串常量池,用于存储所有字符串字面值和被`intern()`方法引用的字符串。理解常量池的工作原理能帮助优化代码性能。 6. **编码与解码**:在Windows CE这样的嵌入式系统中,...
`CharSequence`是一个接口,代表字符序列,String、StringBuffer和StringBuilder都是它的实现者,这意味着可以使用这些类来处理字符序列。 `String`类提供了大量方法来操作字符串,例如: 1. `compare()`:比较两个...