Java第十章字符串

字符串是Java程序中经常处理的对象,如果字符串运用得不好,将影响到程序运行的效率。在Java中,字符串作为String类的实例来处理。以对象的方式处理字符串,将使字符串更加灵活、方便。了节字符串上可用的操作,可以节省程序编写与维护的时间。本章从创建字符串开始讲解字符串本身的特性以及字符串上可用的重要操作等。

10.1String类
单个字符可以用char类型保存,多个字符组成的文本就需要保存在String对象中。String通常被称为字符串,一个String对象对象最多可以保存(2的32次方-1)个字节(占用4GB空间大小)的文本内容。

10.1.1声明字符串
在Java语言中,字符串必须包含在双引号“”之内

10.1.2创建字符串
在Java语言中,将字符串作为对象来处理,因此可以像创建其他类对象一样来创建字符串对象。创建对象要使用类的构造方法。String类的常用构造方法如下。

String(char a[])

该方法用以一个字符数组a创建Sting对象,代码如下:

char a[]={'g','o','o','d'};
String s = new String(a);
 
 
//等同于
 
 
String s =new Sting("good")
这是最常见的方法

10.2连接字符串
对于已声明的字符串,可以对其进行相应的操作,连接字符串就是字符操作中较简单的一种。可以对多个字符串进行连接,也可使字符串与其他数据类型进行连接。

10.2.1连接多个字符串
使用“+”运算符可实现连接多个字符串的功能。“+”运算符可以连接多个String对象并产生一个新的String对象。

例题10.1

public class Join{  //创建类
    public static void main(String args[]){ //主方法
        String s1 =new String("春色绿千里");  //声明String对象s1
        String s2 =new String("马蹄香万家");  //声明String对象s2
        string s =s1 +"\n"+s2;  //将对象s1、“\n”和对象s2连接并将结果赋值给s
        System.out.println(s);    //将s输出
    }
}
输出结果

春色绿千里
马蹄香万家
10.2.2连接其他数据类型
字符串也可同其他基本数据类型进行连接。如果将字符串同其他类型数据进行数据类型的数据直接转换成字符串。

例题10.2

public class Link{      //创建类
    public static void main(String args[]){    //主方法
        int booktime =4;        //声明的int型变量booktime
        float practice =2.5f;  //声明的float型变量practice
        //将字符串与整型、浮点型变量相连,并将结果输出
        System.out.println("我每天花费"+booktime+"小时看书;"+practice+"小时上机练习");
        }
}
运行结果

我每天花费4小时看书;6.5小时上机练习
在这里booktime和practice都不是字符串,当他们与字符串相连时会自动调用toString()方法并转换成字符串形式,然后参与字符串连接。

10.3获取字符串长度
字符串作为对象,可通过相应方法获取字符串的有效信息,如获取某字符串的长度、某个索引位置的字符串等。本节将讲解几种获取字符串的相关信息的方法。

10.3.1获取字符串长度
使用Sring类的length()方法可获取声明的字符串对象的长度。语法如下:

str.length();
其中,str为字符串对象。

获取字符串长度,代码如下:

String str ="We are students";
int size =str.length();
10.3.2字符串查找
String类提供了两种查找字符串的方法,即indexOf()与lastIndexOf()方法。这两种方法都允许在字符串中搜索指定条件的字符或字符串。indexOf()方法返回的是搜索的字符或字符串首次出现的位置,lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置。

        (1)indexOf(String s)

        该方法用于返回参数字符串s在指定字符串中首次出现的索引位置。当调用String类的indexOf()方法时,会从当前字符串的位置开始搜索s的位置。如果没有检索到字符串s,该方法的返回值是-1。语法如下:
 

str.indexOf(substr)
 str:任意字符串对象。

        substr:要搜索的字符串。

        查找字符a在字符串str中的索引位置,代码如下:

