Java切割字符串的踩坑实战记录

 更新时间:2022年11月09日 10:44:09   作者:小的~~  
最近在项目中使用了java中的分割字符串,踩了一个坑,充分了展示了自己对java底层的认知有很多的不足和欠缺,下面这篇文章主要给大家介绍了关于Java切割字符串的踩坑实战记录,需要的朋友可以参考下

坑出现的环境

一般情况下切割字符串会使用split或者StringTokenizer,如下代码

String s = ",,o,,";
String[] split = s.split(",");

期望得到数组["","","o","",""],但是实际上会得到["","","o"],后面两个直接被忽略了,如IDEA运行

 StringTokenizer默认情况下

String s = ",,o,,";
StringTokenizer token = new StringTokenizer(s,",");
String[] arr = new String[token.countTokens()];
int i = 0;
while (token.hasMoreElements()){
    arr[i++] = token.nextToken();
}

在IDEA中得到的运行结果

 当StringTokenizer第三个参数改为true时

StringTokenizer token = new StringTokenizer(s,",",true);

 貌似得到了想要的结果,但是当要切割的字符串改为下面这样时

String s = ",k,o,,";
StringTokenizer token = new StringTokenizer(s,",",true);
String[] arr = new String[token.countTokens()];
int i = 0;
while (token.hasMoreElements()){
    arr[i++] = token.nextToken();
}

得到的结果是

数组的数量与预期也不符。

实际上java的split内部会按照预期的样子把字符串切割好,但是第二个参数不传的情况下默认是0,这就是会导致后面空字符串的值被丢弃

在String的split方法中可以看到

 从注释说明中可以看到,通过改变第二个参数可以得到预期的结果

StringTokenizer内部也会判断切割后的值长度是否大于0,大于的情况下才会存储起来

问题的解决

通过设置split的第二个参数为-1

String s = ",k,o,,";
String[] split = s.split(",",-1);

补充:java分割字符串常见语法

一.java.lang.String.split()

在java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)

示例:

for(String revaal:s.split(" ")){//用空格分隔
        System.out.println(count+"ci"+revaal);
          }

或者

String sourceStr = "1,2,3,4,5";
String[] sourceStrArray = sourceStr.split(",");
for (int i = 0; i < sourceStrArray.length; i++) {
    System.out.println(sourceStrArray[i]);
}

如果需要指定分割后的数量的话,可以在split方法中再传入指定数量即可。

String[] sourceStrArray = sourceStr.split(",",4);

split 的实现直接调用的 matcher 类的 split 的方法。在使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。在正则表达式中有特殊的含义的字符,我们使用的时候必须进行转义,

1.字符"|","*","+“都得加上转义字符,前面加上”\"。

2.而如果是"",那么就得写成"\\"。

3.如果一个字符串中有多个分隔符,可以用"|"作为连字符。

二.java.util.StringTokenizer()

StringTokenizer 构造方法:

  1. StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。
  2. StringTokenizer(String str, String delim) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。
  3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

示例:

 public static void main(String[] args)
    { 
        String str = "runoob,google,taobao,facebook,zhihu";
        // 以 , 号为分隔符来分隔字符串
        StringTokenizer st=new StringTokenizer(str,",");
        while(st.hasMoreTokens()) { 
            System.out.println(st.nextToken());
        }
    }

StringTokenizer 常用方法:

  1. int countTokens():返回nextToken方法被调用的次数。
  2. boolean hasMoreTokens():返回是否还有分隔符。
  3. boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。
  4. String nextToken():返回从当前位置到下一个分隔符的字符串。
  5. Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。
  6. String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。

总结

到此这篇关于Java切割字符串踩坑的文章就介绍到这了,更多相关Java切割字符串的坑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java web个人通讯录系统设计

    java web个人通讯录系统设计

    这篇文章主要为大家详细介绍了java web个人通讯录系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MyBatis-Plus如何关闭SQL日志打印详解

    MyBatis-Plus如何关闭SQL日志打印详解

    在使用mybatisplus进行开发时,日志是一个非常有用的工具,它可以帮助我们更好地了解和调试我们的代码,这篇文章主要给大家介绍了关于MyBatis-Plus如何关闭SQL日志打印的相关资料,需要的朋友可以参考下
    2024-03-03
  • Java后台批量生产echarts图表并保存图片

    Java后台批量生产echarts图表并保存图片

    这篇文章主要介绍了Java后台批量生产echarts图表并保存图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring Boot(五)之跨域、自定义查询及分页

    Spring Boot(五)之跨域、自定义查询及分页

    这篇文章主要介绍了Spring Boot(五)之跨域、自定义查询及分页的的相关资料,需要的朋友可以参考下
    2017-04-04
  • Mybatis-Plus中and()和or()的使用与原理详解

    Mybatis-Plus中and()和or()的使用与原理详解

    最近发现MyBatisPlus还是挺好用的,下面这篇文章主要给大家介绍了关于Mybatis-Plus中and()和or()的使用与原理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 16个SpringBoot扩展接口的总结和实例

    16个SpringBoot扩展接口的总结和实例

    Spring Boot是一个开源的Java框架,它简化了基于Spring的应用程序的开发和部署,它提供了许多强大的特性和扩展接口,本文给大家介绍了16个常用的Spring Boot扩展接口,需要的朋友可以参考下
    2023-09-09
  • 基于springboot处理date参数过程解析

    基于springboot处理date参数过程解析

    这篇文章主要介绍了基于springboot处理date参数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java 运算符详情

    Java 运算符详情

    这篇文章主要介绍了Java 运算符,Java 中的运算符与 C 语言基本一致。下面文章就围绕Java 中的运算符的相关资料展开内容,需要的朋友可以参考一下
    2021-11-11
  • Spring深入讲解实现AOP的三种方式

    Spring深入讲解实现AOP的三种方式

    Spring的AOP就是通过动态代理实现的,使用了两个动态代理,分别是JDK的动态代理和CGLIB动态代理,本文重点给大家介绍下Spring Aop的三种实现,感兴趣的朋友一起看看吧
    2022-05-05
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除

    这篇文章主要为大家介绍了GC算法实现篇之并发-标记-清除, CMS垃圾收集器在减少停顿时间上做了很多给力的工作, 大量的并发线程执行的工作并不需要暂停应用线程
    2022-01-01

最新评论