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"
StringtoLowerCase()把字符串里面所有的字母都变成小写。(原字符串值不变)String a="ABCDEFG12F";
a=a.toLowerCase()后a的值就是"abcedf12F"
String
trim()
把字符串前后的空格删掉,包括空格、tab字符,转行。(原字符串值不变)String a="abcedf  ";
a=a.trim()后a的值就是"abcedf"
Stringsubstring(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在字符串中最后一次出现的下标。如果没有出现过,返回-1String 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开始,最后一次出现的下标。如果没有出现过,返回-1String 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);
    }
}
这个例子是关于split方法的:
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,否则打印false
    3.字符串的replace方法 (10分) [编程]
    import java.util.Scanner;
    replaceAll(String str1,String str2)
    它有两个参数,看上面的表格,是这样描述的“把字符串中所有str1替换成str2。
    有一个特殊的用法,str2如果设置成空串"",相当于把对象里面所有的str1删除掉!

    输入一个字符串str,使用replaceAll方法删掉它所有的内部空格,例如abc d 123就会变成abcd123。然后打印。