1.字符串操作
1.字符串操作——String类
- String可以表示一个字符串
- String类实际是使用字符数组存储的
String 类的两种赋值方式: - 一种称为直接赋值:
String name = "小白"
- 通过关键字new调用String的构造方法赋值
String name = new String("小白")
示例
//String表示一个字符串,内部使用字符数组实现,不能被继承(最终类),不可变
public class Test15 {
public static void main(String[] args){
//String 的两种赋值方式,Java推荐使用第一种方式
//1.直接赋值
String s1 = "粉粉";
//2.使用new关键字创建对象,new:表示申请内存空间
String s2 = new String("粉粉");
String s3 = "粉粉";
System.out.println(s1==s3);
System.out.println(s1==s2);
//代码示例:4种情况分析:直接赋值字符串连接时,考虑编译期和运行期
//如果在编译期,值可以被确定 那么就使用已有的对象,否则会创建新的对象
String a="a";
String a1=a+1;
String a2="a1";
System.out.println(a1==a2);
final String b="b";
String b1 = b+"1";
String b2 = "b1";
System.out.println(b1==b2);
String c = getC();
String c1 = c+1;
String c2 = "c1";
System.out.println(c1==c2);
final String d=getD();
String d1= d+1;
String d2="d1";
System.out.println(d1==d2);
}
private static String getC(){
return "c";
}
private static String getD(){
return "d";
}
}
String类的两种赋值分析:
- 字符串常量池
- String name = new String(“小白”),在内存中的分析
- String name = “小白”,在内存中的分析
String 类编译期与运行期分析: - 编译期和运行期
- 代码示例:4种情况分析
String类字符与字符串操作方法
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public char charAt(int index) | 普通 | 根据下标找到指定的字符 |
2 | public char[] toCharArray() | 普通 | 以字符数组的形式返回全部的字符串内容 |
3 | public String(Char[] value) | 构造 | 将全部的字符数组变为字符串 |
4 | public String(Char[] value,int offset,int count) | 构造 | 将指定范围的字符数组变为字符串 |
public class Test16 {
public static void main(String[] args){
String str = "dsds123";
char c = str.charAt(0);
System.out.println(c);
System.out.println(str.toCharArray());
char[] cs = {'a','b','c'};
String s1 = new String(cs);
String s2 = new String(cs,0,1);
System.out.println(s2);
}
}
String类字节与字符串操作方法:
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public byte[] getBytes() | 普通 | 将字符串变为字节数组 |
2 | public String (byte[] bytes) | 构造 | 将字节数组变为字符串 |
3 | public String (byte[] bytes,int offset,int length) | 构造 | 将指定范围的字节数组变为字符串 |
4 | public String(byte[] bytes,String charsetName) | 构造 | 通过使用指定的charset解码指定的byte |
import java.util.Arrays;
public class Test16 {
public static void main(String[] args){
String str = "dsds123";
char c = str.charAt(0);
System.out.println(c);
System.out.println(str.toCharArray());
char[] cs = {'a','b','c'};
String s1 = new String(cs);
String s2 = new String(cs,0,1);
System.out.println(s2);
System.out.println(Arrays.toString(str.getBytes()));
}
2.字符串操作——StringBuffer类
StringBuffer解决了使用String拼接字符串时产生大量垃圾对象的问题,内部实现其实是字符数组
在实际开发当中,我们经常会使用到字符串连接的操作,如果用String来操作,则使用"+"号完成字符串的连接操作。
使用String连接字符串,代码性能会非常低,因为String的内容不可改变。
解决这个问题的方法是使用StringBuffer。
StringBuffer类源码分析
public class stringbuffer {
public static void main(String[] args){
String a = "a";
String b = "b";
String c = a+b+1;
System.out.println(c);
//
String d = "a"+1+2+3+4+"b";//a1234b//常量相加没有性能问题(编译期进行优化)
//StringBuffer目的是解决字符串相加时带来的性能问题(常量与变量)
//StringBuffer的内部实现采用字符数组,默认数组的长度为16,超过数组大小时,动态扩充的算法是原来的长度*2+2
//所以当我们预知要添加的数据长度时,建议使用带初始化容量的构造方法,来避免动态扩容的次数,从而提高效率
//线程安全的,会影响性能
StringBuffer sb = new StringBuffer();
sb.append(a).append(b).append(1);
System.out.println(sb.toString());
}
}
StringBuffer常用操作方法
方法名称 | 描述 |
---|---|
public StringBuffer() | 构造一个空的StringBuffer对象 |
public StringBuffer(String str) | 将指定的String变为StringBuffer的内容 |
public StringBuffer(CharSequence seq) | 接收CharSequence接口的实例 |
public StringBuffer append(数据类型 b) | 提供了很多的append()方法,用于进行字符串连接 |
public StringBuffer delete(int start,int end) | 删除指定位置的内容 |
public int indexOf(String str) | 字符串的查询功能 |
public StringBuffer insert(int offset,数据类型 b) | 在指定位置上增加一个内容 |
public StringBuffer replace(int start,int end,String str) | 将指定范围的内容替换成其他内容 |
public String substring(int start,int end) | 截取指定范围的字符串 |
public String substring(int start) | 字符串截取 |
public StringBuffer reverse() | 字符串反转 |
2.字符串操作——StringBuilder类
StringBuffer的兄弟StringBuilder:
一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步,该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单子线程使用的时候(这种情况很普通)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快
StringBuffer与StringBuilder的区别?
- StringBuffer是线程安全的,性能低,适合在多线程的使用
- StringBuilder是线程不安全的,性能高,适合在单线程中使用,这种情况占大多数,在JDK1.5后使用
字符串相加操作
- 多个常量相加没有性能问题,在编译期优化
- 变量与常量相加,会产生多个垃圾对象
public class StringBuilder {
public static void main(String[] args){
StringBuilder sb = new StringBuilder();
String a = "a"+1;
String b = a+"b";
String c = null;
for (int i = 0;i<5;i++){
c+=i;//每次循环会产生一个StringBuilder对象实现拼接,性能低,最好是手动创建StringBulider来拼接
}
}
}