8.6 字符串String类
String 类我们在前面章节介绍过,并且把它放在了int、double、boolean这些类型的后面,实际上String和这些类型有本质区别:
String是一个类。
类就有属性,而String的属性很简单,就是一个字符类型的数组,表现出来是一个双引号引着的n个字符,例如
String str="i am a student learning Java.";
对象的行为表现为函数,接下来要学习的就是String类的函数。
| 返回类型 | 函数名及参数 | 说明 | 示例 |
|---|---|---|---|
| int | length() | 计算字符串的长度 | String a="abcedf";那么a.length()的值就是6 |
| char | charAt(int i) | 返回下标为i的字符是多少,下标从0开始 | String a="abcedf"; a.charAt(0)的值就是'a' |
| boolean | equals(String str) | 计算对象和str的内容是否一致,比较两个字符串的值是否相等不能使用==,只能使用本函数 | String a="abcedf"; String b="abcedf"; String c="12";那么a.equals(b)的值就是true,a.equals(c)的值就是false |
| boolean | equalsIgnoreCase(String str) | 忽略大小写,计算对象和str的内容是否一致 | String a="abcedf"; String b="Abcedf"; String c="12"; 那么a.equalsIgnoreCase(b)的值就是true |
| String | toUpperCase() | 把字符串里面所有的字母都变成大写。(原字符串值不变) | String a="abcedf12F"; a=a.toUpperCase()后a的值就是"ABCDEFG12F" |
| String | toLowerCase() | 把字符串里面所有的字母都变成小写。(原字符串值不变) | String a="ABCDEFG12F"; a=a.toLowerCase()后a的值就是"abcedf12F" |
| String | trim() | 把字符串前后的空格删掉,包括空格、tab字符,转行。(原字符串值不变) | String a="abcedf "; a=a.trim()后a的值就是"abcedf" |
| String | substring(int start,int end) | 截取字符串,从下标start开始到下标end结束,其中包含start但不包含end。end参数可以没有,表示截取到末尾。(原字符串值不变) | String a="abcedf12F"; a.substring(1,3)的值是"bc" a.substring(0,3)的值是"abc" a.substring(3)的值是"edf12F" |
| int | indexOf(String str) | str在字符串中第一次出现的下标。如果没有出现过,返回-1 | String a="abcedf12F"; a.indexOf("ce")的值就是2 |
| int | lastIndexOf(String str) | str在字符串中最后一次出现的下标。如果没有出现过,返回-1 | String a="abcedfb2F"; a.lastIndexOf("b")的值就是6 |
| int | indexOf(String str,int k) | str在字符串中从下标k开始,第一次出现的下标。如果没有出现过,返回-1 | String a="abcedfceF"; a.indexOf("ce",4)的值就是6 |
| int | lastIndexOf(String str,int k) | str在字符串中从下标k开始,最后一次出现的下标。如果没有出现过,返回-1 | String a="abcedfb2F"; a.lastIndexOf("b",3)的值就是6 |
| String | replaceAll(String str1,String str2) | 把字符串中所有str1替换成str2。(原字符串值不变) | String a="abceadfab2F"; a.replaceAll("a","A")的计算结果是"AbceAdfAb2F" a.replaceAll("a","")表示删掉所有字符'a',计算结果是"bcedfb2F" |
| String | + | 两个字符串或数值前后相连 | String a="abceadfab2F"; a=a+"3";后a的值是"abceadfab2F3" |
| char[] | toCharArray() | 将字符串的字符保存到一个字符数组(原字符串值不变) | String a="abceadfab2F"; a.toCharArray()后得到一个字符数组,它值是{'a','b','c','e','a','d','f','a','b','2','F'} |
| String[] | split(String str) | 将字符串按照str为分隔字分成一个数组,str可以是正则表达式 | String a="abceadfab2F"; a.split("a")后得到的数组是{"bce","df","b2f"} |
| char[] | toCharArray() | 将字符串的字符保存到一个字符数组(原字符串值不变) | String a="abceadfab2F"; a.toCharArray()后得到一个字符数组,它值是{'a','b','c','e','a','d','f','a','b','2','F'} |
| boolean | contains(String str) | 假如对象内容包含str的值,那么返回true;否则返回false | String a="abceadfab2F"; a.contains("ab")的值是true a.contains("abd")的值是false |
官方文档String
这些是String类的一些常用函数,在面向对象里面,我们称它们为方法(method)。函数、方法这两个术语不用区分。它们就是对象的行为。使用方法是:
对象名.方法名(参数)
注意有些方法是没有参数的,这类方法只需要对象本身的属性就能计算,例如str.length():计算字符串str的长度
下面是一个使用substring,indexOf和replace的例子,提取一个HTML片段的内容,a是一段html代码片段:
public static void main(String[]args){
String a="< li id='li_010000'>< a href='#' onclick='getSubChapter('010000')'>第1章& nbsp;& nbsp;Java基础< /a>"+"< li id='li_020000'>< a href='#'onclick='getSubChapter('020000')'>第2章& nbsp;& nbsp;变量和运算符< /a>"+"< li id='li_030000'>< a href='#' onclick='getSubChapter('030000')'>第3章& nbsp;& nbsp;分支结构< /a>'"+"< li id='li_040000'>< a href='#'onclick='getSubChapter('040000')'>第4章& nbsp;& nbsp;循环结构< /a>";
int start=-1;
while(true){
//获得开始的位置
start=a.indexOf("第",start+1);
//获得结束的位置
int end=a.indexOf("< /a>",start+1);
//找不到"第"字,结束循环
if(start==-1)
break;
//切出片段
String t=a.substring(start,end);
//删掉中间的HTML
t=t.replaceAll("& nbsp;"," ");
System.out.println(t);
}
}
public static void main(String args[]){
String a="abceadfab2F";
//数组temp的值是{"","bce","df","b2f"}
String[]temp=a.split("a");
//打印temp
for(int i=0;i < temp.length;i++)
System.out.println(temp[i]);
}
练习题
-
完成下面的练习1.下面那个说法是错误的 (2分) [选择]A.
B. String str里,String是类,str是对象
C. length()方法是求字符串长度,它必须由一个对象来调用
D. String可以直接调用上面的方法,例如String.charAt(0)
E. String的对象可以有无数个,它们都可以调用String的方法
2.使用equals这个函数用来比对两个字符串的内容是否相等 (2分) [编程填空]特别注意!==操作符并不能比对两个字符串的值,==在这里的意义是两个字符串是不是同一个对象,这和整型等类型完全不同。两个String对象的内容一样的情况下,使用==比对有可能返回false。
使用String的equals函数,比较str和str2的值是否相等String str2="12345";if( ) System.out.println("内容相等");3.阅读下面的代码填空 (4分) [填空]str在这里是String类的一个对象,str调用了length函数,而length函数是不需要参数就能计算的。
i的值是
c的值是' ' -
已知str对象如代码所示,按照要求调用函数1.取得str第4个字符,赋给字符c (2分) [填空(编程批改)]char c= ;2.str所有字母字符转换成大写 (2分) [编程填空]
String str="abc123456EFG";str= ;/*应该打印ABC123456EFG */System.out.println(str);3.str所有字母字符转换成小写 (2分) [编程填空]String str="abc123456EFG";str= ;/*应该打印出abc123456efg */System.out.println(str);4.截取str里面的数字 (2分) [编程填空]使用subString函数截取String str="abc123456EFG";String number= ;/*应该打印出123456 */System.out.println(number);5.把str里面的"123456"替换成"de" (2分) [编程填空]String str="abc123456EFG";str= ;/*应该打印abcdeEFG */System.out.println(str);6.寻找str字符串里,第一个出现"123"字符串的位置,并赋值给整型变量m (2分) [编程填空]String str="abc123456EFG";int m= ;/*应该打印3 */System.out.println(m); -
编程题1.从键盘输入字符串,赋值给字符串对象str,然后把str里面的字母全部转换成大写字母并打印 (10分) [编程]import java.util.Scanner;键盘输入字符串的代码如下:
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
仍然是使用Scanner,使用函数next就可以获取输入的字符串2.判断字符串为空 (10分) [编程]import java.util.Scanner;字符串为空有两种情况,一种是内容为空,例如str="",注意内容比较应该使用equals方法,不能使用==
一种是未分配内存,例如String str;,str一直没有初始化。
普通变量不同的是,字符串是对象,如果没有初始化,那么它的值就是null,null是一个关键字,表示对象内存未分配
输入一个字符串str,判断是否为空。如果为空打印true,否则打印false3.字符串的replace方法 (10分) [编程]import java.util.Scanner;replaceAll(String str1,String str2)
它有两个参数,看上面的表格,是这样描述的“把字符串中所有str1替换成str2。
有一个特殊的用法,str2如果设置成空串"",相当于把对象里面所有的str1删除掉!
输入一个字符串str,使用replaceAll方法删掉它所有的内部空格,例如abc d 123就会变成abcd123。然后打印。