一、String概述
1.什么是String
String类代表一个不可变的字符串,String类对象一旦创建,值不会被修改.
2.字符串缓冲池
由于String类对象是不能被修改的,为了提高程序性能,Java提供了一个字符串缓冲池.
使用双引号形式定义字符串时,会先在缓冲池中查找是否有这个字符串,有就直接引用,没有则创建一个.
使用构造函数定义字符串时,会先在缓冲池外创建一个对象,然后查找缓冲池内是否有这个字符串,没有就在池内再创建一个.
3.字符串串联
两个字符串使用"+"串联,其内部是使用StringBuffer的append()方法来实现的.
一个字符串和其他对象使用"+"串联,这时会调用那个对象的toString(),将toString()的返回值和字符串串联.
二、StringBuffer和StringBuilder
1.什么是StringBuffer、StringBuilder
StringBuffer也是一个字符串,是可以改变的.
StringBuilder也是一个字符串,可以改变的.功能和StringBuffer完全相同
2.两者区别
StringBuffer是从JDK1.0就存在的一个类,其所有方法都是同步的.
StringBuilder是从JDK5新添加的一个类,所有的方法都没有同步,效率相对较高.
三、常用方法
1.String类构造方法介绍
(1)String(byte[] bytes)
(2)String(byte[] bytes, String charsetName)
(3)String(byte[] bytes, int offset, int length)
(4)String(byte[] bytes, int offset, int length, String charsetName)
(5)String(char[] value)
(6)String(char[] value, int offset, int count)
(7)String(StringBuffer buffer)
//代码示例
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class DemoDemoDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] arr1 = { 97, 98, 99, -42, -48, -50, -60 };
String s1 = new String(arr1); // 将字节数组解码为字符串
System.out.println(s1);
byte[] arr2 = s1.getBytes(); // 将字符串编码为字节数组
System.out.println("系统默认码表值为:" + Arrays.toString(arr2));
// 使用指定的码表将字符串编码,由于码表可能不存在,所以会有异常
byte[] arr3 = s1.getBytes("UTF-8");
System.out.println("UTF-8 码表值为:" + Arrays.toString(arr3));
String s2 = new String(arr3, "UTF-8");// 使用指定码表将字节数组编码
System.out.println("用UTF-8编码后的值为:" + s2);
// 还可以指定字节数组一部分进行解码,或指定码表,将字节数组中的一部分解码.不再演示.
char[] arr4 = { 'a', 'b', 'c', 'd' };
String s3 = new String(arr4, 1, 2);// 将字符数组转为字符串,可以指定位置,初始位置和个数.
System.out.println(s3);
char[] arr5 = s3.toCharArray(); // 将字符串转为字符数组.
System.out.println(Arrays.toString(arr5));
StringBuilder sb = new StringBuilder();
sb.append("伦敦奥运!");
String s4 = new String(sb); // 将StringBuilder转为String
System.out.println(s4); // 当然StringBuffer也可以.
}
}
2.String类常用的几个方法(仅介绍几个,其余可以去查API)
(1)char charAt(int index) // 查找字符串中指定位置上的字符
(2)int indexOf(String str) // 查找字符串中某个字符在什么位置(第一次)
(3)int indexOf(String str, int fromIndex) // 查找字符(从指定位置开始)
(4)int lastIndexOf(String str) // 查找字符最后一次出现的位置
(5)String substring(int beginIndex) // 截取子串(指定位置开始到结束)
(6)String substring(int beginIndex, int endIndex) //截取子串(指定范围)
//代码示例
public class Demo2 {
public static void main(String[] args) {
System.out.println("abcd".charAt(3)); //结果为:d
System.out.println("abcabc".indexOf('b')); //结果为:1
System.out.println("abcabc".indexOf('a', 1)); //结果为:3
System.out.println("abcabc".lastIndexOf('a'));//结果为:3
System.out.println("abcdef".substring(3)); //结果为:def
System.out.println("abcdef".substring(1, 5)); //结果为:bcde
}
}
四、练习(用字符串只是解决)
1.获取一个已知文件名的扩展名.
2.写一个方法findAll(String src, String key),要求在src字符串中找到key字符串出现的所有位置, 打印出来.
//代码示例
public class Test {
public static void main(String[] args) {
System.out.println(getExtname("Person.java"));// 结果为:java
findAll("aaabbbcaabbbccc", "bbb"); // 结果为:3 9
}
// 练习一
public static String getExtname(String filename) {
int index = filename.lastIndexOf(".");
return index == -1 ? null : filename.substring(index + 1);
}
// 练习二
public static void findAll(String src, String key) {
int fromIndex = 0; // 定义一个变量, 当作开始索引
while (true) { // 定义一个循环
// 第一次从src的fromIndex查找key第一次出现的位置
int findIndex = src.indexOf(key, fromIndex);
if (findIndex == -1) // 如果没找到
break; // 循环结束
System.out.print(findIndex + " "); // 打印找到的位置
fromIndex = findIndex + 1; // 设置下次开始找的位置, 位置为这次找到的位置+1
}
}
}