zoukankan      html  css  js  c++  java
  • java中字符串相关操作解析

    一、多行字符串

    每个操作系统对换行符的定义都不尽相同,所以在拼接多行字符串之前,需要先获取到操作系统的换行符,Java 可以通过下面的方式获取:

    String newLine = System.getProperty("line.separator");
    

    有了换行符,就可以使用 String 类的 concat() 方法或者直接使用“+”号操作符拼接多行字符串了。也可以使用StringBuilder 和StringBuffer也是可以的。

    Java 8 的 String 类加入了一个新的方法 join(),可以将换行符与字符串拼接起来。

    另外,Java 还可以通过 Files.readAllBytes() 方法从源文件中直接读取多行文本,格式和源文件保持一致:

    String mutiLine = new String(Files.readAllBytes(Paths.get("src/main/resource/cmower.txt")));
    

    使用String拼接多行字符串示例如下:

    String newLine = System.getProperty("line.separator");
    String useJoin = String.join(newLine, "hello", "world", "!");
    System.out.println("使用java 8 String Join方法:" + newLine + useJoin);
    // 输出结果如下
    使用java 8 String Join方法:
    hello
    world
    !
    

    二、检查字符串是否为空

    说到“空”这个概念,它在编程中有两种定义,英文单词分别是 empty 和 blank,来做一下区分。

    如果字符串为 null,或者长度为 0,则为 empty;如果字符串仅包含空格,则为 blank。

    示例如下:

    // 区分空字符串:1、只有空格的字符串;2、为空的字符串
    String blank = "  ";
    String containNull = "";
    System.out.println("只有空格的字符串" + StringUtils.isBlank(blank));
    System.out.println("为null的字符串" + StringUtils.isEmpty(containNull));
    

    三、生成随机字符串

    有时候,我们需要生成一些随机的字符串,比如说密码,校验码等。

    (1)使用原生jdk的方式生成随机数

    // 生成a-z之间的随机6位数
    // 'a'
    int leftLimit = 97;
    // 'z'
    int rightLimit = 122;
    int targetStringLength = 6;
    Random random = new Random();
    StringBuilder buffer = new StringBuilder(targetStringLength);
    for (int i = 0; i < targetStringLength; i++) {
        int randomLimitedInt = leftLimit + (int) (random.nextFloat() * (rightLimit - leftLimit + 1));
        buffer.append((char) randomLimitedInt);
    }
    String generatedString = buffer.toString();
    
    System.out.println("使用原生类库随机生成6位密码" + generatedString);
    

    (2)使用 Apache 的 Commons Lang 包,RandomStringUtils.random() 生成随机数

    // 使用工具类随机生成字符,第一个参数:位数,第二个参数:是否生成包含字符的随机字符,第三个参数:是否生成包含数字的随机数
    String password = RandomStringUtils.random(6, true, true);
    
    System.out.println("使用工具类随机生成6位密码:" + password);
    

    四、删除字符串最后一个字符

    删除字符串最后一个字符,最简单的方法就是使用 substring() 方法进行截取,0 作为起始下标,length() - 1 作为结束下标。

    (1)不管怎么样,substring() 方法不是 null 安全的,需要先判空

    示例如下:

    String removeLastWords = "jason";
    System.out.println("去掉最后一个字符串:" + removeLastChar(removeLastWords));
    
    public static String removeLastChar(String s) {
        return (s == null || s.length() == 0) ? null : (s.substring(0, s.length() - 1));
    }
    

    (2)如果不想在操作之前判空,那么就直接用Apache 的 Commons Lang 包中的工具类

    String removeLastWords = "jason";
    System.out.println("使用工具类:" + StringUtils.substring(removeLastWords, 0, removeLastWords.length() - 1));
    

    (3)如果目的非常明确——就是只删除字符串的最后一个字符,还可以使用 StringUtils 类的 chop() 方法

    String removeLastWords = "jason";
    System.out.println("目的非常明确:" + StringUtils.chop(removeLastWords));
    
    // chop方法源码,内部也是使用的subString方法
    public static String chop(String str) {
        if (str == null) {
            return null;
        } else {
            int strLen = str.length();
            if (strLen < 2) {
                return "";
            } else {
                int lastIdx = strLen - 1;
                String ret = str.substring(0, lastIdx);
                char last = str.charAt(lastIdx);
                return last == '
    ' && ret.charAt(lastIdx - 1) == '
    ' ? ret.substring(0, lastIdx - 1) : ret;
            }
        }
    }
    

    (4)如果你对正则表达式了解的话,也可以使用 replaceAll() 方法进行替换,把最后一个字符 .$ 替换成空字符串就可以了。

    String removeLastWords = "jason";
    System.out.println("使用正则表达式:" + removeLastWords.replaceAll(".$", ""));
    

    当然了,replaceAll() 方法也不是 null 安全的,所以要提前判空:

    String result= (removeLastWords == null) ? null : removeLastWords.replaceAll(".$", "");
    

    (5)如果对 Java 8 的 Lambda 表达式和 Optional 比较熟的话,还可以这样写

    String removeLastWords = "jason";
    String result1 = Optional.of(removeLastWords).map(str -> str.replaceAll(".$", "")).orElse(removeLastWords);
    System.out.println("使用lambda:" + result1);
    

    五、统计字符在字符串中出现的次数

    要统计字符在字符串中出现的次数,有很多方法,如下:

    (1)直接使用 JDK 的 API 就是最直接的一种

    // 统计字符在字符串中出现的次数
    String someString = "jasonn";
    char someChar = 'n';
    int count = 0;
    
    for (int i = 0; i < someString.length(); i++) {
        if (someString.charAt(i) == someChar) {
            count++;
        }
    }
    System.out.println("n出现的次数:" + count);
    

    (2)使用Java 8 的特性

    String someString = "jasonn";
    long count = someString.chars().filter(ch -> ch == 'n').count();
    System.out.println("使用java 8特性:" + count1);
    

    (3)使用第三方类库,可以选择 Apache 的 Commons Lang 包

    String someString = "jasonn";
    int result =  StringUtils.countMatches(someString, "n");
    System.out.println("使用第三方类库:" + result);
    

    六、拆分字符串

    大多数情况下,String 类的 split() 方法就能够满足拆分字符串的需求,除了这个还有其他的方法,如下:

    (1)使用String的split()方法

    // 拆分字符串
    String str = "a,b,c,d";
    String[] arryStr = str.split(",");
    System.out.println("拆分的字符串:" + ArrayUtils.toString(arryStr));
    // 结果如下
    拆分的字符串:{a,b,c,d}
    

    (2)使用Apache 的 Commons Lang 包中的StringUtils 类

    String str = "a,b,c,d";
    System.out.println("使用工具类:" + ArrayUtils.toString(StringUtils.split(str, ",")));
    

    七、字符串比较

    字符串的比较有两种方法:使用==和equals()来进行比较。

    String a = "jason";
    String b = "jason";
    String c = new String("jason");
    // true
    System.out.println(a == b);
    // false
    System.out.println(a == c);
    // true
    System.out.println(a.equals(c));
    

    需要注意:

    == :当用于值比较时 比较数值是否相等,用于比较引用时是比较两个对象的引用地址是否相同;

    equals:就是用来判断字符串的值是否相等。

    八、字符串拼接

    在操作字符串时经常会遇到字符串拼接的场景,拼接字符串的方法如下:

    (1)+号操作符拼接字符串

    String firstStr = "jason";
    String secondStr = "小蜗牛";
    String result = firstStr + secondStr; // +号操作在底层其实是使用的StringBuilder的append方法
    System.out.println(result);
    // 结果
    jason小蜗牛
    

    (2)使用StringBuilder(线程不安全) 和StringBuffer(线程安全)

    StringBuilder stringBuilder = new StringBuilder();
    System.out.println(stringBuilder.append(firstStr).append(secondStr));
    
    StringBuffer stringBuffer = new StringBuffer();
    System.out.println(stringBuffer.append(firstStr).append(secondStr));
    
    // 结果
    jason小蜗牛
    

    (3)String 类的 concat 方法

    String firstStr = "jason";
    String secondStr = "小蜗牛";
    String result = firstStr.concat(secondStr)
    System.out.println(result);
    

    (4)String 类的 join 方法

    JDK 1.8 提供了一种新的字符串拼接方式:String 类增加了一个静态方法 join。

    String firstStr = "jason";
    String secondStr = "小蜗牛";
    String result = String.join("",firstStr, secondStr); // 第一个参数是分隔符
    System.out.println(result);
    

    (5)使用Apache 的 Commons Lang3 包中的工具类

    String firstStr = "jason";
    String secondStr = "小蜗牛";
    String result = StringUtils.join(firstStr, secondStr);
    System.out.println(result);
    
  • 相关阅读:
    简单线程池的设计
    MFC开发--截图工具
    Win32小游戏--蜘蛛纸牌
    C++语言动态创建对象
    C++语言类之间的关系
    c++语言虚函数实现多态的原理(更新版)
    5-24 c++语言之【基础知识】
    小细节--关于printf的输出问题
    Win32小游戏--贪吃蛇
    2020北大夏令营 终末游记
  • 原文地址:https://www.cnblogs.com/jasonboren/p/13863261.html
Copyright © 2011-2022 走看看