[6]字符串String

前言

上节我们讲了函数接口Predicate的使用,大家感兴趣的话可参看以下文章:
[1]Kotlin中的算数运算
[2]二元运算符 ?:
[3]Any的使用 - 简书
[4]数组
[5]Predicate的使用

今天让我们来学习一下字符串String的相关知识,涉及内容有:
1.StringCharSequence
2.String的那些常用方法
3.封装类StringUtil的使用
4.StringUtil源码

一. String 与 CharSequence

在平常的开发中,我们经常会看到类似以下的代码:

    @Override
    public CharSequence getTileLabel() {
        return null;
    }

CharSequence是个啥不清楚,但是我们知道只要是CharSequence,我们就可以用String去代替或者返回。那么CharSequenceString到底是啥关系呢。翻看CharSequence代码可以发现:

public interface CharSequence {

    public val length: Int

    public operator fun get(index: Int): Char

    public fun subSequence(startIndex: Int, endIndex: Int): CharSequence
}

CharSequence是一个接口,它包含了一个length属性,还有两个方法:get(index: Int)subSequence(startIndex: Int, endIndex: Int)
这两个方法和一个属性,我们都似曾相识,好像在String时用过。那么接下来看看String源码:

public class String : Comparable<String>, CharSequence {
    companion object {}

    @kotlin.internal.IntrinsicConstEvaluation
    public operator fun plus(other: Any?): String

    @kotlin.internal.IntrinsicConstEvaluation
    public override val length: Int

    @kotlin.internal.IntrinsicConstEvaluation
    public override fun get(index: Int): Char

    public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence

    @kotlin.internal.IntrinsicConstEvaluation
    public override fun compareTo(other: String): Int

    @kotlin.internal.IntrinsicConstEvaluation
    public override fun equals(other: Any?): Boolean

    @kotlin.internal.IntrinsicConstEvaluation
    public override fun toString(): String
}

可以发现String继承于接口CharSequence,是CharSequence的实现类。

二. String 的那些常用方法

在日常开发中,String使用很频繁。当然,它也有很多方法,包括我们常用的equals()toString()subSequence(...)等。考虑到String的操作方法众多,我这边就封装了一个StringUtil工具类,便于对字符串String的操作。

三. 封装类 StringUtil 的使用

下面给出StringUtilTestActivity中的使用代码:

package com.example.kdemo.ui.test

import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.example.kdemo.R
import com.example.kdemo.databinding.ActivityTestBinding
import com.example.kdemo.util.data.normal.string.StringUtil
import com.example.kdemo.util.log.LogUtil
import com.example.kdemo.util.toast.ToastUtil

class TestActivity : AppCompatActivity(),View.OnClickListener {

