本人知识复盘系列的博客并非全部原创,大部分摘自网络,只是为了记录在自己的博客方便查阅,往后也会陆续在本篇博客更新本人查阅到的新的知识点,望悉知!
String类
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串
String str = "bejav";
String str = new String("bejav");
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上
这里有一个点需要注意:String str = “bejav” 创建了多少个对象? 而 String str = new String(“bejav”) 又创建了多少个对象?
- String str = “bejav” 创建了0个或1个对象,因为这是存储在公共常量池中,如果常量池中有bejav,就不用创建对象,如果没有就创建
- String str = new String(“bejav”) 是存储在堆上,所以这里首先就需要在堆中创建一个对象,然后再从公共常量池中寻找bejav,如果没有就还要再创建一个对象
String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串
String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了
字符串长度
用于获取有关对象的信息的方法称为访问器方法
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数
连接字符串
String类提供了连接两个字符串的方法:
string1.concat(string2);
"我的名字是".concat("bejav");
更常用的是使用 + 操作符来连接字符串
String方法-看API
https://www.runoob.com/manual/jdk11api/java.base/java/lang/String.html
常见面试题
String为什么是不可变字符串?但是我们在实际应用中String是可以被改变的,是为什么
不可变字符串主要是:
- 保存字符串的数组被
final
修饰并且是私有的,并且 String 类没有提供和暴露修改这个字符串的方法- String 类被
final
修饰不能被子类继承,进而避免了子类破坏String
不可变实际中可变的原因是:
- 其实并不是改变 String ,是新创建了一个 String 对象指向改变后的值,原本的 String 成为副本字符串对象存留在内存中。
String str = new String(“abc”) 和 String str = “abc” 两者的区别在哪里?
String str = new String(“abc”) :
- 不管字符串常量池中存不存在 “abc” ,直接就创建直接新建一个字符串 “abc” (注意新建的字符串 “abc” 不是在字符串常量池中,而是在堆中),然后将其赋给str。这种效率低于使用字符串常量池的方式。
String str = “abc” :
- 首先查看字符串常量池中是否存在字符串 “abc” ,如果存在则直接将“abc”赋给str,如果不存在则先在字符串常量池中新建一个字符串 “abc” ,然后再将其赋给str。
String中 + 和 StringBuffer中的append性能上有什么区别?
+:
每次对 String 类型进行 “+” 的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。所以经常改变内容的字符串最好不要用 String 的 “+” 。因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
append:
使用 StringBuffer 类的 append 方法时每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。
需要线程安全使用
StringBuilder
StringBuffer、StringBuilder
介绍
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
StringBuffer方法
以下是StringBuffer类支持的主要方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOam0zYK-1671692616902)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20221221153809908.png)]
还有其他常用的方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VMoidke-1671692616903)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20221221153906648.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdVYrj5i-1671692616903)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20221221153917046.png)]
更多的StringBuffer类的介绍:https://www.runoob.com/manual/jdk11api/java.base/java/lang/StringBuffer.html
StringBuilder类:https://www.runoob.com/manual/jdk11api/java.base/java/lang/StringBuilder.html