百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

全网最全:Java字符串处理(java字符串处理方法)

wptr33 2025-07-28 00:36 33 浏览

Java字符串处理,包含了多个静态方法,用于执行不同类型的字符串操作。

开箱即用

空白和空字符串检查

  • isBlankIfStr(Object obj):检查对象是否为空白字符串,包括null、空字符串、只包含空白字符(如空格、制表符等)的字符串。
  • isEmptyIfStr(Object obj):检查对象是否为空字符串,与isBlankIfStr不同,此方法不检查空白字符。

字符串处理

  • trim(String[] strs):对字符串数组中的每个元素进行首尾空白字符去除。
  • utf8Str(Object obj)str(Object obj, Charset charset):将对象转换为UTF-8编码的字符串。
  • toString(Object obj)toStringOrNull(Object obj):调用对象的toString方法,toStringOrNull在对象为null时返回null

字符串创建

  • builder()strBuilder():分别创建StringBuilderStrBuilder对象。
  • builder(int capacity)strBuilder(int capacity):创建具有指定初始容量的StringBuilderStrBuilder对象。

字符串填充

  • fillBefore(String str, char filledChar, int len)fillAfter(String str, char filledChar, int len):在字符串前或后填充字符至指定长度。

字符串转换

  • getReader(CharSequence str)getWriter():分别获取StringReaderStringWriter对象。
  • reverse(String str):反转字符串。

字符串相似度

  • similar(String str1, String str2)similar(String str1, String str2, int scale):计算两个字符串的相似度。

UUID生成

  • uuid():生成随机UUID字符串。

文本格式化

  • format(CharSequence template, Map<?, ?> map)format(CharSequence template, Map<?, ?> map, boolean ignoreNull):使用占位符格式化文本。

字符串截断

  • truncateUtf8(String str, int maxBytes)truncateByByteLength(String str, Charset charset, int maxBytes, int factor, boolean appendDots):根据指定的最大字节长度截断字符串,并可选地添加省略号。

具体代码:(代码参考Hutool字符串处理类)

// ------------------------------------------------------------------------ Blank

/**
 * <p>如果对象是字符串是否为空白,空白的定义如下:</p>
 * <ol>
 *     <li>{@code null}</li>
 *     <li>空字符串:{@code ""}</li>
 *     <li>空格、全角空格、制表符、换行符,等不可见字符</li>
 * </ol>
 *
 * <p>例:</p>
 * <ul>
 *     <li>{@code StrUtil.isBlankIfStr(null)     // true}</li>
 *     <li>{@code StrUtil.isBlankIfStr("")       // true}</li>
 *     <li>{@code StrUtil.isBlankIfStr(" \t\n")  // true}</li>
 *     <li>{@code StrUtil.isBlankIfStr("abc")    // false}</li>
 * </ul>
 *
 * <p>注意:该方法与 {@link #isEmptyIfStr(Object)} 的区别是:
 * 该方法会校验空白字符,且性能相对于 {@link #isEmptyIfStr(Object)} 略慢。</p>
 *
 * @param obj 对象
 * @return 如果为字符串是否为空串
 * @see StrUtil#isBlank(CharSequence)
 * @since 3.3.0
 */
public static boolean isBlankIfStr(Object obj) {
    if (null == obj) {
       return true;
    } else if (obj instanceof CharSequence) {
       return isBlank((CharSequence) obj);
    }
    return false;
}
// ------------------------------------------------------------------------ Empty

/**
 * <p>如果对象是字符串是否为空串,空的定义如下:</p><br>
 * <ol>
 *     <li>{@code null}</li>
 *     <li>空字符串:{@code ""}</li>
 * </ol>
 *
 * <p>例:</p>
 * <ul>
 *     <li>{@code StrUtil.isEmptyIfStr(null)     // true}</li>
 *     <li>{@code StrUtil.isEmptyIfStr("")       // true}</li>
 *     <li>{@code StrUtil.isEmptyIfStr(" \t\n")  // false}</li>
 *     <li>{@code StrUtil.isEmptyIfStr("abc")    // false}</li>
 * </ul>
 *
 * <p>注意:该方法与 {@link #isBlankIfStr(Object)} 的区别是:该方法不校验空白字符。</p>
 *
 * @param obj 对象
 * @return 如果为字符串是否为空串
 * @since 3.3.0
 */
