问题:数据库中保存了一批用csv格式存储的数据,在使用的时候,需要判断str是否包含在csv中。
这个问题有2个解决方案:一种是采用字符串包含判断,另一种是通过把csv数据拆分为String[]数组,再逐个判断
实现的代码如下:
package com.bytrees.utils;
import org.apache.commons.lang3.StringUtils;
public class CsvUtils {
* 判断字符串是否在CSV格式的数据内
* @param needle 要检查的数据
* @param haystack CSV格式数据
* @return
public static boolean isInCsv(final String needle, final String haystack) {
//判断needle或haystack是否为空
if (StringUtils.isEmpty(haystack) || StringUtils.isEmpty(needle)) {
return false;
//判断CSV中是否仅有一个元素
//如果仅有一个元素,直接判断是否相等
if (haystack.indexOf(',') == -1) {
return needle.compareTo(haystack) == 0;
//判断是否在第一个元素
if (needle.compareTo(haystack.substring(0, haystack.indexOf(','))) == 0) {
return true;
//判断是否在最后一个元素
if (needle.compareTo(haystack.substring(haystack.lastIndexOf(',') + 1)) == 0) {
return true;
//判断是否在中间
String middleNeedle = "," + needle + ",";
if (haystack.indexOf(middleNeedle) >= 0) {
return true;
return false;
* 拆分为数组进行判断
* @param needle
* @param haystack
* @return
public static boolean isInCsv2(String needle, final String haystack) {
String[] explodeList = StringUtils.split(haystack, ",");
if (explodeList == null) {
return false;
for (String explode : explodeList) {
if (needle.compareTo(explode) == 0) {
return true;
return false;
性能测试,csv数据每个长度为6位,一个用884个,字符串长度为4688736。每个方法执行100w次,耗时结果如下?
| 耗时(ms) |
使用字符串判断 | 400 |
拆分为数组进行判断 | 47418 |
可以看到使用字符串判断,并没有创建新的对象,执行效率非常快。
问题:数据库中保存了一批用csv格式存储的数据,在使用的时候,需要判断str是否包含在csv中。这个问题有2个解决方案:一种是采用字符串包含判断,另一种是通过把csv数据拆分为String[]数组,再逐个判断实现的代码如下:package com.bytrees.utils;import org.apache.commons.lang3.StringUtils;public ...
//参数是需要判断的子字符串
publicvoidjudge(StringsubString){
Stringstring="judgeissubString";
//返回指定子字符串在此字符串中第...
判断一个字符串是否包含某个特定子串是常见的场景,比如判断一篇文章是否包含敏感词汇、判断日志是否有ERROR信息等。本文将介绍四种方法并进行性能测试。
2 四种方法
2.1 JDK原生方法String.indexOf
在String的函数中,提供了indexOf(subStr)方法,返回子串subStr第一次出现的位置,如果不存在则返回-1。例子如下:
//包含Java
assertEqu...
String str = "hello world";
int index = str.indexOf("world");
System.out.println(index); // 输出 6
这里的 indexOf() 方法返回的是子串在字符串中第一次出现的位置,如果没有找到则返回 -1。