1. 创建字符串
String string = "hello bit"; //放在常量池里
String string2 = new String("hello bit"); //放在堆里
char[] array = {'h', 'e', 'l', 'l','o'};
String string3 = new String(array);
2. 字符串比较相等
System.out.println(string.equals("hello")); //当string为null时,会出现空指针异常
System.out.println("hello".equals(string));
3. 字符串常量池
string.intern(); // 手动将String对象加入到字符串常量池中
面试题:请解释String类中两种对象实例化的区别:
- 直接复制:只会开辟一块堆的内初空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
- 构造方法:会开辟两块内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手工入池。
4. 理解字符串不可变
String str = "Hello";
str = "h" + str.substring(1);
System.out.println(str);
// 执行结果 hello
5. 字符,字节与字符串
5.1 字符与字符串
No | 方法名称 | 类型 | 描述 |
1 | public String (char value[]) | 构造 | 将字符数组中的所有内容变为字符串 |
2 | public String (char value[],int offset,int count) | 构造 | 将部分字符数组中的内容变为字符串 |
3 | public char charAt(int index) | 普通 | 取得指定位置的索引字符,索引从0开始 |
4 | public char[] toCharArray() | 普通 | 将字符窜变为字符数组返回 |
No | 方法名称 | 类型 | 描述 |
1 | public String(byte bytes[]) | 构造 | 将字节数组变为字符串 |
2 | public String(byte bytes[],int offset,int length) | 构造 | 将部分字节数组中的内容变为字符串 |
3 | public byte[] getBytes() | 普通 | 将字符串以字节数组的形式返回 |
4 | public byte[] getBytes(String charsetName)throws UnsupportedEncodingException | 普通 | 编码转换处理 |
那么何时使用 byte[], 何时使用 char[] 呢?
byte[] 是把 String 按照一个字节一个字节的方式处理,这种适合在网络传输,数据存储这样的场景下使用,更适合针对二进制数据来操作。
char[] 是把 String 按照一个字符一个字符的方式处理,更适合针对文本数据来操作,尤其是包含中文的时候。
6. 字符串常见操作
6.1 字符串比较
6.2 字符串查找
6.3 字符串替换
6.4 字符串拆分
String str = "192\\168\\1\\1" ;
String[] result = str2.split("\\\\") ;
for(String s: result) {
System.out.println(s);
}
// 192 168 1 1
String str2 = "name=zhangsan&age=18";
String[] result2 = str2.split("&");
for (int i = 0; i < result2.length; i++) {
String[] temp = result2[i].split("=");
System.out.println(temp[0]+" = "+temp[1]);
}
// name = zhangsan age = 18
6.5 字符串截取
6.6 其他操作方法
7. StringBuffer 和 StringBuilder
注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuffer:利用StringBuffer的构造方法或append()方法。
- StringBuffer变为String:调用toString()方法。
//字符串反转
public synchronized StringBuffer reverse()
//删除指定范围内的数据(不包含最后的end位)
public synchronized StringBuffer delete(int start, int end)
//插入数据
public synchronized StringBuffer insert(int offset, 各种数据类型 b)
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作