String
- 在Java文档中,String类型称为
不可变字符串
。
String greeting = "help";
字符串包含h,e,l,p代码单元序列,不能修改其中的任何一个字符,但是可以修改字符串变量greeting,让它引用另外一个字符串,也就是将指向(这里不用存放,而用指向)help的变量greeting改成指向other,此时help就是无用对象,改变指向是繁重的操作,并在 堆
中产生大量垃圾,JVM 的 GC 将会回收。
- String创建原理
当我们使用双引号创建
一个字符串时,它首先在JVM字符串池中查找具有相同值的字符串,如果发现它返回引用,则它会创建String对象,然后将其放入 字符串池 中。通过这种方式,JVM通过在不同线程中使用相同的字符串来节省大量空间。
- 其他
- +运算符重载为String并用于连接两个字符串,它在内部使用StringBuffer来执行此操作。
- 字符串表示UTF-16格式的字符串
String,StringBuffer, StringBuilder的比较
类型 | 描述 | 差异 | 线程 | 适用于 |
---|---|---|---|---|
String | 拼接速率较慢 | 字符串- 常量 | 字符串不会更改 | |
StringBuffer | 拼接速率中等 | 字符串- 变量 | 线程安全 | 字符串可以改变,多个线程访问 |
StringBuilder | 拼接速率较快,JDK5.0 引入 | 字符串- 变量 | 非线程安全 | 字符串可以改变,单个线程访问 |
如果将常量字符串拼接,那么在编译之初就会将字符串组装好,此时String速率比StringBuffer和StringBuilder都要快。
String abc = “How” + “old” + “are” + “you”;
此种形式中,编译之前,会默认将这些 final
常量拼装成新的 final
常量,也就是说 .class文件
中不会有how, old, are, you这几个字符串的出现,速度最快。