知识点:
String
-
String 类型表示的是字符串
-
String 类型的声明为final,不可以被继承
-
字符串的String 使用的是 Unicode 进行编码,一个字符占两个字节
-
String实现了Serializable接口和Comparable接口:
- Serializable接口:表示字符串是支持序列化的,说明可以在网络上传输.
- Comparable接口:表示String可以比较大小 (可以使用使用compareTo的方法进行比较)
-
String类内部定义了final char[] value用于存储字符串数据 一定要注意:value是一个final类型,不可以修改:即value不能指向新的地址,但是单个字符内容是可以变化的。
-
String代表不可变的字符序列,简称:不可变性
- 体现:
- 当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 体现:
-
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
-
字符串常量池中是不会存储相同内容的字符串的
总结: String 类型是一个表示字符串的最终类,它表示的是一个不可变的序列,通过将字面量进行赋值时,会从原先的常量池地址间接/直接的指向一个新的常量池地址值.因为它实现了Serializable和Comparable,所以它具备了序列化和比较的功能.
StringBuffer
- StringBuffer 类是可变的字符串类
- 每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了StringBuffer 类对象的容量,则该对象的容量会自动扩大
- 说StringBuffer 线程安全,是因为StringBuffer 的内部对长度添加了线程锁,多个线程中中能有一个线程进行执行.
总结: StringBuffer 是一个线程安全的可变字符串,他的长度在不足的时候会自动扩大.
StringBuilder
- StringBuilder 是可变的字符串序列
- StringBuilder 非线程安全
相关的面试题目:
1. String 类型是基本数据类型吗?
答: java 的基本数据类型有 int short byte long float double boolean char 8种,String类型不属于
2. String类型是可变的吗?
答: String类型是不可变的,他内部的原理是将常量池中的地址值进行修改.
3. 怎么比较两个字符串的值一样,怎么比较两个字符串是否为同一对象?
答: 比较字符串的值是否相同用equals,比较字符串对象是否是同一个使用 ==
4. Switch 中可以使用string吗?
答: 在jdk7之前Switch中是不可以使用String类型的,但是在jdk7以后新加了String类型与枚举.
5. String 、StringBuffer 、StringBuilder 有什么区别?
答: 从效率上讲,因为String的值是不可变的,所以每次对String 对象进行操作都会生成新的String对象,所以String类浪费内存空间效率低下.
因为StringBuffer 是一个可变线程安全的字符串类,所以对比String他的效率较高
因为StringBuilder 也是一个可变的字符串,但是在它的内部没有添加线程锁,所以相对于StringBuffer 类它的效率较高.
所以可以得出结论:StringBuilder > StringBuffer > String
第二点,长度不同,String类型,每次重新赋值的时候会将内部的字符串地址值进行修改,从而直接/间接的指向常量池中的新地址,所以我们可以认为他的长度不可变
StringBuffer 和StringBuilder 的长度都是可变的.
第三点,StringBuffer 和StringBuilder 相比线程是安全的,多个线程中只有一个线程可以进行调用.
6. equals 和 == 的区别是什么?
答:
- 类型不同:
- equals是超类 Object 中的方法,而 == 是比较运算符
- 比较对象不同:
- equals 是用来比较两个对象的值是否相同,比较的是值
- == 用于比较引用和基本数据类型,比较的是地址值
- 运行速度不同
- 因为== 比较的是地址值,所以对标equals那样,从地址值中获取到值然后进行对比运行速度较快.
7. String str = new String("ab" + "c"); 创建了多少个对象,为什么?
答: 创建了两个对象.
首先大家可以清除的看到有关键字 new ,所以这就代表着创建了一个新的对象,开辟了一片新的内存空间.
其次大家可以看到 有 ("ab" + "c"),这里大家会认为这里创建了三个对象,分别为 ab、c、abc,但是大家知道String类的值不可变,所以这里的("ab" + "c"),本质上是将原先的内容从一个常量池中的地址进行了修改,并没有创建新的对象.
所以,结果是创建了两个对象.