    private lateinit var mBinding: ActivityTestBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityTestBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        initData()
        setListener()
    }

    private fun initData() {}

    private fun setListener() {
        mBinding.mBtnTest.setOnClickListener(this)
    }

    @RequiresApi(Build.VERSION_CODES.Q)
    override fun onClick(view: View) {
        when (view.id) {
            R.id.mBtnTest -> {
                test()
            }

            else -> {

            }
        }
    }

    @RequiresApi(Build.VERSION_CODES.Q)
    private fun test() {
        ToastUtil.showShortToast(this, "begin test")

        var str1 = "abcdefgh123"
        LogUtil.i("字符串 $str1 转大写: ${StringUtil.uppercase(str1)}")

        var str2 = "AbCDE"
        LogUtil.i("字符串 $str2 转小写: ${StringUtil.lowercase(str2)}")

        var str3 = "abc"
        LogUtil.i("字符串 $str3 首字母转大写: ${StringUtil.capitalize(str3)}")

        var str4 = "AEC"
        LogUtil.i("字符串 $str4 首字母转小写: ${StringUtil.decapitalize(str4)}")

        var str5 = "abcadea"
        LogUtil.i("字符串 $str5 去掉首尾'a': ${StringUtil.trim(str5,'a')}")
        LogUtil.i("字符串 $str5 去掉首尾'e','a': ${StringUtil.trim(str5,'e','a')}")

        var str6 = "abcadea"
        LogUtil.i("字符串 $str6 去掉首'a': ${StringUtil.trimStart(str6,'a')}")
        LogUtil.i("字符串 $str6 去掉首'a','b': ${StringUtil.trimStart(str6,'a','b')}")

        var str7 = "abcadea"
        LogUtil.i("字符串 $str7 去掉尾'a': ${StringUtil.trimEnd(str7,'a')}")
        LogUtil.i("字符串 $str7 去掉尾'e','a': ${StringUtil.trimEnd(str7,'e','a')}")

        var str8 = " abcadea "
        LogUtil.i("字符串 $str8 长度:${str8.length}  去掉首尾空格: ${StringUtil.trim(str8)} 后的长度: ${StringUtil.trim(str8).length}")
        LogUtil.i("字符串 $str8 长度:${str8.length}  去掉首空格: ${StringUtil.trimStart(str8)} 后的长度: ${StringUtil.trimStart(str8).length}")
        LogUtil.i("字符串 $str8 长度:${str8.length}  去掉尾空格: ${StringUtil.trimEnd(str8)} 后的长度: ${StringUtil.trimEnd(str8).length}")

        var str9 =" a bc d f"
        LogUtil.i("字符串 $str9 长度:${str9.length}  去掉所有空格: ${StringUtil.removeAllCharNull(str9)} 后的长度: ${StringUtil.removeAllCharNull(str9)?.length}")
        var str10="aaa"
        LogUtil.i("字符串 $str10 长度:${str9.length}  去掉所有'a': ${StringUtil.removeAllCharNull(str10,'a')} 后的长度: ${StringUtil.removeAllCharNull(str10,'a')?.length}")
        var str11=StringUtil.removeAllCharNull(str10,'a')
        LogUtil.i(" isEmpty=${str11?.isEmpty()}  isBlank=${str11?.isBlank()}")

        var str12 = "568"
        var str12Length = 5
        LogUtil.i("字符串 $str12 用0在开头填充为${str12Length}位数: ${StringUtil.padStart(str12,str12Length,'0')}")
        LogUtil.i("字符串 $str12 用0在开头填充为2位数: ${StringUtil.padStart(str12,2,'0')}")

        var str13 = "568"
        var str13Length = 6
        LogUtil.i("字符串 $str13 用a在结尾填充为${str13Length}位数: ${StringUtil.padEnd(str13,str13Length,'a')}")
        LogUtil.i("字符串 $str13 用a在结尾填充为1位数: ${StringUtil.padEnd(str13,1,'a')}")

        var str14 = "pojdadkfday"
        LogUtil.i("字符串 $str14 截取第一个'd'之前的所有字符: ${StringUtil.substringBefore(str14,'d')}")
        LogUtil.i("字符串 $str14 截取第一个'g'之前的所有字符: ${StringUtil.substringBefore(str14,'g')}")
        LogUtil.i("字符串 $str14 截取第一个字符串\"da\"之前的所有字符: ${StringUtil.substringBefore(str14,"da")}")
        LogUtil.i("字符串 $str14 截取第一个字符串\"F\"之前的所有字符: ${StringUtil.substringBefore(str14,"F")}")

        LogUtil.i("字符串 $str14 截取第一个'd'之后的所有字符: ${StringUtil.substringAfter(str14,'d')}")
        LogUtil.i("字符串 $str14 截取第一个'g'之后的所有字符: ${StringUtil.substringAfter(str14,'g')}")
        LogUtil.i("字符串 $str14 截取第一个字符串\"da\"之后的所有字符: ${StringUtil.substringAfter(str14,"da")}")
        LogUtil.i("字符串 $str14 截取第一个字符串\"F\"之后的所有字符: ${StringUtil.substringAfter(str14,"F")}")

        LogUtil.i("字符串 $str14 截取最后一个'd'之前的所有字符: ${StringUtil.substringBeforeLast(str14,'d')}")
        LogUtil.i("字符串 $str14 截取最后一个'g'之前的所有字符: ${StringUtil.substringBeforeLast(str14,'g')}")
        LogUtil.i("字符串 $str14 截取最后一个字符串\"da\"之前的所有字符: ${StringUtil.substringBeforeLast(str14,"da")}")
        LogUtil.i("字符串 $str14 截取最后一个字符串\"F\"之前的所有字符: ${StringUtil.substringBeforeLast(str14,"F")}")

        LogUtil.i("字符串 $str14 截取最后一个'd'之后的所有字符: ${StringUtil.substringAfterLast(str14,'d')}")
        LogUtil.i("字符串 $str14 截取最后一个'g'之后的所有字符: ${StringUtil.substringAfterLast(str14,'g')}")
        LogUtil.i("字符串 $str14 截取最后一个字符串\"da\"之后的所有字符: ${StringUtil.substringAfterLast(str14,"da")}")
        LogUtil.i("字符串 $str14 截取最后一个字符串\"F\"之后的所有字符: ${StringUtil.substringAfterLast(str14,"F")}")
        LogUtil.i("字符串 $str14 截取最后一个字符串\"F\"之后的所有字符,未找到\"F\"则返回\"G\": ${StringUtil.substringAfterLast(str14,"F","G")}")

        var str15 = "abcdefg"
        var startIndex = 0
        var endIndex = 4
        var replacement1 = "xyz"
        LogUtil.i("字符串 $str15 将下标${startIndex}-${endIndex}位置的内容替换为$replacement1 后的结果为: ${StringUtil.replaceRange(str15,startIndex,endIndex,replacement1)}")
        var replacement2 = ""
        LogUtil.i("字符串 $str15 将下标${startIndex}-${endIndex}位置的内容替换为$replacement2 后的结果为: ${StringUtil.replaceRange(str15,startIndex,endIndex,replacement2)}")

        var str16 = "abcdefg"
        var range1: IntRange = 0 until 3
        var range2: IntRange = 0..3
        var replacement160 = "Uv"
        LogUtil.i("字符串 $str16 将范围${range1}的内容替换为$replacement160 后的结果为: ${StringUtil.replaceRange(str16,range1,replacement160)}")
        LogUtil.i("字符串 $str16 将范围${range2}的内容替换为$replacement160 后的结果为: ${StringUtil.replaceRange(str16,range2,replacement160)}")

        var str17 = "abcdefg"
        var startIndex171 = 0
        var endIndex171 = 3
        LogUtil.i("字符串 $str17 将下标${startIndex171}-${endIndex171}位置的内容移除后的结果为: ${StringUtil.removeRange(str17,startIndex,endIndex)}")

        var str18 = "abcdefg"
        var range181: IntRange = 0 until 3
        var range182: IntRange = 0..3
        LogUtil.i("字符串 $str18 将范围${range181}的内容移除后的结果为: ${StringUtil.removeRange(str18,range181)}")
        LogUtil.i("字符串 $str18 将范围${range182}的内容替移除后的结果为: ${StringUtil.removeRange(str18,range182)}")

        var str19 = "abcdefg"
        var prefix190 = "ab"
        var prefix191 = "ac"
        LogUtil.i("字符串 $str19 删除前缀 ${prefix190}: ${StringUtil.removePrefix(str19,prefix190)}")
        LogUtil.i("字符串 $str19 删除前缀 ${prefix191}: ${StringUtil.removePrefix(str19,prefix191)}")

        var str20 = "abcdefg"
        var suffix200 = "fg"
        var suffix201 = "fc"
        LogUtil.i("字符串 $str20 删除后缀 ${suffix200}: ${StringUtil.removeSuffix(str20,suffix200)}")
        LogUtil.i("字符串 $str20 删除前缀 ${suffix201}: ${StringUtil.removePrefix(str20,suffix201)}")

        var str21 = "abcdefg"
        var prefix210 = "ab"
        var suffix211 = "fg"
        LogUtil.i("字符串 $str21 删除前缀${prefix210}与后缀 ${suffix211}: ${StringUtil.removeSurrounding(str21,prefix210,suffix211)}")

        var str22 = "abcdefgab"
        var str23 = "abcdefg"
        var fix220 = "ab"
        LogUtil.i("字符串 $str22 删除前缀${fix220}与后缀 ${fix220}: ${StringUtil.removeSurrounding(str22,fix220)}")
        LogUtil.i("字符串 $str23 删除前缀${fix220}与后缀 ${fix220}: ${StringUtil.removeSurrounding(str23,fix220)}")

        var str24 = "abcdef"
        var str240 = "FG"
        var char240 = 'b'
        var char241 = 'W'
        LogUtil.i("字符串 $str24 中第一个${char240}前的内容替换为 $str240 : ${StringUtil.replaceBefore(str24,char240,str240)}")
        LogUtil.i("字符串 $str24 中第一个${char241}前的内容替换为 $str240 : ${StringUtil.replaceBefore(str24,char241,str240,str24)}")
        LogUtil.i("字符串 $str24 中第一个${char241}前的内容替换为 $str240 : ${StringUtil.replaceBefore(str24,char241,str240,"H")}")

        LogUtil.i("字符串 $str24 中第一个${char240}后的内容替换为 $str240 : ${StringUtil.replaceAfter(str24,char240,str240)}")
        LogUtil.i("字符串 $str24 中第一个${char241}后的内容替换为 $str240 : ${StringUtil.replaceAfter(str24,char241,str240,str24)}")
        LogUtil.i("字符串 $str24 中第一个${char241}后的内容替换为 $str240 : ${StringUtil.replaceAfter(str24,char241,str240,"H")}")


        var str25 = "abcdef"
        var str250 = "KO"
        var str251 = "bc"
        var str252 = "gc"
        LogUtil.i("字符串 $str25 中第一个${str251}前的内容替换为 $str250 : ${StringUtil.replaceBefore(str25,str251,str250)}")
        LogUtil.i("字符串 $str25 中第一个${str252}前的内容替换为 $str250 : ${StringUtil.replaceBefore(str25,str252,str250,str24)}")
        LogUtil.i("字符串 $str25 中第一个${str252}前的内容替换为 $str250 : ${StringUtil.replaceBefore(str25,str252,str250,"RF")}")

        LogUtil.i("字符串 $str25 中第一个${str251}后的内容替换为 $str250 : ${StringUtil.replaceAfter(str25,str251,str250)}")
        LogUtil.i("字符串 $str25 中第一个${str252}后的内容替换为 $str250 : ${StringUtil.replaceAfter(str25,str252,str250,str24)}")
        LogUtil.i("字符串 $str25 中第一个${str252}后的内容替换为 $str250 : ${StringUtil.replaceAfter(str25,str252,str250,"RF")}")

        var str26 = "abcdefdkp"
        var str260 = "FG"
        var char260 = 'd'
        var char261 = 'W'
        LogUtil.i("字符串 $str26 中最后一个${char260}前的内容替换为 $str260 : ${StringUtil.replaceBeforeLast(str26,char260,str260)}")
        LogUtil.i("字符串 $str26 中最后一个${char261}前的内容替换为 $str260 : ${StringUtil.replaceBeforeLast(str26,char261,str260,str26)}")
        LogUtil.i("字符串 $str26 中最后一个${char261}前的内容替换为 $str260 : ${StringUtil.replaceBeforeLast(str26,char261,str260,"H")}")

        LogUtil.i("字符串 $str26 中最后一个${char260}后的内容替换为 $str260 : ${StringUtil.replaceAfterLast(str26,char260,str260)}")
        LogUtil.i("字符串 $str26 中最后一个${char261}后的内容替换为 $str260 : ${StringUtil.replaceAfterLast(str26,char261,str260,str26)}")
        LogUtil.i("字符串 $str26 中最后一个${char261}后的内容替换为 $str260 : ${StringUtil.replaceAfterLast(str26,char261,str260,"H")}")

        var str27 = "abcdefbcAS"
        var str270 = "KO"
        var str271 = "bc"
        var str272 = "gc"
        LogUtil.i("字符串 $str27 中最后一个${str271}前的内容替换为 $str270 : ${StringUtil.replaceBeforeLast(str27,str271,str270)}")
        LogUtil.i("字符串 $str27 中最后一个${str272}前的内容替换为 $str270 : ${StringUtil.replaceBeforeLast(str27,str272,str270,str27)}")
        LogUtil.i("字符串 $str27 中最后一个${str272}前的内容替换为 $str270 : ${StringUtil.replaceBeforeLast(str27,str272,str270,"RF")}")

        LogUtil.i("字符串 $str27 中最后一个${str271}后的内容替换为 $str270 : ${StringUtil.replaceAfterLast(str27,str271,str270)}")
        LogUtil.i("字符串 $str27 中最后一个${str272}后的内容替换为 $str270 : ${StringUtil.replaceAfterLast(str27,str272,str270,str27)}")
        LogUtil.i("字符串 $str27 中最后一个${str272}后的内容替换为 $str270 : ${StringUtil.replaceAfterLast(str27,str272,str270,"RF")}")

        var str28 = "a8B9c7"
        var regex28 = Regex("[a-zA-Z]+") //表示一个或多个字母
        var str280 = "*"
        LogUtil.i("字符串 $str28 中字母替换为 $str280 : ${StringUtil.replace(str28, regex28, str280)}")

        var str29 = "a8B9a7"
        var regex29 = Regex("[a]") //表示首字母
        LogUtil.i("字符串 $str29 中字母\"a\"替换为\"ps\" : ${StringUtil.replace(str29, regex29, { m -> "ps"})}")

        var str30 = "a5a6a5"
        var str301 = "a6a6a5"
        var regex30 = Regex("[a][5]") //表示匹配字母a5
        LogUtil.i("字符串 $str30 替换首个满足 regex30 正则表达式的内容为\"A\" : ${StringUtil.replaceFirst(str30, regex30, "A")}")
        LogUtil.i("字符串 $str301 替换首个满足 regex30 正则表达式的内容为\"A\" : ${StringUtil.replaceFirst(str301, regex30, "A")}")


        var str31="abcd"
        var str310="Abgkp"
        LogUtil.i("返回字符串 $str31 和 $str310 的公共前缀(比对时不忽略大小写): ${StringUtil.commonPrefixWith(str31,str310,false)}")
        LogUtil.i("返回字符串 $str31 和 $str310 的公共前缀(比对时忽略大小写[返回小写前缀]): ${StringUtil.commonPrefixWith(str31,str310,true)}")

        var str32="abcdef"
        var str320="wgheF"
        LogUtil.i("返回字符串 $str32 和 $str320 的公共后缀(比对时不忽略大小写): ${StringUtil.commonSuffixWith(str32,str320,false)}")
        LogUtil.i("返回字符串 $str32 和 $str320 的公共后缀(比对时忽略大小写[返回小写后缀]): ${StringUtil.commonSuffixWith(str32,str320,true)}")

        //splitToSequence 分割字符串
        var str33="你好,我是|小学生"
        //多字符分割
        var sequence330 = str33.splitToSequence(",","|")
        //单字符分割
        var sequence331 = str33.splitToSequence(",")
        sequence330.forEach { LogUtil.i("sequence330: $it") }
        sequence331.forEach { LogUtil.i("sequence331: $it") }

        //正则表达式匹配数字分割
        var str34="你好,我是1年级学生,你是2年级学生吗?你9岁了吗?"
        var regex340 = Regex("[0-9]") //正则表达式匹配数字分割
        var sequence341 = StringUtil.splitToSequence(str34,regex340)
        sequence341.forEach { LogUtil.i("sequence341: $it") }

        //回车,换行分割
        var str35 = "我是中国人,我爱中国。\n我来自家\r乡小镇,我也爱着\n我的家乡。"
        LogUtil.i("str35: $str35")
        var sequence350 = StringUtil.lineSequence(str35)
        sequence350.forEach { LogUtil.i("sequence350: $it") }
        var str36 = sequence350.joinToString("")
        LogUtil.i("str36: $str36")

        //字符串数组转字符串
        var arrayContent = arrayOf("a","b","c")
        var str37 = arrayContent.joinToString("")
        LogUtil.i("str37: $str37    length=${str37.length}")
        var str370 = StringUtil.removeAllStringNull(str37)
        LogUtil.i("str37: $str37   removeAllStringNull length=${str37.length}")
        var sequence370 = str370?.splitToSequence("")
        sequence370?.filter { StringUtil.isNotEmpty(it) }
            ?.forEach { LogUtil.i("sequence370: $it") }

    }


}

