• 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
        }
    }
    
  • 相关阅读:
    SpringMvc最全的约束——你的感冒清个人总结
    spring配置文件比较全的约束
    android 发送邮件--实现 send email for android
    android异常 More than one file was found with OS independent path 'META-INF/XXX'
    android异常 More than one file was found with OS independent path 'META-INF/XXX'
    Error:(949) Multiple substitutions specified in non-positional format; Android格式化string.xml
    Android 设置ImageView全屏
    Android 设置ImageView全屏
    git的使用之eclipse Hbuilder
    git的使用之eclipse Hbuilder
  • 原文地址:https://www.cnblogs.com/xuliang-daydayup/p/12900890.html
Copyright © 2020-2023  润新知