(1) 字符串的内容永不可改变
因为在 String类 中, value 的修饰符为 final
(2) 所有双引号包起来的字符串,都是 String类 的对象
(3) 由于 String 不可改变,所以字符串可共享使用
字符串常量池:
直接用双引号写的字符串在字符串常量池中
但是用 new String(byte[] / char[]) 的字符串不在字符串常量池中。是新建的一个对象
字符串比较:
对于基本类型来说,== 比较数值
对于引用类型来说,== 比较地址
Demo:
1 | String x1 = "abc"; |
字符串拼接
由于在 String类 中,value的修饰符是 final。所以每个字符串都像个常量不可改变。
所以在 java 中进行字符串拼接,尤其是多个字符串拼接在一起时,就会产生效率的问题:
Demo:
1 | String x = "a"+"b"+"c"; |
在这一段代码中, Java 的执行流程为
- 在内存中存放三个字符串: a, b, c
- 拼接 a 和 b。在内存中存放新字符串 ab
- 拼接 ab 和 c。在内存中存放新字符串 abc
这样子的拼接方式效率就很低了。并且造成许多内存空间的浪费
Java中有两个类 StringBuilder 和 StringBuffer ,顾名思义,它们是作为字符串操作的缓冲。
其中 StringBuilder 是非线程安全。StringBuffer 是线程安全的
Demo:
1 | StringBuilder x3 = new StringBuffer(); |
比较下效率:
1 | String x1 = null; |
字符串转换
基本类型 转 字符串。最简单的方式:
1 | 基本类型 + "" |
字符串转基本类型:
1 | Integer.parseInt("123"); |