【Java字符串】
Java字符串
字符串是由数字、字母、下划线组成的一串字符。字符串是用于表示文本的数据类型,属于引用数据类型,在内存中的存储方式和数组类似,其中的每个字符都能够读取。
创建字符串
字符串是Java中较为特殊的类,由Java类库中提供一个String类用于创建和操作字符串,被广泛应用于Java编程中。在Java中定义一个字符串最直接的方法就是使用双引号将字符括起来,或者使用new关键字新建一个字符串对象。
常见构造字符串的方法
方法一:使用双引号(“”)
String str = "Hello Java";
使用双引号引起来的字符本身就是一个字符串对象,所以可以将其赋值给String字符串类型的变量。
方法二:使用new关键字创建一个字符串对象
String str = new String("Hello Java");
Java中的String类有11种构造方法可以构造字符串,根据传入的参数不同调用不同的构造方法去构造字符串,如传入字符数组作为参数。
方法三:传入字符数组作为参数创建对象
char[] ch = {'H','e','l','l','o',' ','J','a','v','a'};
String s = new String(ch);
System.out.println(s);
//执行结果
Hello Java
在Java底层中存储字符串的方式也是类似于存储字符数组的方法,所以其中的每个元素才能单独访问。
注意事项:
- 在java中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。
- 如"Hello Java"这样用双引号引起来的字面值常量,也是String类型的字符串对象。
- String是引用数据类型,所以其内存布局如下图所示。
【内部布局图片】
字符串的操作
Java中的String类提供了许多方便操作字符串的方法。
方法名 | 说明 |
---|---|
char charAt(int index) | 返回指定索引位置的字符 |
String concat(String str) | 拼接指定字符串到一个字符串的尾部 |
boolean equals(Object anObject) | 将字符串与指定对象作比较 |
boolean equalsIgnoreCase(String anotherString) | 将两个字符串作比较,不考虑大小写 |
int indexOf(char ch / String str) | 查找指定字符/字符串在字符串中第一次出现的位置,并返回对应的索引值 |
int indexOf(char ch / String str, int fromIndex) | 从指定索引开始查找字符/字符串第一次出现的位置,并返回对应的索引值 |
int length() | 返回字符串的长度 |
String replace(char oldChar, char newChar) | 将字符串中的所有oldChar字符替换成newChar字符,并返回替换后新字符串 |
String replaceFirst(String regex, String replacement) | 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串 |
String replaceAll(String regex, String replacement) | 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串为字符串数组,不限制个数。 |
String[] split(String regex, int limit) | 根据给定正则表达式的匹配拆分此字符串为字符串数组,限制字符串数组元素个数为limit个 |
String subString(int beginIndex) | 从begineIndex索引开始截取字符串 |
String subString(int beginIndex, int endIndex) | 从begineIndex索引开始截取字符串到endIndex索引为止 |
char[] toCharArray() | 将字符串转换为字符数组 |
String toLowerCase() | 将字符串中的字符全部转换为小写 |
String toUpperCase() | 将字符串中的字符全部转换为大写 |
String trim() | 去除字符串首尾的空格 |
boolean isEmpty() | 判断字符串是否为空 |
字符串拼接
"+"运算符
字符串拼接是非常常用的操作,Java语言提供了很多拼接字符串的方式,而其中使用"+"号拼接字符串是最简单、快捷,也是使用频率最高的一种拼接方式。
String str1 = "Hello";
String str2 = "World";
System.out.println(str1 + str2);
//执行结果
HelloWorld
上述代码将字符串"Hello"和字符串"World"拼接为一个新的字符串"HelloWorld"再将其作为返回值返回。当使用"+"拼接字符串时,若拼接的是其他的数据类型如int整型、double浮点型等,会自动将其转换为字符串。
int i = 120;
System.out.println("当前的车速为:" + i);
//执行结果
当前的车速为:120
若当前字符串的长度过长时,也可以将其分行书写,方便阅读。
String str = "Hello Java"
+ "Hello World"
+ "你好 Java"
+ "你好 世界";
每一个被"“双引号引起来的字符都是一个字符串对象,而其通过”+"号的拼接又构成了一个整体的字符串对象。
concat()方法
Java类库中的String类提供了concat()方法来拼接字符串,将一个字符串拼接到另一个字符串的后面,形成新的字符串。
基础语法格式:
字符串1.concat(字符串2);
示例:
String str = "Java";
str = str.concat("语言");
str = str.concat("是非常强大的");
str = str.concat("一门计算机编程语言");
System.out.println(str);
//执行结果
Java语言是非常强大的一门计算机编程语言
使用concat()方法拼接字符串,一次只能拼接两个字符串,若需要拼接多个字符串则需要多次调用方法进行拼接。
字符串的长度
在Java中,如果要获取字符串的长度,可以使用String类提供的length()方法。
基础语法格式:
字符串名.length();
调用此方法之后其会返回一个int类型的数据,返回字符串对象包含的字符数,即字符串的长度。
示例:
String str = "Hello World";
int len = str.length();
System.out.println("字符串str的长度为:" + len);
//执行结果
字符串str的长度为:11
字符串大小写转换
String类中的toUpperCase()和toLowerCase()方法可以将字符串大小写进行转换。
- toUpperCase():将字符串中的字母转换为大写格式
- toLowerCase():将字符串中的字母转换为小写格式
基础语法格式:
字符串.toUpperCase();
字符串.toLowerCase();
示例:
String str1 = "abc1de";
System.out.println(str1.toUpperCase());
String str2 = "FGH2IJ";
System.out.println(str2.toLowerCase());
//执行结果
ABC1DE
fgh2ij
对于字符串中不是字母的字符来说,是不会受到影响的。
字符串消除空格
在字符串的首尾有时会存在有一些空格,但这些空格又没有什么实际意义,且还可能影响字符串的操作,这时就需要消除掉这些空格。String类则提供了一个trim()方法来实现这一操作。
基础语法格式:
字符串.trim(); //消除字符串首尾的空格,但并不会消除字符串中的空格
示例:
String str1 = " Hello ";
System.out.println(str1.trim());
String str2 = " Hello World ";
System.out.println(str2.trim());
//执行结果
Hello
Hello World
空格的存在会影响到字符串的长度,从而影响到字符串的操作,如果不确定要操作的字符串首尾是否存在空格,最好是在操作前先消除字符串首尾的空格,然后再对其进行操作。
字符串截取
在对字符串进行操作的时候,有时需要将字符串中的部分截取出来再进行操作。String类提供了substring()方法来截取字符串,且该方法还有重载方法。
- substring(int beginIndex):从beginIndex索引位置开始截取字符串,直至字符串的结尾。
- substring(int beginIndex,int endIndex):从beginIndex索引位置开始截取字符串,直至endIndex索引位置,且为左闭右开区间 [beginIndex,endIndex)。
基础语法格式:
字符串.substring(int beginIndex);
字符串.substring(int beginIndex,int endIndex);
示例:
String str = "Hello World";
System.out.println(str.substring(4));
System.out.println(str.substring(0,4));
//执行结果
o World
Hell
字符串分割
字符串分割是将字符串按照指定的分割符对字符串进行分割,分割后的字符串以字符串数组的形式返回。String类提供split()方法来对字符串进行分割,且可以设置分割的字符串的个数限制。
- split(String sign):将字符串以sign作为分割符对字符串进行分割,直至将整个字符串分割完
- split(String sign, int limit):将字符串以sign作为分隔符对字符串进行分割,且将字符串分割为limit个数之后将不再分割(不管后面是否还有分割符)
基础语法格式:
字符串.split(String sign);
字符串.split(String sign, int limit);
示例:
String str = "Hello World Hello Java";
String[] s1 = str.split(" "); //以空格作为分割符,不限制元素数量
String[] s2 = Str.split(" ",3); //以空格作为分割符,且限制元素为3个
for(int i = 0; i < s1.length; i++){
System.out.println(s1[i]);
}
System.out.println("------------------");
for(int i = 0; i < s2.length; i++){
System.out.println(s2[i]);
}
//执行结果
Hello
World
Hello
Java
------------------
Hello
World
Hello Java
需要注意的是若当此时的分割符为".“或”|"是需要使用转义字符对其转义之后才能够使用。
如果分隔符为".",则需要写成String.split("\\.")
,不能写为String.split(".")
。
如果分隔符为"|",则需要写成String.split("\\|")
,不能写为String.split("|")
。
字符串替换
String类提供了三种替换方法,replace()、replaceFirst()、replaceAll()。
- replace():将目标字符串的指定字符/字符串,替换为指定的字符/字符串。
- replaceFirst():将目标字符串中匹配正则表达式的第一个字符串替换为指定的字符串。
- replaceAll():将目标字符串中匹配正则表达式的所有字符串替换为指定的字符串。
基础语法格式:
//replace方法
字符串.replace(char oldChar, char newChar)
字符串.replace(String target, String replacement)
//replaceFirst方法
字符串.replaceFirse(String regex, String replacement)
//replaceAll方法
字符串.replaceAll(String regex, String replacement)
示例:
String str = "hell3oworl2dhell9oJav0a";
System.out.println(str.replace('e','E'));
System.out.println(str.replace("e","E"));
System.out.println(str.replaceFirst("e","E"));
System.out.println(str.replaceAll("\\d","A"));
System.out.println(str.replaceAll("3","9"));
//执行结果
hEll3oworl2dhEll9oJav0a
hEll3oworl2dhEll9oJav0a
hEll3oworl2dhell9oJav0a
hellAoworlAdhellAoJavAa
hell9oworl2dhell9oJav0a
字符串比较
字符串较是较为常见的操作,比较字符串是否完全一致,比较字符串的长度是否相同等等。String类提供了两种方法来比较字符串,equals()、equalsIgnoreCase()。
- equals():逐个比较字符串的每个字符是否相同,相同则返回true,不同则返回false。若两个字符串的长度不同自然不会每个字符都相同,返回false。
- equalsIgnoreCase():逐个比较字符串的每个字符是否相同,但比较时不区分大小写,'a’和’A’也视为相同。
基础语法结构:
字符串1.equals(字符串2);
字符串1.equalsIgnoreCase(字符串2);
示例:
String str1 = "abc";
String str2 = new String("abc");
String str3 = "Abc";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str1.equalsIgnoreCase(str3));
//执行结果
true
false
true
equals()和==
若是基础数据类型要比较它们是否相等,可以使用==
运算符来进行。
int a = 10;
int b = 10;
Syste,.out.println(a == b);
//执行结果
true
而若将其使用到引用数据类型中,则会有所不同。如,String类型。
String str1 = "Hello World";
String str2 = "Hello World";
System.out.println(str1 == str2);
//执行结果
false
因为引用数据类型的变量存储的是对象的地址,而用==
运算符来比较地址除了两个引用指向的是同一个地址否则都会返回false,所以要比较引用数据类型是不能使用==
运算符来进行比较。
字符串查找
在字符串中查找字符或字符串是较为常见的操作。String类提供了两个方法用于在字符串中查找相应字符的索引,或查找相应索引的字符,分别为indexOf()、charAt()。
- indexOf():在字符串中查找首个匹配的字符/字符串,如果存在匹配的元素则返回相应的索引值,否则返回-1。
- charAt():根据指定的索引值查找字符串中的字符。
基础语法格式:
字符串.indexOf(String value);
字符串.charAt(int index);
示例:
String str = "hello world";
System.out.println(str.indexOf('o'));
System.out.println(str.indexOf("world"));
System.out.println(str.charAt(3));
//执行结果
4
6
l
两种在字符串查找的方法,一种是根据字符找索引,一种是根据索引查找字符,根据自己的需要灵活运用这两个方法。