运行结果如下:

19:54:09.377  I  字符串 abcdefgh123 转大写: ABCDEFGH123
19:54:09.377  I  字符串 AbCDE 转小写: abcde
19:54:09.377  I  字符串 abc 首字母转大写: Abc
19:54:09.377  I  字符串 AEC 首字母转小写: aEC
19:54:09.390  I  字符串 abcadea 去掉首尾'a': bcade
19:54:09.391  I  字符串 abcadea 去掉首尾'e','a': bcad
19:54:09.391  I  字符串 abcadea 去掉首'a': bcadea
19:54:09.391  I  字符串 abcadea 去掉首'a','b': cadea
19:54:09.391  I  字符串 abcadea 去掉尾'a': abcade
19:54:09.391  I  字符串 abcadea 去掉尾'e','a': abcad
19:54:09.391  I  字符串  abcadea  长度:9  去掉首尾空格: abcadea 后的长度: 7
19:54:09.391  I  字符串  abcadea  长度:9  去掉首空格: abcadea  后的长度: 8
19:54:09.391  I  字符串  abcadea  长度:9  去掉尾空格:  abcadea 后的长度: 8
19:54:09.392  I  字符串  a bc d f 长度:9  去掉所有空格: abcdf 后的长度: 5
19:54:09.392  I  字符串 aaa 长度:9  去掉所有'a': null 后的长度: null
19:54:09.392  I   isEmpty=null  isBlank=null
19:54:09.392  I  字符串 568 用0在开头填充为5位数: 00568
19:54:09.392  I  字符串 568 用0在开头填充为2位数: 568
19:54:09.392  I  字符串 568 用a在结尾填充为6位数: 568aaa
19:54:09.392  I  字符串 568 用a在结尾填充为1位数: 568
19:54:09.392  I  字符串 pojdadkfday 截取第一个'd'之前的所有字符: poj
19:54:09.392  I  字符串 pojdadkfday 截取第一个'g'之前的所有字符: pojdadkfday
19:54:09.392  I  字符串 pojdadkfday 截取第一个字符串"da"之前的所有字符: poj
19:54:09.392  I  字符串 pojdadkfday 截取第一个字符串"F"之前的所有字符: pojdadkfday
19:54:09.392  I  字符串 pojdadkfday 截取第一个'd'之后的所有字符: adkfday
19:54:09.392  I  字符串 pojdadkfday 截取第一个'g'之后的所有字符: pojdadkfday
19:54:09.393  I  字符串 pojdadkfday 截取第一个字符串"da"之后的所有字符: dkfday
19:54:09.393  I  字符串 pojdadkfday 截取第一个字符串"F"之后的所有字符: pojdadkfday
19:54:09.393  I  字符串 pojdadkfday 截取最后一个'd'之前的所有字符: pojdadkf
19:54:09.393  I  字符串 pojdadkfday 截取最后一个'g'之前的所有字符: pojdadkfday
19:54:09.393  I  字符串 pojdadkfday 截取最后一个字符串"da"之前的所有字符: pojdadkf
19:54:09.393  I  字符串 pojdadkfday 截取最后一个字符串"F"之前的所有字符: pojdadkfday
19:54:09.393  I  字符串 pojdadkfday 截取最后一个'd'之后的所有字符: ay
19:54:09.393  I  字符串 pojdadkfday 截取最后一个'g'之后的所有字符: pojdadkfday
19:54:09.393  I  字符串 pojdadkfday 截取最后一个字符串"da"之后的所有字符: y
19:54:09.393  I  字符串 pojdadkfday 截取最后一个字符串"F"之后的所有字符: pojdadkfday
19:54:09.393  I  字符串 pojdadkfday 截取最后一个字符串"F"之后的所有字符,未找到"F"则返回"G": G
19:54:09.393  I  字符串 abcdefg 将下标0-4位置的内容替换为xyz 后的结果为: xyzefg
19:54:09.393  I  字符串 abcdefg 将下标0-4位置的内容替换为 后的结果为: efg
19:54:09.393  I  字符串 abcdefg 将范围0..2的内容替换为Uv 后的结果为: Uvdefg
19:54:09.393  I  字符串 abcdefg 将范围0..3的内容替换为Uv 后的结果为: Uvefg
19:54:09.394  I  字符串 abcdefg 将下标0-3位置的内容移除后的结果为: efg
19:54:09.394  I  字符串 abcdefg 将范围0..2的内容移除后的结果为: defg
19:54:09.394  I  字符串 abcdefg 将范围0..3的内容替移除后的结果为: efg
19:54:09.394  I  字符串 abcdefg 删除前缀 ab: cdefg
19:54:09.394  I  字符串 abcdefg 删除前缀 ac: abcdefg
19:54:09.394  I  字符串 abcdefg 删除后缀 fg: abcde
19:54:09.394  I  字符串 abcdefg 删除前缀 fc: abcdefg
19:54:09.394  I  字符串 abcdefg 删除前缀ab与后缀 fg: cde
19:54:09.394  I  字符串 abcdefgab 删除前缀ab与后缀 ab: cdefg
19:54:09.394  I  字符串 abcdefg 删除前缀ab与后缀 ab: abcdefg
19:54:09.394  I  字符串 abcdef 中第一个b前的内容替换为 FG : FGbcdef
19:54:09.394  I  字符串 abcdef 中第一个W前的内容替换为 FG : abcdef
19:54:09.394  I  字符串 abcdef 中第一个W前的内容替换为 FG : H
19:54:09.395  I  字符串 abcdef 中第一个b后的内容替换为 FG : abFG
19:54:09.395  I  字符串 abcdef 中第一个W后的内容替换为 FG : abcdef
19:54:09.395  I  字符串 abcdef 中第一个W后的内容替换为 FG : H
19:54:09.395  I  字符串 abcdef 中第一个bc前的内容替换为 KO : KObcdef
19:54:09.395  I  字符串 abcdef 中第一个gc前的内容替换为 KO : abcdef
19:54:09.395  I  字符串 abcdef 中第一个gc前的内容替换为 KO : RF
19:54:09.395  I  字符串 abcdef 中第一个bc后的内容替换为 KO : abcKO
19:54:09.395  I  字符串 abcdef 中第一个gc后的内容替换为 KO : abcdef
19:54:09.395  I  字符串 abcdef 中第一个gc后的内容替换为 KO : RF
19:54:09.395  I  字符串 abcdefdkp 中最后一个d前的内容替换为 FG : FGdkp
19:54:09.395  I  字符串 abcdefdkp 中最后一个W前的内容替换为 FG : abcdefdkp
19:54:09.395  I  字符串 abcdefdkp 中最后一个W前的内容替换为 FG : H
19:54:09.395  I  字符串 abcdefdkp 中最后一个d后的内容替换为 FG : abcdefdFG
19:54:09.395  I  字符串 abcdefdkp 中最后一个W后的内容替换为 FG : abcdefdkp
19:54:09.395  I  字符串 abcdefdkp 中最后一个W后的内容替换为 FG : H
19:54:09.395  I  字符串 abcdefbcAS 中最后一个bc前的内容替换为 KO : KObcAS
19:54:09.395  I  字符串 abcdefbcAS 中最后一个gc前的内容替换为 KO : abcdefbcAS
19:54:09.396  I  字符串 abcdefbcAS 中最后一个gc前的内容替换为 KO : RF
19:54:09.396  I  字符串 abcdefbcAS 中最后一个bc后的内容替换为 KO : abcdefbcKO
19:54:09.396  I  字符串 abcdefbcAS 中最后一个gc后的内容替换为 KO : abcdefbcAS
19:54:09.396  I  字符串 abcdefbcAS 中最后一个gc后的内容替换为 KO : RF
19:54:09.397  I  字符串 a8B9c7 中字母替换为 * : *8*9*7
19:54:09.397  I  字符串 a8B9a7 中字母"a"替换为"ps" : ps8B9ps7
19:54:09.397  I  字符串 a5a6a5 替换首个满足 regex30 正则表达式的内容为"A" : Aa6a5
19:54:09.397  I  字符串 a6a6a5 替换首个满足 regex30 正则表达式的内容为"A" : a6a6A
19:54:09.398  I  返回字符串 abcd 和 Abgkp 的公共前缀(比对时不忽略大小写): 
19:54:09.398  I  返回字符串 abcd 和 Abgkp 的公共前缀(比对时忽略大小写[返回小写前缀]): ab
19:54:09.398  I  返回字符串 abcdef 和 wgheF 的公共后缀(比对时不忽略大小写): 
19:54:09.398  I  返回字符串 abcdef 和 wgheF 的公共后缀(比对时忽略大小写[返回小写后缀]): ef
19:54:09.400  I  sequence330: 你好
19:54:09.401  I  sequence330: 我是
19:54:09.401  I  sequence330: 小学生
19:54:09.403  I  sequence331: 你好
19:54:09.403  I  sequence331: 我是|小学生
19:54:09.404  I  sequence341: 你好,我是
19:54:09.404  I  sequence341: 年级学生,你是
19:54:09.404  I  sequence341: 年级学生吗?你
19:54:09.404  I  sequence341: 岁了吗?
19:54:09.405  I  str35: 我是中国人,我爱中国。
                 我来自家乡小镇,我也爱着
                 我的家乡。
