字符序列
字符与字符串
字符类型(char)是Java中的基本类型之一,字符是用单引号引住的单个符号。
字符串类型(String)是用双引号引住的任意个字符,字符串其实就是字符组成的序列。
字符串对象与字面量
字符串的声明有两种形式:
-
String 变量名 = “初始值”; -
String 变量名 = new String(“初始值”);
第一种形式使用双引号引住的字符串叫做字面量。(推荐使用)
第二中形式使用new运算符声明的字符串对象。
字符串操作(详细操作API文档)
以下为常见字符串操作
字符串的连接
-
可以进行加法运算,将两个字符串连接在一起,也可以将字符串与基本类型变量做加法运算,系统会先将基本类型转换为字符串型后进行连接操作。
String str1 = "Hello"; String str2 = "World"; String result = str1 + " " + str2; System.out.println(result); -
也可以使用
concat()方法连接String str1 = "Hello"; String str2 = "World"; String result = str1.concat(" ").concat(str2); System.out.println(result);
加法方法和concat()方法的区别
- 参数数量:concat()方法只接受一个字符串参数,并将其与其他字符串连接起来。+运算符可以接受任意数量的字符串参数,并将它们全部连接起来。
- 输入类型:concat()方法只能接受一个字符串参数,如果提供了任何其他类型的参数,则会报错。+运算符可以接受任何类型的参数,并将其转换为字符串,然后再将其连接到目标字符串上。
- 空指针异常:如果任何一个字符串参数为null,则concat()方法不会引发空指针异常。但是,如果使用+运算符合并null字符串,则会引发空指针异常。
字符串的比较方法
使用equals方法
==与equals方法的区别
字符串的长度
String类的length()方法可以获取字符串是由多少个字符构成的。
在数组中length属于数组的属性,而在字符串中length()是字符串的方法,需区分
字符串的查找
indexOf()用于在一个字符串中从前向后查找另一个字符串,如果找到了就返回另外一个字符串的下标,找不到就返回-1;lastIndexOf()用于在一个字符串中从后向前查找另外一个字符串,如果找到了就返沪另外一个字符串的下标,找不到就返回-1;startWith()用于判断一个字符串是否以另外一个字符串开头;endsWith()用于判断字符串是否以另一个字符串结尾;toLowerCase()用于字符串变成小写字母;toUpperCase()用于字符串变成大写字母;split()用于将一个字符串以给定的分隔符分割成多个字符串,并将其分割后的字符串保存在一个数组中,返回这个数组名。
字符串内容替换
replace(String,String)方法用于将字符串中指定的内容替换称其他内容。
字符串的截取
subString(int,int)方法用于字符串内容的截取
第一个参数hi从第几位开始取,第二位参数是截取到第几位。
如果没有给定第二位参数,默认截取到最后一位。
字符串的格式化
format()方法用于创建格式化的字符串以及连接多个字符串对象。
方法定义:format(String format,Object... args);
第一个参数是被各视化的字符串;
第二个参数是替换格式符的字符串。
常用格式符
%s: 字符串类型%d: 整数类型%f: 浮点数类型%b: 布尔类型%c: 字符类型%x: 十六进制整数类型(小写字母)%X: 十六进制整数类型(大写字母)%o: 八进制整数类型%e: 科学计数法表示的浮点数类型(小写字母)%E: 科学计数法表示的浮点数类型(大写字母)%g: 根据值的大小,自动选择%f或%e格式%G: 根据值的大小,自动选择%f或%E格式%[]: 字符集合或范围,例如%[0-9]表示匹配数字字符%n: 平台独立的换行符%s: 字符串类型%d: 整数类型%f: 浮点数类型%b: 布尔类型%c: 字符类型%x: 十六进制整数类型(小写字母)%X: 十六进制整数类型(大写字母)%o: 八进制整数类型%e: 科学计数法表示的浮点数类型(小写字母)%E: 科学计数法表示的浮点数类型(大写字母)%g: 根据值的大小,自动选择%f或%e格式%G: 根据值的大小,自动选择%f或%E格式%[]: 字符集合或范围,例如%[0-9]表示匹配数字字符%n: 平台独立的换行符
String类型转换成基本类型
-
使用包装类的方法:
- 对于整数类型(
int,long,byte,short),你可以使用Integer.parseInt(),Long.parseLong(),Byte.parseByte(),Short.parseShort()等方法。 - 对于浮点数类型(
float,double),你可以使用Float.parseFloat()和Double.parseDouble()方法。 - 对于布尔类型(
boolean),你可以使用Boolean.parseBoolean()方法。
示例:
String intString = "42"; int intValue = Integer.parseInt(intString); String doubleString = "3.14"; double doubleValue = Double.parseDouble(doubleString); String booleanString = "true"; boolean booleanValue = Boolean.parseBoolean(booleanString); - 对于整数类型(
-
使用Scanner类: 你可以使用
java.util.Scanner类来解析输入字符串。这对于从用户输入中获取基本数据类型值很有用。示例:
import java.util.Scanner; Scanner scanner = new Scanner(System.in); System.out.print("Enter an integer: "); int userInputInt = scanner.nextInt(); -
使用valueOf()方法: 所有基本数据类型的包装类都提供了静态的
valueOf()方法,可以将字符串转换为相应的包装类对象,然后通过自动拆箱转换为基本数据类型。示例:
String intString = "42"; Integer integerObject = Integer.valueOf(intString); int intValue = integerObject.intValue();
无论哪种方法,都需要注意输入字符串的格式必须匹配相应数据类型的表示。如果输入字符串无法正确转换为目标类型,将会抛出异常,例如NumberFormatException。因此,在进行转换时,要确保字符串的内容是合法的数据表示。
基本类型转换为String类型
-
使用字符串连接操作: 使用字符串连接操作将基本数据类型与空字符串相连,就会自动将其转换为字符串。
示例:
int intValue = 42; String intString = intValue + ""; -
使用
String.valueOf()方法: 所有基本数据类型的包装类都提供了静态的valueOf()方法,可以将基本数据类型转换为字符串。示例:
double doubleValue = 3.14; String doubleString = String.valueOf(doubleValue); -
使用
String.format()方法: 使用String.format()方法可以将基本数据类型格式化为字符串,类似于使用格式化字符进行字符串拼接,但是结果是一个格式化后的字符串。示例:
float floatValue = 2.718f; String formattedString = String.format("%.2f", floatValue); -
使用
StringBuilder或StringBuffer: 如果需要在循环或其他需要频繁拼接的场景中将基本数据类型转换为字符串,使用StringBuilder(或在多线程环境中使用StringBuffer)可以更高效地进行拼接。示例:
int value = 123; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(value); String result = stringBuilder.toString();
无论使用哪种方法,都会将基本数据类型转换为字符串类型,以便于字符串的处理和操作。
字符串关键特点
-
字符串对象是不可修改的
一旦创建一个字符串对象,就无法更改它的内容。
-
线程安全
由于字符串是不可变,多个线程可以同时访问和共享共同的字符串对象,而不会出现并发修改的问题。这使得字符串在多线程环境中更安全。
-
字符串池
Java字符串常量池是Java虚拟机(
JVM)中的一种机制,用于存储字符串常量。在Java中,字符串常量是由一个一个字符组成的,放在了StringTable上。StringTable是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。Java中的字符串常量池可以提高性能和减少内存开销,避免字符串的重复创建。当程序需要使用一个字符串常量时,
JVM首先会检查该字符串是否已经在字符串常量池中存在,如果存在则直接返回该字符串的引用,否则将该字符串添加到字符串常量池中并返回其引用。 -
安全性
字符串不可变性确保字符串对象在被传递给其他方法时,不会被修改,从而避免了在传递参数时意外修改字符串内容的情况。
字符串变量
StringBuffer类
StringBuffer类是Java中一个用于处理可变字符串(可修改的字符串)的类,它属于java.lang包。StringBuffer类与String类的最主要区别在于,String对象是不可变的,一旦创建,其内容就无法更改;而StringBuffer对象则可以进行插入、追加、删除和修改等操作,是线程安全的,适用于多线程环境。
构造方法:
StringBuffer类提供了几种常见的构造方法,用于创建不同初始内容的StringBuffer对象。
-
无参构造方法: 创建一个空的
StringBuffer对象。初始容量为默认值(16个字符)
StringBuffer buffer = new StringBuffer(); -
带初始容量的构造方法: 创建一个具有指定初始容量的
StringBuffer对象。初始容量是指可以容纳的字符数量,当追加的字符数量超过初始容量时,StringBuffer会自动扩容。int initialCapacity = 16; StringBuffer buffer = new StringBuffer(initialCapacity); -
使用字符串创建的构造方法: 创建一个包含指定字符串内容的
StringBuffer对象。初始容量将被设置为字符串的长度加上默认的容量增量。
String initialString = "Hello"; StringBuffer buffer = new StringBuffer(initialString); -
使用字符序列(
CharSequence)创建的构造方法: 创建一个包含指定字符序列内容的StringBuffer对象。CharSequence是一个接口,String和StringBuilder等类实现了这个接口。CharSequence charSequence = "World"; StringBuffer buffer = new StringBuffer(charSequence);
初始容量是指内部字符缓冲区的初始大小,用于存储字符串内容。
这些构造方法允许以不同的方式初始化StringBuffer对象,使其具有不同的初始内容和容量。
常见操作
-
追加和插入: 可以使用
append()方法追加字符串、基本类型和其他数据类型到StringBuffer对象的末尾,也可以使用insert()方法在指定位置插入内容。示例:
StringBuffer buffer = new StringBuffer("Hello"); buffer.append(" World"); // 追加字符串 buffer.insert(5, ","); // 在指定位置插入字符 -
删除和替换: 可以使用
delete()方法删除指定范围的字符,使用replace()方法替换指定范围内的字符。示例:
StringBuffer buffer = new StringBuffer("Hello World"); buffer.delete(5, 11); // 删除指定范围内的字符 buffer.replace(0, 5, "Hi"); // 替换指定范围内的字符 -
其他方法:
StringBuffer还提供了许多其他有用的方法,如reverse()(反转字符串)、capacity()(返回当前容量)、length()(返回长度)等。
线程安全:
StringBuffer是线程安全的,适用于多线程环境。如果不需要线程安全性,可以使用StringBuilder类,它与StringBuffer类类似,但不保证线程安全,因此在单线程环境下可能会更快。
由于StringBuffer类可以进行修改操作,适用于频繁的字符串拼接、修改和处理场景,但在单线程环境下使用StringBuilder可能更加高效。
StringBuilder类
StringBuilder类是Java中用于处理可变字符串(可修改的字符串)的另一个类,它也属于java.lang包。与StringBuffer类类似,StringBuilder也用于处理字符串的拼接、插入、删除等操作。然而,与StringBuffer不同的是,StringBuilder类不是线程安全的,因此在单线程环境下更加高效。
构造方法:
StringBuilder类提供了多个构造方法,包括无参构造方法和接受字符串或字符序列的构造方法。
示例:
StringBuilder builder1 = new StringBuilder(); // 创建一个空的StringBuilder对象
StringBuilder builder2 = new StringBuilder("Hello"); // 使用字符串创建StringBuilder对象
常见操作
-
追加和插入: 可以使用
append()方法追加字符串、基本类型和其他数据类型到StringBuilder对象的末尾,也可以使用insert()方法在指定位置插入内容。示例:
StringBuilder builder = new StringBuilder("Hello"); builder.append(" World"); // 追加字符串 builder.insert(5, ","); // 在指定位置插入字符 -
删除和替换: 可以使用
delete()方法删除指定范围的字符,使用replace()方法替换指定范围内的字符。示例:
StringBuilder builder = new StringBuilder("Hello World"); builder.delete(5, 11); // 删除指定范围内的字符 builder.replace(0, 5, "Hi"); // 替换指定范围内的字符 -
其他方法:
StringBuilder还提供了许多其他有用的方法,如reverse()(反转字符串)、capacity()(返回当前容量)、length()(返回长度)等。
StringBuilder类适用于在单线程环境下频繁进行字符串操作的场景,由于它不是线程安全的,所以在多线程环境下应该使用StringBuffer类。由于StringBuilder允许进行修改操作,适用于需要频繁进行字符串拼接、修改和处理的场景。