String str = "We are students";
int size = str.indexOf("a");//变量size的值是3
(2)lastindexOf(String str)

        该方法用于返回指定字符串最后一次出现的索引位置。当调用String类的lastIndexOf()方法时,会从当前字符串的开始位置检查参数字符串str,并将最后一次出现str的索引位置返回。如果没有检索到字符串str,该方法返回-1。语法如下:
 

str.lastIndexOf(substr)
 str:任意字符串对象。

        substr:要搜索的字符串。

        说明lastIndexOf()方法中的参数是空字符串""(注意没有空格),则返回的结果与调用length()方法的返回结果相同。

public class Test {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String str = "we are students";//定义字符串str
        int size = str.lastIndexOf("");//将空字符串在str中的索引位置赋值给变量size
        System.out.println("空字符串在字符串str中的索引位置是:"+size);//将变量size输出
        System.out.println("字符串str的长度是:"+str.length());//将字符串str的长度输出
    }
 
}
空字符串在字符串中str中的索引位置是15
字符串str的长度是15
10.3.3获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。语法如下:

str.charAt(index)
str:任意字符串。

        index:整型值,用于指定要返回字符的下标。

        例题:查看指定索引位置上的字符

        在项目中创建Ref类,在主方法中创建String对象,使用charAt()方法查看字符串,str中索引位置是6的字符。

public class Ref {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String str = "hello word";//定义字符串str
        char mychar = str.charAt(6);//将字符串str中索引位置是6的字符返回
        System.out.println("字符串str中索引位置是6的字符为:"+mychar);//输出信息
    }
 
}
字符串str中索引位置是6的字符为w
10.4字符串操作 
 (1)获取子字符串
通过string类的substring()方法可对字符串进行截取。substring()方法被两种不同的重载形式,来满足不同的需求。

1,substring(int beginIndex)【前索引,后索引(前含后不含)】该方法返回是从指定的索引位置开始截取直到该字符串结尾的子串
str.substring(int beginIndex)

beginIndex:指定从某一索引处开始截取字符串   代码如下:

String str = "hello word";
String substr = str.substring(3);
public class Subs {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String str = "《将进酒》:李白(唐)";//定义的字符串
        String substr = str.substring(6,8);//对字符串进行获取
        System.out.print("《将进酒》的作者是:"+ substr);//输出获取后的字符串
    }
 
}
《将进酒》的作者是:李白
10.4.2去除空格
trim()方法返回字符串的副本,忽略前导空格和尾部空格:

str.trim()
public class Black {
    //创建类
     public static void main(String[] args) {//主方法
      // TODO Auto-generated method stub
      String str = "   java  class   ";//定义字符串str
      System.out.println("字符串原来的长度:"+str.length());
      //教案str原来的长度输出
      //将str去掉前导空格和尾部空格后的长度输出
      System.out.println("去掉空格后的长度:"+str.trim().length());
     }
 
}
字符串原来的长度:17
去掉空格后的长度:11
10.4.3字符串替换
replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。

str.replace(CharSequence target,CharSequence replacement)

 
public class NewStr {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String str = "address";//定义字符串str
  String newstr = str.replace("a", "A");
  //将str中“a”替换成“A”并返回新字符串newstr
  System.out.println(newstr);//输出
 }
 
}
10.4.4判断字符串的开始与结尾
startsWith()方法与endsWith()方法分别用于判断字符串是否以指定的内容开始或结束,这两个方法的返回值都是Boolean类型。

1,startsWith()方法   该方法用于判断当前字符串对象的前缀是否为参数指定的字符串结束


str.startsWith(String prefix)

prefix:指作为前缀的字符串

2,endsWith方法   该方法用于判断当前字符串是否为以给定的字符串结束

str.endsWith(String suffix)