public static boolean isEmptyIfStr(Object obj) {
    if (null == obj) {
       return true;
    } else if (obj instanceof CharSequence) {
       return 0 == ((CharSequence) obj).length();
    }
    return false;
}

// ------------------------------------------------------------------------ Trim

/**
 * 给定字符串数组全部做去首尾空格
 *
 * @param strs 字符串数组
 */
public static void trim(String[] strs) {
    if (null == strs) {
       return;
    }
    String str;
    for (int i = 0; i < strs.length; i++) {
       str = strs[i];
       if (null != str) {
          strs[i] = trim(str);
       }
    }
}

/**
 * 将对象转为字符串<br>
 *
 * <pre>
 * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
 * 2、对象数组会调用Arrays.toString方法
 * </pre>
 *
 * @param obj 对象
 * @return 字符串
 */
public static String utf8Str(Object obj) {
    return str(obj, CharsetUtil.CHARSET_UTF_8);
}

/**
 * 将对象转为字符串
 *
 * <pre>
 * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
 * 2、对象数组会调用Arrays.toString方法
 * </pre>
 *
 * @param obj         对象
 * @param charsetName 字符集
 * @return 字符串
 * @deprecated 请使用 {@link #str(Object, Charset)}
 */
@Deprecated
public static String str(Object obj, String charsetName) {
    return str(obj, Charset.forName(charsetName));
}

/**
 * 将对象转为字符串
 * <pre>
 *   1、Byte数组和ByteBuffer会被转换为对应字符串的数组
 *   2、对象数组会调用Arrays.toString方法
 * </pre>
 *
 * @param obj     对象
 * @param charset 字符集
 * @return 字符串
 */
public static String str(Object obj, Charset charset) {
    if (null == obj) {
       return null;
    }

    if (obj instanceof String) {
       return (String) obj;
    } else if (obj instanceof byte[]) {
       return str((byte[]) obj, charset);
    } else if (obj instanceof Byte[]) {
       return str((Byte[]) obj, charset);
    } else if (obj instanceof ByteBuffer) {
       return str((ByteBuffer) obj, charset);
    } else if (ArrayUtil.isArray(obj)) {
       return ArrayUtil.toString(obj);
    }

    return obj.toString();
}

/**
 * 将byte数组转为字符串
 *
 * @param bytes   byte数组
 * @param charset 字符集
 * @return 字符串
 */
public static String str(byte[] bytes, String charset) {
    return str(bytes, CharsetUtil.charset(charset));
}

/**
 * 解码字节码
 *
 * @param data    字符串
 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
 * @return 解码后的字符串
 */
public static String str(byte[] data, Charset charset) {
    if (data == null) {
       return null;
    }

    if (null == charset) {
       return new String(data);
    }
    return new String(data, charset);
}

/**
 * 将Byte数组转为字符串
 *
 * @param bytes   byte数组
 * @param charset 字符集
 * @return 字符串
 */
public static String str(Byte[] bytes, String charset) {
    return str(bytes, CharsetUtil.charset(charset));
}

/**
 * 解码字节码
 *
 * @param data    字符串
 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
 * @return 解码后的字符串
 */
public static String str(Byte[] data, Charset charset) {
    if (data == null) {
       return null;
    }

    byte[] bytes = new byte[data.length];
    Byte dataByte;
    for (int i = 0; i < data.length; i++) {
       dataByte = data[i];
       bytes[i] = (null == dataByte) ? -1 : dataByte;
    }

    return str(bytes, charset);
}

/**
 * 将编码的byteBuffer数据转换为字符串
 *
 * @param data    数据
 * @param charset 字符集,如果为空使用当前系统字符集
 * @return 字符串
 */
