String.intern()
方法有以下行为:
- 如果字符串常量池中已经存在该字符串,则返回字符串·常量池中的引用。
- 如果字符串常量池中不存在该字符串,则将该字符串添加到字符串常量池中,并返回字符串常量池中的引用。
String a = "xy";
String b = "xc";
String c = "xyxc";
String d = a+b; //变量相加 看的是堆空间
System.out.println(c==d); //F
String e = "xy"+"xc"; //常量相加 看的是池
System.out.println(c==e); //T
String、StringBuilder和StringBuffer是Java中用于处理字符串的类,它们在性能、线程安全性以及可变性方面有所不同。
String类:
- 不可变性:String对象是不可变的,一旦创建就不能被修改。对String对象进行拼接、替换等操作时会创建新的String对象。
- 线程安全:由于String的不可变性,它是线程安全的,多个线程可以同时访问同一个String对象。
- 适用场景:适用于需要频繁读取字符串而很少修改的场景,比如字符串常量、数据库操作等。
StringBuilder类:
- 可变性:StringBuilder是可变的,可以进行增删改操作,而且不会创建新的对象。
- 非线程安全:StringBuilder不是线程安全的,不适合在多线程环境下使用。如果需要在多线程环境下使用可变字符串,应该使用StringBuffer。
- 高效性:由于StringBuilder的可变性,它执行字符串操作的速度比String要快。
- 适用场景:适用于单线程环境下需要频繁进行字符串拼接、插入和删除操作的场景。
StringBuffer类:
- 可变性:StringBuffer也是可变的,可以进行增删改操作,与StringBuilder相似。
- 线程安全:与StringBuilder不同的是,StringBuffer是线程安全的,适合在多线程环境下使用。
- 性能相对较低:相对于StringBuilder,StringBuffer的性能稍低,因为它需要保证线程安全,所以在单线程环境下通常建议使用StringBuilder。
- 适用场景:适用于多线程环境下需要频繁进行字符串拼接、插入和删除操作的场景。
总结:
- 如果字符串是不变的,并且多线程环境下使用,应使用String。
- 如果字符串是可变的,并且在单线程环境下使用,应优先使用StringBuilder。
- 如果字符串是可变的,并且需要在多线程环境下使用,应使用StringBuffer。
Java中的String类提供了许多常用的方法来操作和处理字符串。以下是一些常见的String类方法:
- length():返回字符串的长度。
- charAt(int index):返回指定索引位置上的字符。
- substring(int beginIndex, int endIndex):返回一个新的字符串,包含原始字符串中指定索引范围内的字符。
- concat(String str):将指定的字符串连接到原始字符串的末尾。
- equals(Object obj):比较字符串与给定对象是否相等。
- compareTo(String anotherString):按字典顺序比较两个字符串。
- toLowerCase() / toUpperCase():将字符串转换为小写/大写形式。
- trim():去除字符串中的前导和尾部空格。
- indexOf(String str):返回指定字符串在原始字符串中第一次出现的位置索引。
- replace(char oldChar, char newChar):将字符串中所有出现的指定字符替换为新的字符。
- split(String regex):将字符串拆分成子字符串数组,使用给定的正则表达式。
- startsWith(String prefix) / endsWith(String suffix):检查字符串是否以指定的前缀/后缀开始或结束。
- contains(CharSequence sequence):检查字符串是否包含指定的字符序列。
- format(String format, Object... args):使用指定的格式字符串和参数创建一个新字符串。
- isEmpty():检查字符串是否为空。