目录
String
String介绍
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例 也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象
字符串的特点
字符串不可变,它们的值在创建后不能被更改 虽然 String 的值是不可变的,但是它们可以被共享 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
String构造方法
方法名 | 说明 |
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc |
构造方法有四种,一般比较推荐最后一种使用直接赋值的方式。
String 对象的特点
1、通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同。
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的。
2、以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次, JVM 都只会建立一个 String 对象,并在字符串池中维护。
String s3 = "abc";
String s4 = "abc";
在上面的代码中,针对第一行代码,JVM 会建立一个 String 对象放在字符串池中,并给 s3 参考; 第二行则让 s4 直接参考字符串池中的 String 对象,也就是说它们本质上是同一个对象。
Strng常用方法太多了就不列举了,推荐使用API文档或上菜鸟教程看看。
StringBuilder
StringBuilder介绍
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器 这里的可变指的是 StringBuilder 对象中的内容是可变的。
StringBuilder构造方法
方法名 | 说明 |
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容(无参构造) |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
以上两种方法是较为常用方法,并不是只能这两种详情可查阅API文档
StringBuilder 的添加和反转方法
方法名 | 说明 |
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
代码
public class Demo {
public static void main(String[] args) {
//无参构造
StringBuilder sb1 = new StringBuilder();
System.out.println("sb1:"+sb1);
//带参构造
StringBuilder sb2 = new StringBuilder("zxcccv");
System.out.println("sb2:"+sb2);
//内容添加:append()方法可以追加任意数据类型详细可参看JavaAPI文档
sb1.append("xiaoxue");
System.out.println("sb1:"+sb1);
sb2.append("xiaohong").append(1234);//链式编程拼接字符串
System.out.println("sb2"+sb2);
//反转reverse()
sb1.reverse();
System.out.println("sb1:"+sb1);
sb2.reverse();
System.out.println("sb2"+sb2);
}
}
String 和 StringBuilder 的区别:
String :内容是不可变的
StringBuildr:内容是可变的
因为String它被final关键字定义,内容就不可变。
二者相比较而言在使用时StringBuilder比String更节约时间和空间。
StringBuilder 和 String 相互转化
1. StringBuilder 转换为 String
通过 toString() 就可以实现把 StringBuilder 转换为 String。
eg:
public class Demo {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("abc");
String s = sb1.toString();
System.out.println(s);
}
}
2. String 转换为 StringBuilder
通过构造方法就可以实现把 String 转换为 StringBuilder。
eg:
public class Demo {
public static void main(String[] args) {
String s = "hello";
StringBuilder sb1 = new StringBuilder(s);
System.out.println(sb1);
}
}
StringBuffer
构造方法
Constructor | 描述 |
---|---|
StringBuffer() | 构造一个没有字符的字符串缓冲区,初始容量为16个字符。 |
StringBuffer(int capacity) | 构造一个没有字符的字符串缓冲区和指定的初始容量。 |
StringBuffer(CharSequence seq) | 构造一个字符串缓冲区,其中包含与指定的 |
StringBuffer(String str) | 构造一个初始化为指定字符串内容的字符串缓冲区。 |
eg:
// 定义一个空的字符串缓冲区,含有16个字符的容量
StringBuffer str1 = new StringBuffer();
// 定义一个含有12个字符容量的字符串缓冲区
StringBuffer str2 = new StringBuffer(12);
// 定义一个含有(16+4)的字符串缓冲区,"新年快乐"为4个字符
StringBuffer str3 = new StringBuffer("新年快乐");
/*
*输出字符串的容量大小
*capacity()方法返回字符串的容量大小
*/
System.out.println(str1.capacity()); // 输出 16
System.out.println(str2.capacity()); // 输出 12
System.out.println(str3.capacity()); // 输出 20
StringBuffer 常用方法
追加字符串和StringBuilder的操作相同;
替换:setCharAt() 方法用于在字符串的指定索引位置替换一个字符。该方法的语法格式如下:
StringBuffer 对象.setCharAt(int index, char ch);
eg:
StringBuffer sb = new StringBuffer("Hello");
sb.setCharAt(1,'E');
System.out.println(sb); // 输出:HEllo
sb.setCharAt(0,'h');
System.out.println(sb); // 输出:hEllo
sb.setCharAt(2,'w');
System.out.println(sb); // 输出:hEwlo
反转字符串也和StringBuilder的操作相同
删除字符串,StringBuffer 类提供了 deleteCharAt() 和 delete() 两个删除字符串的方法。
1. deleteCharAt() 方法
deleteCharAt() 方法用于移除序列中指定位置的字符,该方法的语法格式如下:
StringBuffer 对象.deleteCharAt(int index);
deleteCharAt() 方法的作用是删除指定位置的字符,然后将剩余的内容形成一个新的字符串。
eg:
StringBuffer sb = new StringBuffer("abc");
sb.deleteCharAt(2);
System.out.println(sb); // 输出:ab
2. delete() 方法
delete() 方法用于移除序列中子字符串的字符,该方法的语法格式如下:
StringBuffer 对象.delete(int start,int end);
其中,start 表示要删除字符的起始索引值(包括索引值所对应的字符),end 表示要删除字符串的结束索引值(不包括索引值所对应的字符)。该方法的作用是删除指定区域以内的所有字符。
eg:
StringBuffer sb = new StringBuffer("Hello Jack");
sb.delete(2,5);
System.out.println(sb); // 输出:He Jack
sb.delete(2,5);
System.out.println(sb); // 输出:Heck
StringBuffer和StringBuilder区别
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类(单线程)和 StringBuffer (多线程)之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类,然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。