public static String str(ByteBuffer data, String charset) {
    if (data == null) {
       return null;
    }

    return str(data, CharsetUtil.charset(charset));
}

/**
 * 将编码的byteBuffer数据转换为字符串
 *
 * @param data    数据
 * @param charset 字符集,如果为空使用当前系统字符集
 * @return 字符串
 */
public static String str(ByteBuffer data, Charset charset) {
    if (null == charset) {
       charset = Charset.defaultCharset();
    }
    return charset.decode(data).toString();
}

/**
 * 调用对象的toString方法,null会返回“null”
 *
 * @param obj 对象
 * @return 字符串
 * @see String#valueOf(Object)
 * @since 4.1.3
 */
public static String toString(Object obj) {
    return String.valueOf(obj);
}

/**
 * 调用对象的toString方法,null会返回{@code null}
 *
 * @param obj 对象
 * @return 字符串 or {@code null}
 * @since 5.7.17
 */
public static String toStringOrNull(Object obj) {
    return null == obj ? null : obj.toString();
}

/**
 * 创建StringBuilder对象
 *
 * @return StringBuilder对象
 */
public static StringBuilder builder() {
    return new StringBuilder();
}

/**
 * 创建StrBuilder对象
 *
 * @return StrBuilder对象
 * @since 4.0.1
 */
public static StrBuilder strBuilder() {
    return StrBuilder.create();
}

/**
 * 创建StringBuilder对象
 *
 * @param capacity 初始大小
 * @return StringBuilder对象
 */
public static StringBuilder builder(int capacity) {
    return new StringBuilder(capacity);
}

/**
 * 创建StrBuilder对象
 *
 * @param capacity 初始大小
 * @return StrBuilder对象
 * @since 4.0.1
 */
public static StrBuilder strBuilder(int capacity) {
    return StrBuilder.create(capacity);
}

/**
 * 获得StringReader
 *
 * @param str 字符串
 * @return StringReader
 */
public static StringReader getReader(CharSequence str) {
    if (null == str) {
       return null;
    }
    return new StringReader(str.toString());
}

/**
 * 获得StringWriter
 *
 * @return StringWriter
 */
public static StringWriter getWriter() {
    return new StringWriter();
}

/**
 * 反转字符串<br>
 * 例如:abcd =》dcba
 *
 * @param str 被反转的字符串
 * @return 反转后的字符串
 * @since 3.0.9
 */
public static String reverse(String str) {
    return new String(ArrayUtil.reverse(str.toCharArray()));
}

// ------------------------------------------------------------------------ fill

/**
 * 将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串<br>
 * 字符填充于字符串前
 *
 * @param str        被填充的字符串
 * @param filledChar 填充的字符
 * @param len        填充长度
 * @return 填充后的字符串
 * @since 3.1.2
 */
public static String fillBefore(String str, char filledChar, int len) {
    return fill(str, filledChar, len, true);
}

/**
 * 将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串<br>
 * 字符填充于字符串后
 *
 * @param str        被填充的字符串
 * @param filledChar 填充的字符
 * @param len        填充长度
 * @return 填充后的字符串
 * @since 3.1.2
 */
public static String fillAfter(String str, char filledChar, int len) {
    return fill(str, filledChar, len, false);
}

/**
 * 将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串
 *
 * @param str        被填充的字符串
 * @param filledChar 填充的字符
 * @param len        填充长度
 * @param isPre      是否填充在前
 * @return 填充后的字符串
 * @since 3.1.2
 */
public static String fill(String str, char filledChar, int len, boolean isPre) {
    final int strLen = str.length();
    if (strLen > len) {
       return str;
    }

    String filledStr = StrUtil.repeat(filledChar, len - strLen);
    return isPre ? filledStr.concat(str) : str.concat(filledStr);
}

/**
 * 计算两个字符串的相似度
 *
 * @param str1 字符串1
 * @param str2 字符串2
 * @return 相似度
 * @since 3.2.3
 */
