- String类
- 1.常用方法
- 1.1字符串构造
- 1.2String对象的比较
- 1.3字符串查找
- 1.4字符串转化
- 1.5字符串替换
- 1.6字符串拆分
- 1.7字符串截取
- 1.8其他方法
- 1.9字符串常量池
- 1.10字符串不可变性
- 1.11字符串修改
- 2.StringBuilder和StringBuffffer
- 2.1 StringBuilder的介绍
- 2.2面试题
String类提供的构造方式非常多,常用的就以下三种:
public static void main(String[] args) {
// 使用常量串构造
String s1 = "hello bit";
System.out.println(s1);
// 直接new String对象
String s2 = new String("hello bit");
System.out.println(s1);
// 使用字符数组进行构造
char[] array = {'h','e','l','l','o','b','i','t'};
String s3 = new String(array);
System.out.println(s1);
}
注意:
- String是引用类型,内部并不存储字符串本身
- 在Java中用双引号引起来的也是String类型对象
字符串的比较是常见操作之一,Java中总共提供了4中方式:
-
比较是否引用一个对象
public static void main(String[] args) { int a = 10; int b = 20; int c = 10; // 对于基本类型变量,== 比较的是两个变量中存储的值是否相同 System.out.println(a == b); // false System.out.println(a == c); // true // 对于引用类型变量,== 比较的是两个引用变量引用的是否为同一个对象 String s1 = new String("hello"); String s2 = new String("hello"); String s3 = new String("world"); String s4 = s1; System.out.println(s1 == s2); // false System.out.println(s2 == s3); // false System.out.println(s1 == s4); // true } -
boolean equals(Object anObject) 方法:按照字典序比较,比较是内容是否一样,String类重写了父类Object中equals方法,Object中equals默认按照"=="比较
-
int compareTo(String s) 方法: 按照字典序进行比较,得到的是差值
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
- 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
- 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
public static void main(String[] args) { String s1 = new String("abc"); String s2 = new String("ac"); String s3 = new String("abc"); String s4 = new String("abcdef"); System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1 System.out.println(s1.compareTo(s3)); // 相同输出 0 System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3 }
String类提供的常用查找方法:
char charAt(int index)
int indexOf(int ch)
int indexOf(int ch, int
fromIndex)
int indexOf(String str)
int indexOf(String str, int
fromIndex)
int lastIndexOf(int ch)
int lastIndexOf(int ch, int
fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String str, int
fromIndex)
1.4字符串转化
-
数值和字符串转化
public static void main(String[] args) { // 数字转字符串 String s1 = String.valueOf(1234); String s2 = String.valueOf(12.34); String s3 = String.valueOf(true); String s4 = String.valueOf(new Student("Hanmeimei", 18)); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); // 字符串转数字 // 注意:Integer、Double等是Java中的包装类型 int data1 = Integer.parseInt("1234"); double data2 = Double.parseDouble("12.34"); System.out.println(data1); System.out.println(data2); } -
大小写转换
public static void main(String[] args) { String s1 = "hello"; String s2 = "HELLO"; // 小写转大写 System.out.println(s1.toUpperCase()); // 大写转小写 System.out.println(s2.toLowerCase()); } -
字符串转字符数组
public static void main(String[] args) { String s = "hello"; // 字符串转字符数组 char[] ch = s.toCharArray(); for (int i = 0; i < ch.length; i++) { System.out.print(ch[i]); } // 字符数组转字符串 String s2 = new String(ch); System.out.println(s2); } -
字符串格式化
public static void main(String[] args) { String s = String.format("%d-%d-%d", 2019, 9,14); System.out.println(s); }
String replaceAll(String regex, String replacement) //替换所有的指定内容 String replaceFirst(String regex, String replacement) //替换指定的第一次出现的内容1.6字符串拆分
String[] split(String regex) //将字符串全部拆分 String[] split(String regex, int limit) //将字符串以指定的格式,拆分为limit组1.7字符串截取
String substring(int beginIndex) //从指定索引截取到结尾 String substring(int beginIndex, int endIndex) //截取部分内容1.8其他方法
String trim() //去掉字符串中的左右空格,保留中间空格1.9字符串常量池
1.10字符串不可变性“池” 是编程中的一种常见的,重要的提升效率的方式。为了节省存储空间以及程序的运行效率,Java中引入了:
- Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息
- 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份
- 字符串常量池
String是一种不可变类,字符串中的内容是不可改变。字符串不可被修改,是因为:
- String类在设计时就是不可改变的,为不可变类
- 所有涉及到可能修改字符串内容的操作都是创建一个新对象,不在原对象上进行修改
尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下
public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s); // 输出:hello world
}
这种方式不推荐使用,效率低下,创建了需要临时对象
执行过程:
1.创建一个StringBuild对象,假设为temp
2.调用append方法将s追加在temp之后
3.调用append方法将"world"追加在temp之后
4.temp调用toString方法构造一个新的String对象
5.将新String对象的引用赋给s
2.StringBuilder和StringBuffffer
2.1 StringBuilder的介绍
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffffer类,这两个类大部分功能是相同的。
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = sb1;
sb1.append(' '); // hello
sb1.append("world"); // hello world
sb1.append(123); // hello world123
System.out.println(sb1); // hello world123
System.out.println(sb1 == sb2); // true
System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
System.out.println(sb1.length()); // 获取字符串的有效长度14
System.out.println(sb1.capacity()); // 获取底层数组的总大小
sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
System.out.println(sb1); System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
sb1.deleteCharAt(0); // 删除首字符 sb1.delete(0,5); // 删除[0, 5)范围内的字符
String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
System.out.println(str); sb1.reverse(); // 字符串逆转
str = sb1.toString(); // 将StringBuffer以String的方式返回
System.out.println(str);
}
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
- StringBuilder变为String: 调用toString()方法
- String、StringBuffffer、StringBuilder的区别
-
String的内容不可修改,StringBuffffer与StringBuilder的内容可以修改
-
StringBuffffer与StringBuilder大部分功能是相似的
-
StringBuffffer采用同步处理,线程安全;而StringBuilder未采用同步处理,线程不安全
-
以下总共创建了多少个String对象
String str = new String("ab"); // 会创建2个对象 String str = new String("a") + new String("b"); // 会创建6个对象