19:54:09.405  I  sequence350: 我是中国人,我爱中国。
19:54:09.405  I  sequence350: 我来自家
19:54:09.405  I  sequence350: 乡小镇,我也爱着
19:54:09.405  I  sequence350: 我的家乡。
19:54:09.405  I  str36: 我是中国人,我爱中国。我来自家乡小镇,我也爱着我的家乡。
19:54:09.405  I  str37: abc    length=3
19:54:09.405  I  str37: abc   removeAllStringNull length=3
19:54:09.406  I  sequence370: a
19:54:09.406  I  sequence370: b
19:54:09.406  I  sequence370: c
20:47:13.548  I  字符串 abcdefgh123 转大写: ABCDEFGH123
20:47:13.548  I  字符串 AbCDE 转小写: abcde
20:47:13.548  I  字符串 abc 首字母转大写: Abc
20:47:13.548  I  字符串 AEC 首字母转小写: aEC
20:47:13.548  I  字符串 abcadea 去掉首尾'a': bcade
20:47:13.549  I  字符串 abcadea 去掉首尾'e','a': bcad
20:47:13.549  I  字符串 abcadea 去掉首'a': bcadea
20:47:13.549  I  字符串 abcadea 去掉首'a','b': cadea
20:47:13.549  I  字符串 abcadea 去掉尾'a': abcade
20:47:13.549  I  字符串 abcadea 去掉尾'e','a': abcad
20:47:13.549  I  字符串  abcadea  长度:9  去掉首尾空格: abcadea 后的长度: 7
20:47:13.549  I  字符串  abcadea  长度:9  去掉首空格: abcadea  后的长度: 8
20:47:13.549  I  字符串  abcadea  长度:9  去掉尾空格:  abcadea 后的长度: 8
20:47:13.549  I  字符串  a bc d f 长度:9  去掉所有空格: abcdf 后的长度: 5
20:47:13.549  I  字符串 aaa 长度:9  去掉所有'a': null 后的长度: null
20:47:13.549  I   isEmpty=null  isBlank=null
20:47:13.549  I  字符串 568 用0在开头填充为5位数: 00568
20:47:13.549  I  字符串 568 用0在开头填充为2位数: 568
20:47:13.549  I  字符串 568 用a在结尾填充为6位数: 568aaa
20:47:13.549  I  字符串 568 用a在结尾填充为1位数: 568
20:47:13.549  I  字符串 pojdadkfday 截取第一个'd'之前的所有字符: poj
20:47:13.550  I  字符串 pojdadkfday 截取第一个'g'之前的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取第一个字符串"da"之前的所有字符: poj
20:47:13.550  I  字符串 pojdadkfday 截取第一个字符串"F"之前的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取第一个'd'之后的所有字符: adkfday
20:47:13.550  I  字符串 pojdadkfday 截取第一个'g'之后的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取第一个字符串"da"之后的所有字符: dkfday
20:47:13.550  I  字符串 pojdadkfday 截取第一个字符串"F"之后的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取最后一个'd'之前的所有字符: pojdadkf
20:47:13.550  I  字符串 pojdadkfday 截取最后一个'g'之前的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取最后一个字符串"da"之前的所有字符: pojdadkf
20:47:13.550  I  字符串 pojdadkfday 截取最后一个字符串"F"之前的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取最后一个'd'之后的所有字符: ay
20:47:13.550  I  字符串 pojdadkfday 截取最后一个'g'之后的所有字符: pojdadkfday
20:47:13.550  I  字符串 pojdadkfday 截取最后一个字符串"da"之后的所有字符: y
20:47:13.551  I  字符串 pojdadkfday 截取最后一个字符串"F"之后的所有字符: pojdadkfday
20:47:13.551  I  字符串 pojdadkfday 截取最后一个字符串"F"之后的所有字符,未找到"F"则返回"G": G
20:47:13.551  I  字符串 abcdefg 将下标0-4位置的内容替换为xyz 后的结果为: xyzefg
20:47:13.551  I  字符串 abcdefg 将下标0-4位置的内容替换为 后的结果为: efg
20:47:13.551  I  字符串 abcdefg 将范围0..2的内容替换为Uv 后的结果为: Uvdefg
20:47:13.551  I  字符串 abcdefg 将范围0..3的内容替换为Uv 后的结果为: Uvefg
20:47:13.551  I  字符串 abcdefg 将下标0-3位置的内容移除后的结果为: efg
20:47:13.551  I  字符串 abcdefg 将范围0..2的内容移除后的结果为: defg
20:47:13.551  I  字符串 abcdefg 将范围0..3的内容替移除后的结果为: efg
20:47:13.551  I  字符串 abcdefg 删除前缀 ab: cdefg
20:47:13.551  I  字符串 abcdefg 删除前缀 ac: abcdefg
20:47:13.551  I  字符串 abcdefg 删除后缀 fg: abcde
20:47:13.551  I  字符串 abcdefg 删除前缀 fc: abcdefg
20:47:13.551  I  字符串 abcdefg 删除前缀ab与后缀 fg: cde
20:47:13.551  I  字符串 abcdefgab 删除前缀ab与后缀 ab: cdefg
20:47:13.552  I  字符串 abcdefg 删除前缀ab与后缀 ab: abcdefg
20:47:13.552  I  字符串 abcdef 中第一个b前的内容替换为 FG : FGbcdef
20:47:13.552  I  字符串 abcdef 中第一个W前的内容替换为 FG : abcdef
20:47:13.552  I  字符串 abcdef 中第一个W前的内容替换为 FG : H
20:47:13.552  I  字符串 abcdef 中第一个b后的内容替换为 FG : abFG
20:47:13.552  I  字符串 abcdef 中第一个W后的内容替换为 FG : abcdef
20:47:13.552  I  字符串 abcdef 中第一个W后的内容替换为 FG : H
20:47:13.552  I  字符串 abcdef 中第一个bc前的内容替换为 KO : KObcdef
20:47:13.552  I  字符串 abcdef 中第一个gc前的内容替换为 KO : abcdef
20:47:13.552  I  字符串 abcdef 中第一个gc前的内容替换为 KO : RF
20:47:13.552  I  字符串 abcdef 中第一个bc后的内容替换为 KO : abcKO
20:47:13.552  I  字符串 abcdef 中第一个gc后的内容替换为 KO : abcdef
20:47:13.552  I  字符串 abcdef 中第一个gc后的内容替换为 KO : RF
20:47:13.552  I  字符串 abcdefdkp 中最后一个d前的内容替换为 FG : FGdkp
20:47:13.552  I  字符串 abcdefdkp 中最后一个W前的内容替换为 FG : abcdefdkp
20:47:13.552  I  字符串 abcdefdkp 中最后一个W前的内容替换为 FG : H
20:47:13.553  I  字符串 abcdefdkp 中最后一个d后的内容替换为 FG : abcdefdFG
20:47:13.553  I  字符串 abcdefdkp 中最后一个W后的内容替换为 FG : abcdefdkp
20:47:13.553  I  字符串 abcdefdkp 中最后一个W后的内容替换为 FG : H
20:47:13.553  I  字符串 abcdefbcAS 中最后一个bc前的内容替换为 KO : KObcAS
20:47:13.553  I  字符串 abcdefbcAS 中最后一个gc前的内容替换为 KO : abcdefbcAS
20:47:13.553  I  字符串 abcdefbcAS 中最后一个gc前的内容替换为 KO : RF
20:47:13.553  I  字符串 abcdefbcAS 中最后一个bc后的内容替换为 KO : abcdefbcKO
20:47:13.553  I  字符串 abcdefbcAS 中最后一个gc后的内容替换为 KO : abcdefbcAS
20:47:13.553  I  字符串 abcdefbcAS 中最后一个gc后的内容替换为 KO : RF
20:47:13.553  I  字符串 a8B9c7 中字母替换为 * : *8*9*7
20:47:13.553  I  字符串 a8B9a7 中字母"a"替换为"ps" : ps8B9ps7
20:47:13.554  I  字符串 a5a6a5 替换首个满足 regex30 正则表达式的内容为"A" : Aa6a5
20:47:13.554  I  字符串 a6a6a5 替换首个满足 regex30 正则表达式的内容为"A" : a6a6A
20:47:13.554  I  返回字符串 abcd 和 Abgkp 的公共前缀(比对时不忽略大小写): 
20:47:13.554  I  返回字符串 abcd 和 Abgkp 的公共前缀(比对时忽略大小写[返回小写前缀]): ab
20:47:13.554  I  返回字符串 abcdef 和 wgheF 的公共后缀(比对时不忽略大小写): 
20:47:13.554  I  返回字符串 abcdef 和 wgheF 的公共后缀(比对时忽略大小写[返回小写后缀]): ef
20:47:13.554  I  sequence330: 你好
20:47:13.554  I  sequence330: 我是
20:47:13.554  I  sequence330: 小学生
20:47:13.554  I  sequence331: 你好
20:47:13.554  I  sequence331: 我是|小学生
20:47:13.555  I  sequence341: 你好,我是
20:47:13.555  I  sequence341: 年级学生,你是
20:47:13.555  I  sequence341: 年级学生吗?你
20:47:13.555  I  sequence341: 岁了吗?
20:47:13.555  I  str35: 我是中国人,我爱中国。
                 我来自家乡小镇,我也爱着
                 我的家乡。
20:47:13.555  I  sequence350: 我是中国人,我爱中国。
20:47:13.555  I  sequence350: 我来自家
20:47:13.555  I  sequence350: 乡小镇,我也爱着
20:47:13.555  I  sequence350: 我的家乡。
20:47:13.555  I  str36: 我是中国人,我爱中国。我来自家乡小镇,我也爱着我的家乡。
20:47:13.555  I  str37: abc    length=3
20:47:13.555  I  str37: abc   removeAllStringNull length=3
20:47:13.556  I  sequence370: a
20:47:13.556  I  sequence370: b
20:47:13.556  I  sequence370: c

由于String的丰富操作,我们可以结合Gson/Json等将对象数据以字符串的形式存储,实现非数据形式的轻量存储方式。

四. StringUtil 源码

下面给出StringUtil源码:

还有 35% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
支付 ¥4.00 继续阅读
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容