String
1、String的定义
String是Java中的字符串关键字,用来声明一个字符串变量
2、String在Java中的实现
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
String在Java中被定义为final类型的,即不可修改,不可被继承、方法不能被重写、属性不能被修改,因此对String类型的操作,如拼接、截取、赋值等,都会在常量池
中创建一个新的字符串对象,并将变量指向新的对象
StringBuilder和StringBuffer
1、StringBuilder和StringBuffer的继承和实现
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
StringBuilder和StringBuffer的继承类和实现类都一样,都继承自AbstractStringBuilder类
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
AbstractStringBuilder中定义的变量value是一个可以修改的字符数组,这表示通过StringBuilder和StringBuffer定义的字符串发生修改时,不会创建新的对象。
2、StringBuffer和StringBuilder的区别
StringBuffer和StriStringBuilder的实现是相同的,但是StringBuffer是线程安全的,StringBuilder是非线程安全的。StringBuffer中的许多方法都被关键字synchronized修饰,这保证了这些方法是线程安全的,而StringBuilder中的方法没有被synchronized关键字修饰,因此StringBuffer的速度慢于StringBuilder,开销大于StringBuilder,但是在多线程中,只能使用StringBuffer。
String、StringBuilder、StringBuffer的比较
1、开销和执行速度
StringBuilder > StringBuffer > String
String是不可修改的,因此每次对String进行操作,都会产生新的字符串对象,开销最大,StringBuffer是线程安全的,相较于非线程安全的StringBuilder,开销和执行速度都较差
通过toString方法打印类的地址
Java的每个类从根本上都是继承自Object,Object类中定义了toString方法,当一个容器类想要通过toString打印自己的地址时,可以通过调用super.toString()打印
import java.util.ArrayList;
import java.util.List;
public class InfiniteRecursion {
public String toString() {
return "InfiniteRecursion address : " + super.toString();
}
public static void main(String[] args) {
InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
System.out.println(infiniteRecursion);
}
}
执行结果如下
InfiniteRecursion address : com.myProject.InfiniteRecursion@677327b6
若将super.toString()改为this关键字,则发生栈溢出错误
Exception in thread "main" java.lang.StackOverflowError
是因为在执行"InfiniteRecursion address : " + this
时发生自动类型转换,将InfiniteRecursion类型转换为String类型,此时会调用toString()方法,导致了无尽的递归调用