public class StartOrEnd {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String num1 = "22045612";
        String num2 = "21304578";
        boolean b = num1.startsWith("22");//判断字符串num1是否以22开始
        boolean b2 = num2.endsWith("78");//判断字符串num2是否以78结束
        System.out.println("字符串num1是以‘22’开始的吗?"+b);
        System.out.println("字符串num2是以‘78’结束的吗?"+b2);//输出信息
    }
 
}
字符串num1是以‘22’开始的吗?true
字符串nun2是以‘78’结尾的吗?true
10.4.5判断字符串是否相等
       
1.对字符串对象进行比较不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同。
        2.即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回false。使用比较运算符比较两个字符串,代码如下:
String tom = new String("i am a student");
String jerry = new String("i am a student");
boolean b = (tom == jerry);
        因此,要比较两个字符串内容是否相等,应使用equals()方法和equalsignorecase()方法。
        3.equals()方法

    1.如果两个字符串具有相同的字符和长度,则使用equals()方法进行比较时,返回true。否则,返回false。语法如下:
str.equals(String otherstr)

4.equalsIgnoreCase()方法
                1.忽略了大小写的情况比较两个字符串是否相等,返回结果为Boolean类型。语法如下:

str.equalsIgnoreCase(String otherstr)

public class Opinion {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String s1 = new String("abc");
        String s2 = new String("ABC");
        boolean b = s1.equals(s2);
        boolean b2 = s2.equalsIgnoreCase(s2);
        System.out.println(s1 + "equals" + s2 + ":" + b);
        System.out.println(s1 + "equalsIgnoreCase" + s2 + ":" + b2);
    }
 
}
10.4.6按字典顺序比较两个字符串
 compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将String对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数;如果按子典顺序此String对象位于之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0。语法如下:
 

str.compare To(String otherstr)
 其中,str、otherstr是要比较的两个字符串对象。

        说明:compareTo()方法只有在equals(Object)方法返回true时才返回0。

        例题:判断字母b的位置

        在项目中创建Wordbook类,在主方法中创建3个String变量,它们的值分别为a、b和c,使用compare To()方法判断字母b的位置,即在字母a的后面,在字母c的前面。实例代码和结果如下:
 

public class Wordbook {
 
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String str = new String("b");
        String str2 = new String("a");
        String str3 = new String("c");
        System.out.println(str + "compareTo" + str2 + ":"
        + str.compareTo(str2));
        System.out.println(str + "compareTo" + str3 + ":"
                + str.compareTo(str3));
    }
}
compareTo:1
compareTo:-1
10.4.7字母大小写转换
String类的toLowerCase()方法可将字符串中的所有大写字母改写为小写字母,而toUpperCase()方法可将字符串中的所有小写字母改成大写字母。

        (1)toLowerCase()方法

        该方法将字符串中的所有大写字母转换为小写字母。如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变。语法如下:
str.toLowerCase()

 其中,str是要进行转换的字符串

        (2)toUpperCase()方法

        该方法将字符串中的所有小写字母转换为大写字母。如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变。语法如下:

其中,str是要进行转换的字符串

        说明:使用toLowerCase方法和toUpperCase()方法进行大小写转换时,数字或其他非英文字母类字符不受影响。

10.4.8字符串分割
使用split()方法可以使字符串按指定的分割字符或字符串进行分割,并将分割后的结果存放在字符串数组中。split()方法提供了以下两种字符串分割形式。

        (1)split(String sign)

        该方法可根据给定的分割符对字符串进行拆分。语法如下:
str.split(String sign)

其中,sign为分割字符串的分割符,也可以使用正则表达式。

        说明:没有统一的对字符进行分割的符号。如果想定义多个分割符,可使用符合“|”。例如“|=”表示分割符为“,”和“=”。

        (2)split(String sign,int limit)

        该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数。语法如下:
str.split(String sign,int limit)

sign:分割字符串的分割符,也可以使用正则表达式。

        limit:限制的分割次数。

10.5格式化字符串
  String类的静态format()方法用于创建格式化的字符串。format()方法有两种重载形式。

        (1)format(String format,Object...agrs)

        该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认的语言环境。语法如下:

str.format(String format,Object...agrs)
        format:格式字符串
        agrs:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0。

        (2)format(Local l,String format Object...args)

        该方法使用指定的语言环境、格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用其指定的语言环境。语法如下:
 

format(Local l,String format Object...args)
 
  l:格式化过程中要应用的语言环境。如果1为null,则不进行本地化。

        format:格式字符串。

        agrs:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可为0。

1.日期和时间字符串格式化
        在应用程序设计中,经常需要显示日期和时间。如果想输出满意的日期和时间格式,一般要编写大量的代码、经过各种算法才能实现。format()方法通过给定的特殊转换符作为参数来实现对日期和时间的格式化。

        (1)日期格式化

        返回一个月中的天数,代码如下:
 

Date date = new Date();//创建Date对象date
String s = String.format("%te",date);//创建format()方法date进行格式化

Java第十章字符串_第1张图片

2.时间格式化Java第十章字符串_第2张图片 

Java第十章字符串_第3张图片 

3.格式化常见的日期时间组合Java第十章字符串_第4张图片 

10.5.2常规类型格式化Java第十章字符串_第5张图片 

10.6使用正确正则表达式
 正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。例如,“\\d”表示数字0~9中的任何一个,“\\d”就是元字符。正则表达式中的元字符及其意义如下表所示:

Java第十章字符串_第6张图片

10.7字符串生成器
 创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复的对字符串中进行修改,将极大地增加系统开销。而JDK新增了可变的字符序列StringBuilder类,大大提高了频繁增加字符串的效率。
 

public static void main(String[] args) {
        // TODO 自动生成的方法存根
        String str = "";//创建空字符串
        long starTime = System.currentTimeMillis();//定义对字符串执行操作的起始时间
        for(int i = 0;i < 10000;i++) {//利用for循环执行10000次操作
            str = str + i;//循环追加字符串
        }
        long endTime = System.currentTimeMillis();//定义字符串操作后的时间
        long time = endTime - starTime;//计算字符串执行操作的时间
        System.out.println("String消耗时间:"+time);//将执行的时间输出
        StringBuilder builder = new StringBuilder("");//创建字符串生成器
        starTime = System.currentTimeMillis();//更新操作执行的时间
        for(int j = 0;j<10000;j++) {//利用for循环进行操作
            builder.append(j);    //循环追加字符    
        }
        endTime = System.currentTimeMillis();//更新操作后的时间
        time = endTime - starTime;//更新追加操作执行的时间
        System.out.println("StringBuilder消耗时间:"+time);//将操作时间输出
    }

String消耗时间:84
StringBuilder消耗时间:0
1.append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接受任何类型的费据,如int、boolean、char、String、double 或者另一个字符串生成器等。语法如下:

append(content)
 

其中,content表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象

2.insert(int offset, arg)方法
该方法用于向字符串生成器中的指定位置插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入 int、float、char 和 boolean 等基本数据类型的数据或其他对象。语法如下:

insert(int offset arg)

 ofset: 字符串生成器的位置。该参数必须大于等于0,且小于等于此序列的长度。

arg:将插入至字符串生成器的位置。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中指定的位置添加字符,代码如下:

StringBuilder bf= new StringBuilder("hello");//创建字符生成器
bf.insert(5,"world");//添加至字符生成器的位置及内容
System.out.println(bf.toString());//此时输出信息为hello word
3.delete(int start , int end)方法(前删后不删)
 移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end-1处的字符。如果不存在这种字符,则一直到序列尾部。如果 stat 等于 end,则不发生任何更改。语法如下:

delete(int start , int end)

start:将要删除的字符串的起点位置
 end:将要删除的字符串的终点位置
删除指定位置的子字符串,代码如下:
 

StringBuilder bf = new StringBuilder("StringBuilder");//创建字符串生成器
bf.delete(5,10);//删除的子字符串
System.out.preintln(bf.toString());//此时输出的信息为Strinder
 

 

你可能感兴趣的:(java,jvm,开发语言)