public static double similar(String str1, String str2) {
    return TextSimilarity.similar(str1, str2);
}

/**
 * 计算两个字符串的相似度百分比
 *
 * @param str1  字符串1
 * @param str2  字符串2
 * @param scale 相似度
 * @return 相似度百分比
 * @since 3.2.3
 */
public static String similar(String str1, String str2, int scale) {
    return TextSimilarity.similar(str1, str2, scale);
}

/**
 * 生成随机UUID
 *
 * @return UUID字符串
 * @see IdUtil#randomUUID()
 * @since 4.0.10
 */
public static String uuid() {
    return IdUtil.randomUUID();
}

/**
 * 格式化文本,使用 {varName} 占位<br>
 * map = {a: "aValue", b: "bValue"} format("{a} and {b}", map) ---=》 aValue and bValue
 *
 * @param template 文本模板,被替换的部分用 {key} 表示
 * @param map      参数值对
 * @return 格式化后的文本
 */
public static String format(CharSequence template, Map<?, ?> map) {
    return format(template, map, true);
}

/**
 * 格式化文本,使用 {varName} 占位<br>
 * map = {a: "aValue", b: "bValue"} format("{a} and {b}", map) ---=》 aValue and bValue
 *
 * @param template   文本模板,被替换的部分用 {key} 表示
 * @param map        参数值对
 * @param ignoreNull 是否忽略 {@code null} 值,忽略则 {@code null} 值对应的变量不被替换,否则替换为""
 * @return 格式化后的文本
 * @since 5.4.3
 */
public static String format(CharSequence template, Map<?, ?> map, boolean ignoreNull) {
    return StrFormatter.format(template, map, ignoreNull);
}

/**
 * 截断字符串,使用其按照UTF-8编码为字节后不超过maxBytes长度。截断后自动追加省略号(...)
 * 用于存储数据库varchar且编码为UTF-8的字段
 *
 * @param str      java字符串
 * @param maxBytes 最大字节长度
 * @return 截断后的字符
 */
public static String truncateUtf8(String str, int maxBytes) {
    Charset charset = StandardCharsets.UTF_8;
    //UTF-8编码单个字符最大长度4
    return truncateByByteLength(str, charset, maxBytes, 4, true);
}

/**
 * 截断字符串,使用其按照指定编码为字节后不超过maxBytes长度<br>
 * 此方法用于截取总bytes数不超过指定长度,如果字符出没有超出原样输出,如果超出了,则截取掉超出部分,并可选添加...,
 * 但是添加“...”后总长度也不超过限制长度。
 *
 * @param str        原始字符串
 * @param charset    指定编码
 * @param maxBytes   最大字节数
 * @param factor     速算因子,取该编码下单个字符的最大可能字节数
 * @param appendDots 截断后是否追加省略号(...)
 * @return 截断后的字符串
 */
public static String truncateByByteLength(String str, Charset charset, int maxBytes, int factor,
       boolean appendDots) {
    //字符数*速算因子<=最大字节数
    if (str == null || str.length() * factor <= maxBytes) {
       return str;
    }
    final byte[] sba = str.getBytes(charset);
    if (sba.length <= maxBytes) {
       return str;
    }
    //限制字节数
    final int limitBytes;
    if (appendDots) {
       limitBytes = maxBytes - "...".getBytes(charset).length;
    } else {
       limitBytes = maxBytes;
    }
    final ByteBuffer bb = ByteBuffer.wrap(sba, 0, limitBytes);
    final CharBuffer cb = CharBuffer.allocate(limitBytes);
    final CharsetDecoder decoder = charset.newDecoder();
    //忽略被截断的字符
    decoder.onMalformedInput(CodingErrorAction.IGNORE);
    decoder.decode(bb, cb, true);
    decoder.flush(cb);
    final String result = new String(cb.array(), 0, cb.position());
    if (appendDots) {
       return result + "...";
    }
    return result;
}

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...