Java基础04—字符串

字符串


参考资料:《Java从入门到精通》/明日科技编著. 4版. 北京:清华大学出版社,2016

在Java语言中,字符串作为String类的实例来处理。以对象的方式来处理字符串,使字符串更加灵活、方便。

一、String类

前面介绍了,char类型变量只能表示单个字符,不能表示由多个字符连接而成的字符串。在java语言中将字符串作为对象处理,可以通过java.lang包中的String类来创建字符串对象。

1、声明字符串

在Java语言中,字符串必须包含在一对双引号("")中。声明一个字符串的方式如下:

String str;    //声明字符串
String str1 = "hello";    //声明字符串,并赋初值

注意:声明字符串变量必须经过初始化才能使用,否则编译器会报出“变量未经过初始化”。

2、创建字符串

Java语言中将字符串作为对象来处理,因此可以像创建对象一样来创建字符串对象。

(1)String(char a[])

  • 用一个字符数组a创建String对象
char a[] = {'a','b','c','d'};     等价于
String s = new String(a);      -----------> String s = new String("abcd");

(2)String(char a[], int offset, int length)

  • 提取字符数组a中的一部分创建一个字符串对象。
  • 参数offset表示:开始截取字符串的位置。
  • 参数length表示:截取字符串的长度。
char a[] = {'s','t','u','d','e','n','t'};   等价于
String s = new String(a,2,4);             ---------> String s = new String("uden");

除了上面的两种方式,还可以通过引用字符串常量来创建字符串变量。

String str1, str2;
str1 = "hello world";
str2 = "hello world";

此时,str1和str2引用相同的字符串变量,因此具有相同的实体。

public class StringTest {
    public static void main(String[] args) {
        String s = new String("hello");
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        
        System.out.println("s=s1? " + (s == s1));
        System.out.println("s1=s2? " + (s1 == s2));
        System.out.println("s=s3? " + (s == s3));
    }
}

输出结果:
s=s1? false
s1=s2? true
s=s3? false

3、连接字符串

  • 可以对多个字符串进行连接,也可以使字符串与其他数据类型进行连接。
  • 使用“+”运算符可以实现多个字符串的连接。
public class StringJoin {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1 + " " + s2;

        System.out.println(s3);  //输出hello world
    }
}

字符串同其他基本数据类型进行连接时,会自动调用toString()方法,将这些数据直接转换成字符串。

public class ToString {
    public static void main(String[] args) {
        int num = 10;
        float f1 = 2.34f;
        String s1 = num + " " + f1;

        System.out.println(s1);
    }
}

三、获取字符串信息

(1)获取字符串长度

使用String类的length()方法可以获取声明的字符串对象的长度。

String str = "hello world";
System.out.println( str.length() );  //输出11

注意:字符串的长度包括字符串中的空格。

(2)字符串查找

String类提供了两种查找字符串的方法,即indexOf()和lastIndexOf()方法。

  • indexOf()方法返回的是搜索的字符或字符串首次出现的位置
  • lastIndexOf()方法返回的是搜索的字符或字符串最后一次出现的位置
String str = "hello world";
System.out.println( str.indexOf("o") );   //输出4
System.out.println( str.lastIndexOf("l") );  //输出9

注意:计算机中String对象是数组表示的,字符串的下标从0开始。

说明:如果lastIndexOf()方法中的参数为空字符串""(注意没有空格),则返回字符串的长度。

(3)获取指定索引位置的字符

使用charAt()方法可以将指定索引位置的字符返回。

String str = "hello world";
char c = str.charAt(6);
System.out.println( c );  //输出w

四、字符串操作

(1)获取子字符串

通过String类的substring()方法可以对字符串进行截取。这些方法的共同点就是利用字符串的下标进行截取。

  • substring(int beginIndex)

返回从指定的索引位置开始截取至该字符串的结尾。

String str = "hello world";
String substr = str.substring(3);
System.out.println(substr);   //输出lo world
  • substring(int beginIndex, int endIndex)

返回从指定的索引位置开始截取至指定的索引位置结束的字符串。

String str = "hello world";
String substr = str.substring(3,9);
System.out.println(substr);   //输出lo wor

(2)去空格

trim()方法返回字符串的副本,忽略前导空格和尾部空格。

String str = "   hello  world  ";
String substr = str.trim();
System.out.println(substr);  

输出结果:
hello  world

注意:中间的空格保留

(3)字符串替换

replace()方法可实现将指定的字符或字符串替换成新的字符或字符串。格式如下:

replace(char oldChar, char newChar)
  • replace()方法返回一个新的字符串。
  • 如果要替换的字符oldChar在原字符串中反复出现,replace()方法会将所有oldChar全部替换成newChar。
  • oldChar必须和原字符串中的字符大小写一致。
String str = "hello world";
String substr = str.replace('l','L');
System.out.println(substr);
输出结果:
heLLo worLd

(4)判断字符串的开头与结尾

  • startsWith()

该方法用于判断字符串对象的前缀是否为参数指定的字符串,返回值为boolean类型。

String str = "hello world";
boolean bool1 = str.startsWith("he");
boolean bool2 = str.startsWith("hE");

System.out.println(bool1);  //输出true
System.out.println(bool2);  //输出false
  • endsWith()

该方法用于判断当前字符串是否为以指定的子字符串结束,返回值为boolean型。

String str = "hello world";
boolean bool1 = str.endsWith("ld");
boolean bool2 = str.endsWith("Ld");

System.out.println(bool1);  //输出true
System.out.println(bool2);  //输出false

(5)判断字符串是否相等

