Java中的String字符串及其常用方法
字符串(String)
文章目录
字符串是常量,字符串对象一旦被创建,其值是不能改变的,这是因为字符串的值是存放在方法区的常量池里面,但是引用可以改变,并且可以使用其他变量重新赋值的方式进行更改。
- java字符串
String
是不可变对象; - 字符串操作不改变元字符串内容,而是返回新字符串
- Java使用Unicode编码表示
String和char
; - 转换编码就是将
String
和byte[]
转换,需要指定编码; - 转换为
byte[]
时,始终优先考虑UTF-8
编码。
直接定义字符串
直接定义字符串是指使用双引号表示字符串中的内容,例如“Hello Java”、“Java 编程”等。具体方法是用字符串常量直接初始化一个 String 对象,示例如下:
String str = "Hello Java";
下面的实例演示了直接创建字符串的几种用法。
String str = "我是一只小小鸟"; // 结果:我是一只小小鸟
String word;
word = "I am a bird"; // 结果:I am a bird
word = "<h1>to fly</h1>"; // 结果:<h1>to fly</h1>
word = "Let\'s say that it\'s true"; // 结果:Let's say that it's true
System.out.println(word);
word = "北京\\上海\\广州"; // 结果:北京\上海\广州
常用方法
字符串长度
用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length()
方法,它返回字符串对象包含的字符数。
下面的代码执行后,len 变量等于 14:
StringDemo.java 文件代码:
public class StringDemo {
public static void main(String args[]) {
String site = "www.runoob.com";
int len = site.length();
System.out.println( "菜鸟教程网址长度 : " + len );
}
}
以上实例编译运行结果如下:
菜鸟教程网址长度 : 14
toLowerCase() & toUpperCase()方法
- String 类的
toLowerCase()
方法可以将字符串中的所有字符全部转换成小写,而非字母的字符不受影响。语法格式如下:
字符串名.toLowerCase() // 将字符串中的字母全部转换为小写,非字母不受影响
toUpperCase()
则将字符串中的所有字符全部转换成大写,而非字母的字符不受影响。语法格式如下:
字符串名.toUpperCase() // 将字符串中的字母全部转换为大写,非字母不受影响
例如:
String str="abcdef 我 ghijklmn";
System.out.println(str.toLowerCase()); // 输出:abcdef 我 ghijklmn
System.out.println(str.toUpperCase()); // 输出:ABCDEF 我 GHIJKLMN
trim()方法去除空格
字符串中存在的首尾空格一般情况下都没有任何意义,如字符串“ Hello ”,但是这些空格会影响到字符串的操作,如连接字符串或比较字符串等,所以应该去掉字符串中的首尾空格,这需要使用 String 类提供的 trim() 方法。
trim() 方法的语法形式如下:
字符串名.trim()
使用 trim() 方法的示例如下:
String str = " hello ";
System.out.println(str.length()); // 输出 7
System.out.println(str.trim().length()); // 输出 5
从该示例中可以看出,字符串中的每个空格占一个位置,直接影响了计算字符串的长度。
如果不确定要操作的字符串首尾是否有空格,最好在操作之前调用该字符串的 trim() 方法去除首尾空格,然后再对其进行操作。
注意:trim() 只能去掉字符串中前后的半角空格(英文空格),而无法去掉全角空格(中文空格)。可用以下代码将全角空格替换为半角空格再进行操作,其中替换是 String 类的 replace() 方法
str = str.replace((char) 12288, ' '); // 将中文空格替换为英文空格
str = str.trim();
其中,12288 是中文全角空格的 unicode 编码。
判空
String
还提供了isEmpty()
和isBlank()
来判断字符串是否为空和空白字符串:
类型转换
任意类型转换为字符串:
要把任意基本类型或引用类型转换为字符串,可以使用静态方法valueOf()。这是一个重载方法,编译器会根据参数自动选择合适的方法.
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c
字符串转换其他类型:
视情况而论
int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255
//String和char[]类型可以互相转换
char[] cf = "Hello".toCharArray(); // String -> char[]
String s = new String(cf); // char[] -> String
截取(提取)子字符串 substring()
- substring(int beginIndex) 形式
此方式用于提取从索引位置开始至结尾处的字符串部分。调用时,括号中是需要提取字符串的开始位置,方法的返回值是提取的字符串。例如:
String str = "我爱 Java 编程";
String result = str.substring(3);
System.out.println(result); // 输出:Java 编程
- substring(int beginIndex,int endIndex) 形式
此方法中的 beginIndex 表示截取的起始索引,截取的字符串中包括起始索引对应的字符;endIndex 表示结束索引,截取的字符串中不包括结束索引对应的字符 即(前闭后开)原则,如果不指定 endIndex,则表示截取到目标字符串末尾。该方法用于提取位置 beginIndex 到 endIndex-1的字符串部分。
注意 :这里的结束位置是包括的,因为结束索引是从1开始的,开始索引从零开始,这是另一种理解方式,大家选哪种理解都行,还有前闭后开原则,大家选一种理解即可,后面也有说明!!
这里需要特别注意的是, 对于开始位置 beginIndex, Java 是基于字符串的首字符索引为 0 处理的,但是对于结束位置 endIndex,Java 是基于字符串的首字符索引为 1 来处理的,如图 1 所示。
参数
-
beginIndex – 起始索引(包括), 索引从 0 开始。
-
endIndex – 结束索引(不包括结束索引)。
返回值
图1 字符串中的字符索引
结尾索引理解三种都行 ,用首字符索引为1理解也行,用不包括结尾索引理解也行 另有beginIndex 到 endIndex-1理解也可以 。
注意:substring() 方法是按字符截取,而不是按字节截取。
例 1
创建一个字符串,对它使用 substring() 方法进行截取并输出结果。示例代码如下:
public static void main(String[] args) {
String day = "Today is Monday"; //原始字符串
System.out.println("substring(0)结果:"+day.substring(0));
System.out.println("substring(2)结果:"+day.substring(2));
System.out.println("substring(10)结果:"+day.substring(10));
System.out.println("substring(2,10)结果:"+day.substring(2,10));
System.out.println("substring(0,5)结果:"+day.substring(0,5));
}
输出结果如下所示:
substring(0)结果:Today is Monday
substring(2)结果:day is Monday
substring(10)结果:onday
substring(2,10)结果:day is M
substring(0,5)结果:Today
替代方法
replace() 方法
replace()
方法用于将目标字符串中的指定字符(串)替换成新的字符(串),其语法格式如下:
字符串.replace(String oldChar, String newChar)
其中,oldChar 表示被替换的字符串;newChar 表示用于替换的字符串。replace()
方法会将字符串中所有 oldChar 替换成 newChar。
例 1
创建一个字符串,对它使用 replace() 方法进行字符串替换并输出结果。代码如下:
public static void main(String[] args) {
String words = "hello java,hello php";
System.out.println("原始字符串是'"+words+"'");
System.out.println("replace(\"l\",\"D\")结果:"+words.replace("l","D"));
System.out.println("replace(\"hello\",\"你好\")结果:"+words.replace("hello","你好 "));
words = "hr's dog";
System.out.println("原始字符串是'"+words+"'");
System.out.println("replace(\"r's\",\"is\")结果:"+words.replace("r's","is"));
}
输出结果如下所示:
原始字符串是’hello java,hello php’
replace(“l”,“D”)结果:heDDo java,heDDo php
replace(“hello”,“你好”)结果:你好 java,你好 php
原始字符串是’hr’s dog’
replace(“r’s”,“is”)结果:his dog
replaceFirst() 方法
replaceFirst() 方法用于将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串,其语法形式如下:
字符串.replaceFirst(String regex, String replacement)
其中,regex 表示正则表达式;replacement 表示用于替换的字符串。例如:
String words = "hello java,hello php";
String newStr = words.replaceFirst("hello","你好 ");
System.out.println(newStr); // 输出:你好 java,hello php
replaceAll() 方法
replaceAll() 方法用于将目标字符串中匹配某正则表达式的所有子字符串替换成新的字符串,其语法形式如下:
字符串.replaceAll(String regex, String replacement)
其中,regex 表示正则表达式,replacement 表示用于替换的字符串。例如:
String words = "hello java,hello php";
String newStr = words.replaceAll("hello","你好 ");
System.out.println(newStr); // 输出:你好 java,你好 php
字符串查找
字符串查找分为两种形式:
- 在字符串中获取匹配字符(串)的索引值
- 在字符串中获取指定索引位置的字符
根据字符查找
String 类的 indexOf()
方法和 lastlndexOf()
方法用于在字符串中获取匹配字符(串)的索引值。
1. indexOf() 方法
indexOf() 方法用于返回字符(串)在指定字符串中首次出现的索引位置,如果能找到,则返回索引值,否则返回 -1。该方法主要有两种重载形式:
str.indexOf(value)
str.indexOf(value,int fromIndex)
其中,str 表示指定字符串;value 表示待查找的字符(串);fromIndex 表示查找时的起始索引,如果不指定 fromIndex,则默认从指定字符串中的开始位置(即 fromIndex 默认为 0)开始查找。
例如,下列代码在字符串“Hello Java”中查找字母 v 的索引位置。
String s = "Hello Java";
int size = s.indexOf('v'); // size的结果为8
上述代码执行后 size 的结果为 8,它的查找过程如图 1 所示。
例 1
编写一个简单的 Java 程序,演示 indexOf() 方法查找字符串的用法,并输出结果。代码如下:
public static void main(String[] args) {
String words = "today,monday,sunday";
System.out.println("原始字符串是'"+words+"'");
System.out.println("indexOf(\"day\")结果:"+words.indexOf("day"));
System.out.println("indexOf(\"day\",5)结果:"+words.indexOf("day",5));
System.out.println("indexOf(\"o\")结果:"+words.indexOf("o"));
System.out.println("indexOf(\"o\",6)结果:"+words.indexOf("o",6));
}
运行后的输出结果如下:
原始字符串是’today,monday,sunday’
indexOf(“day”)结果:2
indexOf(“day”,5)结果:9
indexOf(“o”)结果:1
indexOf(“o”,6)结果:7
2. lastlndexOf() 方法
lastIndexOf() 方法用于返回字符(串)在指定字符串中最后一次出现的索引位置,如果能找到则返回索引值,否则返回 -1。该方法也有两种重载形式:
str.lastIndexOf(value)
str.lastlndexOf(value, int fromIndex)
注意:lastIndexOf() 方法的查找策略是从右往左查找,如果不指定起始索引,则默认从字符串的末尾开始查找。
例 2
编写一个简单的 Java 程序,演示 lastIndexOf() 方法查找字符串的用法,并输出结果。代码如下:
public static void main(String[] args) {
String words="today,monday,Sunday";
System.out.println("原始字符串是'"+words+"'");
System.out.println("lastIndexOf(\"day\")结果:"+words.lastIndexOf("day"));
System.out.println("lastIndexOf(\"day\",5)结果:"+words.lastIndexOf("day",5));
System.out.println("lastIndexOf(\"o\")结果:"+words.lastIndexOf("o"));
System.out.println("lastlndexOf(\"o\",6)结果:"+words.lastIndexOf("o",6));
}
运行后的输出结果如下:
原始字符串是’today,monday,Sunday’
lastIndexOf(“day”)结果:16
lastIndexOf(“day”,5)结果:2
lastIndexOf(“o”)结果:7
lastlndexOf(“o”,6)结果:1
根据索引查找
String 类的 charAt() 方法可以在字符串内根据指定的索引查找字符,该方法的语法形式如下:
字符串名.charAt(索引值)
提示:字符串本质上是字符数组,因此它也有索引,索引从零开始。
charAt() 方法的使用示例如下:
String words = "today,monday,sunday";
System.out.println(words.charAt(0)); // 结果:t
System.out.println(words.charAt(1)); // 结果:o
System.out.println(words.charAt(8)); // 结果:n
1.常见String类的获取功能
- public int length(): 获取字符串的长度。
- public char charAt(int index): 获取指定索引位置的字符
- public int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引。
- public int indexOf(String str): 返回指定子字符串在此字符串中第一次出现处的索引。
- public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
- public int indexOf(String str,int fromIndex): 返回指定子字符串在此字符串中从指定位置后第一次出现处的索引。
- public String substring(int beginIndex): 从指定位置开始截取字符串,默认到末尾。
- public String substring(int beginIndex, int endIndex): 返回一个新字符串从指定位置开始到指定位置结束截取字符串。(beginIndex 到 endIndex -1的所有字符)
2.常见String类的判断功能
- public boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写
- public boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
- public boolean contains(String str): 判断字符串中是否包含传递进来的字符串,即当且仅当此字符串包含指定的 char 值序列时(此字符串包含 str则),返回 true。
- public boolean startsWith(String str): 判断字符串是否以指定的的字符串开头
- boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
- public boolean endsWith(String str): 判断字符串是否以传递进来的字符串结尾
- public boolean isEmpty(): 判断字符串的内容是否为空串。
3.常见String类的转换功能
- public byte[] getBytes(): 把字符串转换为字节数组。
- public char[] toCharArray(): 把字符串转换为字符数组。
- public static String valueOf(char[] chs): 把字符数组转成字符串。
- public static String valueOf(int i): 把int类型的数据转成字符串。(String类的valueOf方法可以把任意类型的数据转成字符串。)
- public String toLowerCase(): 把字符串转成小写。使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
- public String toUpperCase(): 把字符串转成大写。 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
- public String concat(String str): 把字符串拼接。将指定字符串连接到此字符串的结尾。
4.常见String类的其他常用功能
- public String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
- public String replace(String old,String new) :将指定字符串进行互换
- public String trim() 去除两端空格
- public int compareTo(Object o) : 把这个字符串和另一个对象比较。
- public int compareTo(String anotherString) : 按字典顺序比较两个字符串。
- public int compareToIgnoreCase(String str): 按字典顺序比较两个字符串,不考虑大小写。
其他方法
SN(序号) |||| 方法描述
-
boolean contentEquals(StringBuffer sb): 当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。
-
static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String。
-
static String copyValueOf(char[] data, int offset, int count): 返回指定数组中表示该字符序列的 String。
-
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin): 将字符从此字符串复制到目标字符数组。
-
String intern():返回字符串对象的规范化表示形式。
-
int lastIndexOf(int ch): 返回指定字符在此字符串中最后一次出现处的索引。
-
int lastIndexOf(int ch, int fromIndex):返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
-
int lastIndexOf(String str)
返回指定子字符串在此字符串中最右边出现处的索引。 -
int lastIndexOf(String str, int fromIndex)
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 -
String toString()
返回此对象本身(它已经是一个字符串!)。