String类
String用于保存字符串,也就是一组字符序列
字符串本质是char数组
char数组的地址不可修改
字符串的内容是不可变的,一旦被分配,内容是不可变的
String的两种创建方式
-
直接赋值
JVM内存布局
-
在栈的方法中声明一个s1
-
在方法区的常量池中查找,有没有"hhh";
如果有"hhh",那么s1指向"hhh"的地址
如果没有,就在常量池中创建"hhh",并且将s1指向"hhh"的地址
-
String s1 = "hhhh";
-
创建对象赋值
JVM内存布局
-
在栈的方法中声明一个s2
-
在堆中创建一个字符串对象
-
栈中s2指向该对象的地址
-
在方法区的常量池中查找,有没有"xxx";
如果有"xxx",那么该对象的value指向"xxx"的地址
如果没有,就在常量池中创建"xxx",并且将该对象的value指向"xxx"的地址
-
String s2 = new String("xxxx")
1.String特性
字符串的拼接
String s1 = "abc" + "def";
//这里在底层进行了优化
//底层会直接把"abc" + "def"转换成"abcdef"
String s1 = "abc";
String s2 = "def";
String s3 = s1 + s2;
//这里s1+s2与上面"abc" + "def"不同
//底层:1.首先创建一个StringBuild sb = new StringBuild();
// 2.sb.append("abc")追加abc
// 3.sb.append("def") 在abc后面追加def
// 4.使用String s3 = sb.toString()
2.常用方法
3.StringBuffer
可变长度的字符序列,内容可以被修改
线程安全,速度慢
String和StringBuffer的转换
class test{
String s = "qweq";
//String————>StringBuffer
//方式一
StringBuffer sb1 = new StringBuffer(s);//如果s = null时,这里会抛出空指针异常
//方式二
StringBuffer sb2 = new StringBuffer();
sb2.append(s);
//StringBuffer————>String
//方式一
String s1 = sb1.toString();
//方式二
String s2 = new String(sb2)
}
常用方法
class test{
StringBuffer sb = new StringBuffer("hollw");
//增加
sb.append("word");
//删除
sb.delete(start,end);//不包含end
//修改
sb.replace(start,end,String);//不包含end
//查询
sb.indexOf(String);
//插入
sb.instert(index,String);//在下标后面插入字符串
}
4.StringBuilder
可变长度的字符序列,内容可以被修改
与StringBuffer类似,有相同的API
线程不安全的,速度快;单面线程优先使用
StringBuilder是个final类,不能被继承
5.String || StringBuffer || StringBuilder
- StringBuffer 和 StringBuilder类似,都是可变的字符序列,方法相同
- String:不可变字符序列,效率低,复用性高
- StringBuffer:线程安全的,速度慢(多线程)
- StringBuilder:线程不安全的,速度快(单线程)
效率排行
StringBuilder > StringBuffer > String