创建字符串
Java 里的字符串和 C 语言里的字符串不太一样,C 语言里的字符串是由 ‘\0’ 结尾的字符数组或者用指针来表示,而在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串很简单,可以使用最简洁的方式:
String s1 = "Hello";
也可以使用构造函数来构造:
String s2 = new String("World");
还可以用字符数组进行构造:
char[] arr = {'J', 'A', 'V', 'A'};
String s3=new String(arr);
以上是 Java 中三种最常见构造字符串的方法。
String 常见方法
字符串的长度
使用 length() 方法可以求出字符串的长度:
可以使用 isEmpty() 方法判断字符串的长度是否为0,是返回 true,否则返回 false。
字符串比较
在使用 == 比较基本类型变量的时候,比较的是两个变量的值是否相等。例如:
int a=10;
int b=10;
int c=20;
System.out.println(a == b); //true
System.out.println(a == c); //false
而使用 == 比较引用类型变量的时候,比较的是两个变量是否为一个对象。下面先来看一段代码:
使用语句 String s1 = “hello”; 成功创建字符串后,那么在常量池中就会存在 hello 这个字符串,所以后面的语句 String s2 = “hello”; 就会去常量池中看看有没有这个字符串,s1 和 s2 就会共用一个字符串,所以 s1 和 s2 就是相等的。
使用语句 String s3 = new String(“hello”); 则会创建一个对象指向 hello 这个字符串,同样 String s4 = new String(“hello”); 也会新建一个对象,所以 s3 不等于 s4,对于 String s5=s4; s5 和 s4 就会引用同一个对象,所以 s5 和 s4 就是相等的。
equals() 方法
通过上面的代码可以看出,尽管 s1 到 s5 的内容都是 hello,但是使用 == 比较的时候并不相等。但按照我们的逻辑,就是看它们的内容相不相等,所以我们比较字符串的时候,应该使用 equals() 方法。只要它们的内容相等,哪怕不是同一个对象,也会返回 true。
compareTo() 方法
和 equals 不同,equals 返回的是布尔值,而 compareTo 返回的是 int 型。
compareToIgnoreCase() 方法: 忽略大小写比较,其余与 compareTo 比较方式相同。
字符串查找
String 类提供了很多查找函数,下面列举一些常用的函数。
char charAt(int index)
返回下标为 index 的字符,如果 index 为负数或者越界,则抛出IndexOutOfBoundsException异常。
int indexOf(int ch)
返回 ch 第一次出现的位置,没有则返回 -1。
int indexOf(int ch, int fromIndex)
从 fromIndex 位置开始找 ch 第一次出现的位置,没有则返回 -1。
int indexOf(String str)
返回 str 第一次出现的位置,没有返回 -1。
int indexOf(String str, int fromIndex)
从 fromIndex 位置开始找 str 第一次出现的位置,没有返回 -1。
int lastIndexOf(int ch)
从后往前找,返回 ch 第一次出现的位置,没有返回 -1。
还有几个函数跟上面的功能大同小异:
int lastIndexOf(int ch, int fromIndex)
从 fromIndex 位置开始找,从后往前找 ch 第一次出现的位置,没有返回 -1。
int lastIndexOf(String str)
从后往前找,返回 str 第一次出现的位置,没有返回 -1。
int lastIndexOf(String str, int fromIndex)
从 fromIndex 位置开始找,从后往前找 str 第一次出现的位置,没有返回 -1。
字符串转化
这里主要分为以下几种转化:数值和字符串转化、大小写转换、字符串转数组和格式化。
数值和字符串转化
- 数值转字符串(valueOf)
2. 字符串转数字
大小写转换
只转换字母。
toUpperCase():转大写
toLowerCase():转小写
字符串和数组转换
- 字符串转数组:toCharArray()
- 数组转字符串:
格式化
字符串替换
注意: 由于字符串是不可修改的,字符串替换不是修改当前的字符串,而是产生一个新的字符串。
字符串拆分
String[] split(String regex): 将字符串全部拆分。
String[] split(String regex, int limit): 将字符串以指定的格式,拆分为 limit 组。
如果有多个分隔符,可以使用 " | " 作为连字符。
如果要将一些特殊的字符作为分隔符的话,需要使用转义字符。
注意: 字符 |,*, + 都要加上转义字符,前面加上 \。如果是 \,就需要加上 \\。
字符串截取
从一个完整的字符串之中截取出部分内容。
String substring(int beginIndex) :从指定索引截取到结尾。
String substring(int beginIndex, int endIndex) : 截取部分内容。
注意:substring 里是前闭后开,包括前面,不包括后面。
去除空格
trim 会去掉字符串开头和结尾的空白字符包括空格,换行,制表符。
StringBuilder 和 StringBuffer
字符串是不可修改的,所有的修改其实是创建新的对象。也就是在下面这段代码中,并不会直接把 s 的内容修改成 hello world,而是会生成一个新的对象,再让 s 指向指个对象。
public static void main(String[] args) {
String s = "hello ";
s += "world";
System.out.println(s);
}
String 类是不可修改的,为了修改字符串,java 提供了 StringBuilder 和 StringBuffer 类,使用 append 方法可以在字符串末尾添加字符串。
当然,除了 append 方法还有其他方法,可以在下面这个网页中查询:Java 帮助手册(按下 Ctrl + F 键,输入 StringBuilder 即可跳转到 StringBuilder 部分)。
注意: String 和 StringBuilder 不能直接转换,但可以通过以下方式互相转换:
String 转 StringBuilder 可以通过 StringBuilder 的构造方法或者 append 方法。
StringBuilder 转 String 可以通过 toString() 方法。
String、StringBuffer、StringBuilder 三者区别:
String:字符串常量,内容不可修改,StringBuffer 与 StringBuilder 的内容可以修改。
StringBuffer:字符串变量(线程安全)。频繁对字符串内容修改,可以考虑 StringBuffer。
StringBuilder:大部分功能和 StringBuffer 相似,属于线程不安全操作。