对字符串对象的比较不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的内存地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回false。

String str1 = "i love java";
String str2 = "i love java";
System.out.println(str1 == str2)   //输出true

String str3 = new String("i love java");
String str4 = new String("i love java");
System.out.println(str3 == str4);  //输出false

因此,要比较两个字符串的内容是否相等,应该使用equals()和equalsIgnoreCase()方法。

  • equals()方法

该方法比较两个字符串是否具有相同的字符长度,结果返回boolean类型。注意:进行字符比较是区分大小写。

  • equalsIgnoreCase()方法

该方法和equals()类似,但是不区分大小写。

String str1 = "i love java";
String str2 = "i love java";
String str3 = "I LOVE JAVA";

boolean res1 = str1.equals(str2);
boolean res2 = str1.equals(str3);
boolean res3 = str1.equalsIgnoreCase(str3);

System.out.println(res1);  //返回true
System.out.println(res2);  //返回false
System.out.println(res3);  //返回true

(6)按字典顺序比较两个字符串

compareTo()方法是按照字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值。

  • 如果按照字典顺序,String对象位于参数字符串之前,则比较结果是一个负整数
  • 如果按照字典顺序,String对象位于参数字符串之后,则比较结果是一个正整数
  • 如果这两个字符串相等,则结果为0。
String str4 = new String("bb");
String str5 = new String("ac")

int res = str4.compareTo(str5)

System.out.println(res);   //输出1

注意

  • 先比较第一位字符,若在之前,则返回-1;若在之后,则返回1;
  • 若第一位字符相同,则比较第二位字符,以此类推。
  • 如果所有字符相同,则返回0。

(7)字母大小写转换

  • toLowerCase()方法

将字符串中的所有字母转换为小写字母

  • toUpperCase()方法

将字符串中的所有字母转换为大写字母

String str6 = "I Love Java"

String str7 = str6.toLowerCase();
String str8 = str6.toUpperCase()

System.out.println(str7);
System.out.println(str8);

输出结果:
i love java
I LOVE JAVA

(8)字符串分割

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

  • split ( String sign )

其中,sign为字符串的分割符,也可以是正则表达式。如果想定义多个分割符,可以使用“|”符号。例如,“,|?”表示使用“,”和“?”进行分割。

String str6 = "Do you Love Java?Yes";
String[] a = str6.split(" |\?")
//定义空格和问号作为分割符,问号要作转义




for(int i=0; i<a.length; i++) {
    System.out.println(a[i]);
}

输出结果:
Do
you
Love
Java
Yes

五、格式化字符串

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

  • format ( String format, Object...args )
  • format ( Local 1, String format, Object...args )

1、日期格式化

import java.util.Date;

public class Format {
    public static void main(String[] args) {
        Date date = new Date();

        String day = String.format("%te",date);
        String year = String.format("%tY",date);
        String mouth = String.format("%tm",date);
        
        System.out.println(year + "-" + mouth + "-" + day);
    }   //输出2020-05-4
}

其中,"%te、%tY、%tm是转换符。

2、时间格式化

import java.util.Date;

public class Format {
    public static void main(String[] args) {
        Date date = new Date();

        String day = String.format("%te",date);
        String year = String.format("%tY",date);
        String mouth = String.format("%tm",date);

        String hour = String.format("%tH",date);
        String minute = String.format("%tM",date);
        String second = String.format("%tS",date);

        System.out.println("当前时间:" + year + "-" + mouth + "-" + day + " " + hour + ":" + minute + ":" + second);
    }   //输出:当前时间:2020-05-4 20:19:09
}

3、常见的日期时间格式化组合

import java.util.Date;

public class Format {
    public static void main(String[] args) {
        Date date = new Date();

        String time = String.format("%tT",date);
        String year = String.format("%tF",date);

        System.out.println("当前时间:" + year + " " + time);
    }  //输出:当前时间:2020-05-04 20:23:09
}

六、正则表达式

正则表达式通常被用于判断语句中,用来检测某一字符串是否满足某一格式。

七、字符串生成器

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

public class Jerque {
    public static void main(String[] args) {
        String str = "";
        //记录开始时间
        long startTime = System.currentTimeMillis();
        for(int i=0; i<10000; i++){
            str = str + i;
        }
        //记录结束时间
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;
        System.out.println("String消耗时间:" + time);

        StringBuilder builder = new StringBuilder("");
        //记录开始时间
        startTime = System.currentTimeMillis();
        for(int i=0; i<10000; i++){
            builder.append(i);
        }
        //记录结束时间
        endTime = System.currentTimeMillis();
        time = endTime - startTime;
        System.out.println("StringBuilder消耗时间:" + time);
    }
}

输出结果:
String消耗时间:300
StringBuilder消耗时间:0

StringBuilder类的常用方法如下:

  • append ( )

该方法用于向字符串生成器中追加内容,可以实现接受任何类型的数据。

  • insert ( )

该方法用于向字符串生成器的指定位置插入数据内容,可以接受int、float、char和boolean等数据类型或其他对象。

public class ToString {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("hello");
        builder.insert(5," world");
        
        System.out.println( builder.toString() );
        //输出:hello world
    }
}
  • delete ( int start, int end )

该方法删除字符串中指定的字符,从指定的start位置开始,直到end-1的位置。如果start等于end,则不发生任何改变。

public class ToString {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("hello world");
        builder.delete(2,5);
        System.out.println( builder.toString() );
        //输出:he world
    }
}
原文地址:https://www.cnblogs.com/xuliang-daydayup/p/12900890.html