Apache Commons Lang 2.4 代码分析之StringUtils

Apache Commons Lang 2.4 代码分析之StringUtils


======================
变量

public static final String EMPTY = "";表示空字符串

public static final int INDEX_NOT_FOUND = -1;表示下表没有找到

private static final int PAD_LIMIT = 8192;重复一个字符串的最大次数

======================
一组判断函数

isEmpty方法判断参数字符串是否为空,如果字符串本身为空或长度为0,则返回真。

isNotEmpty方法判断参数字符串是否不为空,对上一个方法的结果取反。

isBlank方法判断参数字符串是否没有内容。如果字符串为空或长度为0,则返回真;否则,利用Character.isWhitespace方法测试每一个字符是否为空格,一旦有一个不是,则返回假,否则返回真。

isNotBlank方法判断参数字符串是否不是没有内容。对上一个方法的结果取反。
======================
trim相关

trim方法返回参数字符串去掉前后空格的结果,使用string本身的trim方法,只是在之前测验字符串是否为空。(实际上优化了string本身的trim方法)

trimToNull方法先去空格,然后利用isEmpty方法判断是否为空,空则返回null,否则返回处理后的结果。

trimToEmpty方法,如果参数字符串为null,则返回"",否则去空格后返回。
=======================
strip相关
strip方法和trim方法类似,不同的是,后者只可以去空格,而前者可以去掉任意名为stripChars的字符集合,如果该字符串(字符集合)为空,则两个方法是相同的。

stripStart方法在字符串str的前面去掉stripChars代表的字符集合,执行如下操作:
 
如果str为空或长度为0,返回str。
  声明一个游标。
  如果stripChars为空,则向后移动游标至第一个不为空格的位置。
  否则如果stripChars为"",则直接返回str。
  否则在stripChars中查找str中的当前字符,如果存在,则向后依次移动游标。
  返回str从游标开始位置到最后的那部分子字符串。

stripEnd方法在字符串str的后面去掉stripChars代表的字符集合,方法同stripStart,只不过游标从后向前移动。

strip方法,如果不提供stripChars,则设为Null。如果字符串为空,则返回该字符串,否则分别执行stripStart和stripEnd方法,并返回结果。

stripToNull方法,同trimToNull方法。

stripToEmpty方法,同trimToEmpty方法。

stripAll方法,参数为字符串数组,利用strip方法处理一组字符串,返回的也是数组,但非参数数组(new了一个新的)。
=====================
equals相关
equals方法比较两个字符串,使用其中一个的equals方法,只不过之前对两个字符串进行判空。如果两个字符串均为空,则返回真;如果第一个为空,第二个不为空,则返回假;如果第一个不为空,则利用第一个参数的equals方法获得结果。

equalsIgnoreCase方法不考虑大小写的比较字符串,方法和equals方法类似。
======================
indexOf相关
该组方法返回字符串中的某个字符串从左侧数第一次出现的位置。查找字符串可以是string或char,另外可以带一个参数,表示开始查找的位置。该组方法核心都是使用String对象的indexOf方法,不过在之前做一些空的判断(统一返回-1)。

ordinalIndexOf
该方法查找第ordinal个匹配的字符串(传统的indexOf都是查找第一个)。思路是用两个计数器记录找到的字符串位置和当前是第几个,然后循环查找字符串,当第二个计数器和ordinal相等时,返回第一个计数器的值。

lastIndexOf相关
该组方法返回字符串中的某个字符串从右侧数最后一次出现的位置。查找字符串可以是string或char,另外可以带一个参数,表示开始查找的位置。该组方法核心都是使用String对象的lastIndexOf方法,不过在之前做一些空的判断(统一返回-1)。

indexOfAny相关
该方法在字符串中查找一组字符,返回遇到的任意一个字符即可。这组字符可以作为char数组或String的形式传入。通过遍历当前字符串,如果字符和数组中的字符一致,则返回当前位置,否则返回-1。

indexOfAnyBut相关
该方法在字符串中查找一组字符,返回首先遇到的任意一个不在该组字符的位置即可。该方法可以看做是indexOfAny的反向方法。这组字符可以作为char数组或String的形式传入。处理和indexOfAny类似,只不过在遍历字符串时,如果遇到相同的字符,则直接在字符串中找下一个字符,直到找到第一个完全不在字符数组中的字符所在的位置。

indexOfAny和lastIndexOfAny
该方法返回被测字符串中,任意匹配字符串数组的位置,last表示从后向前匹配。处理方法是遍历字符串数组,然后依次在被查字符串中查找位置。同时由于字符串和字符不同,所以要记录当前找到的位置,如果下次找到的位置更靠左,则更新这个位置。这样就能做到在字符串数组中,找最先遇到的字符串的位置。last的遍历顺序相反。
===========================
contains相关
查找参数字符串是否在给定的字符串中,参数可以是char或string。如果给定字符串为空或参数字符串为空,则返回假,利用indexOf的结果是否为-1确定返回值。

containsIgnoreCase
该方法查找参数字符串是否在给定的字符串中,不考虑大小写。原理是把字符串全部转换为大写后,利用contains方法判断。

containsAny相关
该方法在字符串中确定是否存在一组字符中的任意一个。这组字符可以作为char数组或String的形式传入。通过遍历当前字符串,如果字符和数组中的字符一致,则返回真,否则返回假。

containsOnly相关
测试字符串是否只包含字符数组中的那些字符。如果被测字符串和字符数组有一个为空,则为假。如果被测字符串长度为0,则为真。如果字符数组长度为0,则为假。否则利用indexOfAnyBut方法得到位置,如果该位置为-1(详见indexOfAnyBut的意义),则返回真,否则返回假。

containsNone相关
测试字符串是否任意一个字符数组中的字符。遍历字符串,如果任意一个字符与字符数组中的字符相同,则返回真,否则返回假。
==============================
substring相关
和String对象的substring方法类似,只是在之前对字符串进行校验,如果为null,则返回null。
另外对start进行校验:如果start小于0,则加长度(即把负数作为从右侧开始计数);如果还小于0,则设为0;如果大于长度,则返回""。
如果存在end,进行校验:如果都小于0,则加长度;如果end大于长度,则等于长度;如果start大于end,返回"";如果start或end还小于0,则置为0。

substringBefore相关
substringBefore方法返回被测字符串中,在参数字符串之前的部分。如果被测字符串为空或参数字符串为null,则返回被测字符串;如果参数字符串长度为0,则返回"";在被测字符串中取参数字符串的位置,如果不存在,则返回被测字符串,否则返回该位置之前的子字符串。
substringBeforeLast方法与上一个方法类似,只是在查找参数字符串时,使用String的lastIndexOf方法,即结束位置在最后一个匹配参数字符串的位置。

substringAfter相关
substringAfter方法与substringBefore类似,只不过取当前位置向后的那部分子字符串。
substringAfterLast与substringBeforeLast类似,只不过取当前位置向后的那部分子字符串。

substringBetween相关
substringBetween方法在被测字符串中截取前后字符串之间的子字符串(前后字符串可以为一个字符串)。首先确定前字符串的位置,如果不存在则返回null。然后确定后字符串的位置,如果不存在则返回null。最后返回两个位置之间的子字符串。
substringsBetween方法的不同之处在于返回所有前后字符串之间的子字符串,形成一个数组。注意这里只返回前后字符串中间的内容,而后前之间的内容不是返回的结果。在循环遍历中,依次查找前后字符串,然后把中间的内容加到一个数组中。直到指针超过最后一个后字符串。

left/right/mid相关
left方法获取字符串从左向右的n个长度的子字符串。利用String的substring方法获取,其中start为0,len为n。之前有一些判断,如果n小于0,则返回"";如果n大于长度,则返回当前字符串。
right方法获取字符串从右向左的n个长度的子字符串。利用String的substring方法获取,其中start取长度减n。之前判断同left方法。
mid方法取字符串中部从p开始的n个长度的子字符串。利用String的substring方法获取,其中start为p,len为p加n。之前有一些判断,如果n小于0或p大于长度,则返回"";如果p小于0,则置为0;如果n+p大于长度,则返回从p开始的所有子字符串。
===========================
split相关

私有方法splitWorker是一个核心方法,用于拆分字符串,其中字符c表示分隔符,另外布尔变量b表示c在首尾的不同处理方式。为真,则在首位留一个""的字符串。但是在中间是没有作用的。该方法执行如下操作:
  如果字符串为null,则返回null。
  如果字符串为"",则返回""。
  用i作为指针遍历字符串,match和lastMatch分别表示遇到和最后遇到可分割的内容。
      如果字符串中第一个就遇到c,则看b的值,如果为真,则会在结果数组中存入一个""。如果没遇到,match置真,lastMatch置假,表示有要分割的内容。
      一旦遇到c,则在结果数组中输出字符串在i之前的子字符串,并把起始点调整到i之后。且match置假,lastMatch置真。
  遍历结束,如果match为真(到最后也没有遇到c),或者lastMatch和b同为真(最后一个字符是c),则输出最后的部分(如果是后者,则会输出一个"")。

私有方法splitWorker也是一个核心方法,用于拆分字符串,其与上一个方法的不同之处在于其分隔符用字符串表示一组字符,且增加一个max变量,表示输出的字符串数组的最大长度。另外注意该方法的b如果为真,会在首尾及中间起作用,且如果分隔符字符串长度大于1,则数组中的""会更多(根据分隔符字符的数量)。该方法执行如下操作:
  如果字符串为null,则返回null。
  如果字符串为"",则返回""。
  之后的处理分三种情况,分别是分隔符字符串为null,则默认为"";分割符字符串长度为1;分割符字符串为普通字符串。这三种处理的不同只是在当前遍历中的字符的判断问题。
      1.利用Character.isWhitespace方法判断每个字符是否为" "。
      2.先把字符串转化为一个char,然后就和前一个splitWorker方法类似。
      3.利用indexOf方法查找当前字符是否在分隔符字符串中,然后就和前一个splitWorker方法类似。
      需要注意的是,如果输出的数组的数量已经等于max的值,则把指针直接挪到最后,等待下次遍历的时候直接跳出。同时由于lastMatch和match都置为假,最后也不会输出""了。
    遍历结束,如果match为真(到最后也没有遇到c),或者lastMatch和b同为真(最后一个字符在分隔符字符串中),则输出最后的部分(如果是后者,则会输出一个"")。
     
split方法族用于分割字符串,根据参数不同有以下几种。
如果参数只有待分割的字符串,则默认使用" "来分隔字符串。结果数组长度不限(用-1表示),且b为假。
如果参数还包含分割字符,则使用第一个splitWorker来分隔,且b为假。
如果参数用字符串表示分割字符,则使用第二个splitWorker来分隔。结果数组长度不限(用-1表示),且b为假。
如果参数还包含max,则使用第二个splitWorker来分隔,且b为假。
     
splitPreserveAllTokens相关
保留分隔符空位的方式分割字符串,同split方法的参数相同,只是在所有调用splitWorker方法(不管第一个还是第二个)时,b均为真。

私有方法splitByWholeSeparatorWor ker是一个核心方法,同第二个splitWorker方法参数相同,惟一的区别是分隔符字符串作为一个整体,而不是作为字符集合。该方法执行如下操作:
  如果字符串为null,则返回null。
  如果字符串为"",则返回""。
  如果分隔符字符串为null或"",则使用第二个splitWorker方法处理,并返回结果。
  定义beg为字符串指针位置,end为在字符串中查找到的分隔符的位置,如果end大于beg,则输出beg和end之间的内容,并把beg置为刚搜索到的分隔符的后面,重复该过程;如果end等于beg,则根据b的值,如果b为真,则输出一个"",然后把beg置为刚搜索到的分隔符的后面,否则直接设置beg的值,重复该过程。
  如果end未找到,则输出最后一个分隔符之后到字符串结尾的位置。
该方法依然要注意max的值在数组中的控制。

splitByWholeSeparator相关
利用splitByWholeSeparatorWor ker方法分割字符串,如果没有指定max和b,则分别设为-1和false。

splitByWholeSeparatorPre serveAllTokens相关
利用splitByWholeSeparatorWor ker方法分割字符串,b均为真。

splitByCharacterType相关

私有方法splitByCharacterType利用字符串中的每个字符的类型进行划分,并返回字符串数组。参数包含一个是否保留camel-class类型,即第一个字符是大写,第二个字符为小写的类型。执行如下操作:
  如果字符串为null,则返回null。
  如果字符串为"",则返回空字符串数组。
  遍历整个字符串,如下操作:
      如果当前字符和下一个字符类型相同,则继续遍历。
      如果类型不相同,如果不需要保留camel-class类型,则直接把当前位置(含)之前的内容生成一个字符串。
      如果需要保留camel-class类型,则把当前位置(不含)之前的内容生成一个字符串(当前的大写字母放到现在这个小写字母序列中)。
  最后把最后一段的字符串输出。

splitByCharacterType方法的参数为被测字符串,利用同名私有方法获取结果,其中布尔参数为假。
splitByCharacterTypeCame lCase方法的参数为被测字符串,利用同名私有方法获取结果,其中布尔参数为真。
================================
join相关
join方法类似于split的反函数,有几种不同参数的同名方法,如下。

参数1为要连接的对象数组,参数2为连接字符,参数3,4为需要连接的对象数组的上限下限值。执行如下操作:
  如果对象数组为null,则返回null。
  如果下限值小于等于上限值,则返回""。
  声明一个StringBuffer,其大小为对象数组成员toString后的长度(如果对象为null,则长度定义为16)加1(连接字符的位置)后乘以对象数组的长度。
  从上限值遍历到下限值,如果不是第一个成员,则向StringBuffer中写入连接字符;否则写入该成员。
  返回StringBuffer的toString方法。

参数1为要连接的对象数组,参数2为连接字符串,参数3,4为需要连接的对象数组的上限下限值。执行如下操作:
  如果对象数组为null,则返回null。
  如果下限值小于等于上限值,则返回""。
  声明一个StringBuffer,其大小为对象数组成员toString后的长度(如果对象为null,则长度定义为16)加连接字符串的长度(连接字符串的位置)后乘以对象数组的长度。
  从上限值遍历到下限值,如果不是第一个成员,则向StringBuffer中写入连接字符串;否则写入该成员。
  返回StringBuffer的toString方法。

参数1为一个迭代器,参数2为连接字符。执行如下操作:
  如果迭代器为null,则返回null。
  如果迭代器的没有下一个数据,则返回""。
  取迭代器中的第一个对象,如果没有其他数据,则直接输出该对象。
  声明一个长度为256的StringBuffer对象。
  如果第一个对象不为空,则写入StringBuffer中。
  通过迭代器遍历,依次写入连接字符和当前对象。
  返回StringBuffer的toString方法。

参数1为一个迭代器,参数2为连接字符串。执行如下操作:
  如果迭代器为null,则返回null。
  如果迭代器的没有下一个数据,则返回""。
  取迭代器中的第一个对象,如果没有其他数据,则直接输出该对象。
  声明一个长度为256的StringBuffer对象。
  如果第一个对象不为空,则写入StringBuffer中。
  通过迭代器遍历,依次写入连接字符串和当前对象。
  返回StringBuffer的toString方法。

除了以上核心方法,还提供了几个同名方法:
参数为Collection对象,利用该对象的iterator方法调用join方法。
参数如果不包含上下限值,则默认为0和对象数组的长度。
参数如果不包含连接字符,则默认为null。
=====================
deleteWhitespace方法去掉字符串中的所有空格。方法是把字符串中所有非空格的内容拷贝到一个数组中,并记录拷贝了多少个字符,最后从数组中输出字符串。

remove相关
removeStart方法删除字符串中位于开头的被删字符串。判断字符串是否以被删字符串开头,如果是真,则取从被删字符串长度之后的子字符串。
removeStartIgnoreCase方法删除字符串中位于开头的被删字符串,不考虑字符的大小写。首先利用startsWithIgnoreCase方法判断是否满足删除条件,如果是,则取从被删字符串长度之后的子字符串。
removeEnd方法删除字符串中位于结尾的被删字符串。判断字符串是否以被删字符串结尾,如果是真,则取0到整个字符串长度减去被删字符串长度的子字符串。
removeEndIgnoreCase方法删除字符串中位于结尾的被删字符串,不考虑字符的大小写。首先利用endsWithIgnoreCase方法判断是否满足删除条件,如果是真,则取0到整个字符串长度减去被删字符串长度的子字符串。
remove方法从字符串中删除字符,把字符串转换成字符数组,遍历该数组,如果当前字符等于要删除的字符,则在数组中屏蔽该字符。
remove方法从字符串中删除字符串,利用replace方法实现。
=======================
replace相关
核心的replace方法提供四个参数,分别是原字符串s,需要替换的字符串p,替换的字符串t和最大替换数量c。执行如下操作:
  如果s,p为空,t为null,c为0,满足任意条件,则返回原字符串。
  用indexOf在s中查找第一个p。如果不存在,则返回原字符串。
  由于p和t可能长度不同,所以要计算字符串中增加的长度。首先计算p和t的差,如果该值小于0,则设为0。如果c小于0,则这个差值乘以16,如果c大于64,则这个差值乘以64。否则,直接乘以c。
  声明一个StringBuffer,直接设定长度为原字符串加差值的大小。
  从原字符串中取p之前的字符串,写入sb,然后再写入一个t。然后把指针指向当前p之后的位置,如果已经到了max的上限,则退出这个过程,否则在原字符串中再查找p,如果能找到,则循环该过程。
  向sb写入最后一部分的字符串。
  返回sb的toString方法。

除了核心方法,提供一个同名方法,只是最大替换数量默认为-1(即不受限制)。
replaceOne方法在调用核心方法时,最大替换数量默认为1(即只替换一个)。

核心的replaceEach方法是在一个字符串中替换一组字符串,但是由于提高效率,采用了全新的算法。该方法提供5个参数,分别是原字符串s,需要替换的字符串数组pp,替换的字符串数组tt,是否重复,执行n次替换等。执行如下操作:
  如果s,pp或tt为空,则返回原字符串。
  如果n小于0,则抛出IllegalStateException异常。如果pp的长度和tt的长度不同,则抛出IllegalArgumentException 异常。
  首先查看一下原字符串中被替换部分是否存在。定义一个布尔数组,存储当前被替换字符串是否在原字符串中。另外定义两个指针,分别表示最早的需要替换的字符串及其位置。遍历pp数组,执行如下操作:
      如果当前被替换字符串为空,或替换的字符串为Null,则继续循环。
      利用indexOf方法查询字符串,如果未找到,则对应的布尔数组中置为真。
      否则,如果当前两个指针中标示位置的指针在当前indexOf的结果之后(即新找到的这个需要被替换的字符串更靠前),则更新两个指针。
  如果两个指针中标示位置的指针为-1(即所有的被替换字符串都没有找到),则返回原字符串。此处应该是递归的终止条件,详见最后的步骤)。
  定义StringBuffer,大小应为原字符串长度加一个扩展变量。该扩展变量通过两步得到,首先遍历所有的被替换字符串,每个tt成员的长度减去pp成员的长度,如果大于0,则该差值乘以3加到扩展变量中(即假设在字符串中会遇到3个该被替换字符串);然后判断该扩展变量和原字符串的1/5哪个小,并把较小值赋予扩展变量。
  定义一个原字符串的指针st,如果两个指针中标示位置的指针不为-1,循环以下操作以执行替换:
      向buf中写入st到标示位置的指针之间的字符。
      写入替换的字符串。
      调整st的位置到插入点之后。
      把从st到原字符串结尾的部分当作原字符串,再次执行抛出异常以后的操作,更新两个指针的位置。
  最后把最后的部分写入buf中。
  至此只完成了一次替换,如果不需要重复,则直接返回buf.toString方法。
  否则,把结果当作原字符串s,再次递归调用该函数,以获得结果,不过n递减1。
   
同名的replaceEach方法对原字符串进行一次的替换工作,其中是否重复设为否,n为0。
replaceEachRepeatedly方法对原字符串进行循环的替换工作。在调用核心方法前,n的值定义为被替换字符串数组的长度。

replaceChars相关
如果替换和被替换的参数直接就是字符,则采用String的对应方法,只是如果原字符串为null,则返回null。
如果替换和被替换的参数是用字符串表示的字符数组,则执行如下操作:
  如果原字符串和被替换字符串有一个为空,则返回原字符串。
  如果替换字符串为null,则返回""。
  定义一个和原字符串相同的StringBuffer。循环遍历每个原字符串的字符,执行如下操作:
      获取当前字符。
      如果当前字符在被替换字符串中,且其位置小于替换字符串的长度(即必须能在替换字符串中找到可替换的那个字符),则在buf中加入对应的替换字符。
      否则在buf中插入当前字符。
  如果原字符串有改动,则用buf.toString方法输出,否则输出原字符串。
=========================
overlay
overlay方法把原字符串中的一部分替换为指定字符串。参数除了原字符串和替换字符串外,还包括替换的起止点。
  原字符串为null,返回null。
  替换字符串为null,则返回""。
  规范起止范围。起止点大于等于0,而小于等于字符串长度。
  如果起止点相反,交换之。
  用一个StringBuffer分别接续0到start,替换字符串,end到最后的三段字符串,并返回buf.toString方法的结果。
 
===============================
chomp相关
chomp方法从原字符串的最后去掉参数中指定的字符串。
如果参数包含这两个字符串,则如果原字符串确实以指定字符串结尾,则返回0到指定字符串之前的内容。其他情况返回原字符串。
如果参数只包含原字符串,则定义为去掉字符串最后的“新行”标志。执行如下操作:
  如果原字符串为空,则返回原字符串。
  如果原字符串只有一个字符,且为\r或\n,则返回"",否则返回原字符串。
  获得原字符串的最后一个字符,如果其为\n,则看后一个是否为\r,如果是则去掉最后两个,如果不是,但是是\r,则去掉最后一个,并返回结果。

chop方法删除最后一个字符,如果是\n,且倒数第二个是\r,则删除2个。
  如果原字符串为nul,则返回null。
  如果原字符串长度小于2,则返回""。
  先substring方法取出删掉最后一个字符的字符串。
  如果满足\r\n结尾,则再多删除一个。
  返回结果。
============================
repeat
repeat方法用于重复原字符串n次后输出。执行如下操作:
  如果原字符串为null,则返回null。
  如果n小于等于0,则返回""。
  如果重复1次或字符串长度为0,则返回原字符串。
  如果字符串长度为1,且重复的次数不超过8192,则利用padding方法返回结果。
  根据字符串长度,分长度为1,2和缺省三种情况。前两种用字符数组,后者用StringBuffer连接字符串。
======================
pad相关
padding方法把一个字符赋值N个以后,形成字符串返回,如果N为负数,则抛出IndexOutOfBoundsExceptio n。否则把字符复制到一个N长度的字符数组中,并返回其字符串形式。

rightPad方法是通过在原字符串右侧补充若干个字符,使总长度达到参数要求的N长度。其执行如下操作:
  如果原字符串为Null,则返回null。
  求N与原字符串的差,如果这个差值小于等于0,则返回原字符串。
  如果这个差值大于8192,则把字符转换成字符串后,使用另外一个rightPad方法(详见下)。
  否则,利用padding方法先复制差值那么多的字符,然后再用原字符串的contact方法连接在一起。

另一个rightPad方法和上面的功能相同,只不过填充的部分不是字符而是字符串。其执行如下操作:
  如果原字符串为Null,则返回null。
  求N与原字符串的差,如果这个差值小于等于0,则返回原字符串。
  如果字符串长度为1且差值小于8192,则用上一个方法继续实现该功能。
  如果差值和字符串长度相等,则直接连接原字符串和填充字符串,返回即可。
  如果差值小于字符串长度,则从字符串的开头取差值那么长的字符串,并连接在原字符串之后返回。
  如果差值大于字符串长度,则声明一个差值长度的字符数组,循环对位的拷入填充字符串的每个字符,直到填满该字符数组,并连接在原字符串之后返回。

还有一个只提供原字符串和N长度的rightPad方法,其利用' '作为填充字符,调用第一个rightPad方法。

leftPad方法和rightPad方法类似,只是填充的部分在原字符串的左侧。其方法构成也相同,只是在连接的时候,总是使用填充字符(串)形成的字符串去连接原字符串。

center相关
center方法也属于pad相关的方法,不同的是其填充字符(串)在原字符串的两侧。其先调用leftPad方法,在其左侧填充整个差值的一半的字符,然后再调用rightPad方法插入后面的字符。
===================
length方法是在string的对应方法前做null的判断,如果是Null,则返回0。
===================
case conversion相关
upperCase方法调用String的同名方法,只是在之前验证字符串是否为null,如果是,返回null。
lowerCase方法调用String的同名方法,只是在之前验证字符串是否为null,如果是,返回null。
capitalize方法实现字符串的首字母大写。如果原字符串为空,则返回原字符串,否则用一个StringBuffer,先利用Character.toTitleCase写入原字符串的第一个字符,再写入原字符串从1开始的字符串,并返回。
uncapitalize方法去掉字符串的首字母大写,原理同上,只是使用Character.toLowerCase方法写入原字符串的第一个字符。
swapCase方法对原字符串进行大小写的转换。如果原字符串为空,则返回原字符串,否则用一个StringBuffer,遍历原字符串,如果遇到大写或首字符,则转换为小写并写入sb,如果遇到小写则转换为大写并写入sb,最后返回sb.toString方法。

==================
countMatches方法计算原字符串中被比较的字符串出现的次数。如果两者都为空,则返回0,否则遍历原字符串,如果用indexOf方法发现一个被比较字符串,则计数器加1,并重新设定指针。最后返回计数器。
==================
Character Test相关
isAlpha方法判断字符串是否只包含字母,如果字符串是null,则返回假。遍历字符串,如果利用Character.isLetter方法判断的每个字符都是真,则返回真(如果字符串为"",则会返回真),否则返回假。
isAlphaSpace方法在上一个方法中进行扩展,如果字符不是字母而是空格,也返回真。
isAlphanumeric方法判断字符串是否为字母和数字的组合,在遍历的时候,使用Character.isLetterOrDigit方法进行判断。
isAlphanumericSpace方法在上一个方法中进行扩展,如果字符不是字母或数字而是空格,也返回真。
isAsciiPrintable方法判断字符串是否为可打印的ASCII码,在遍历的时候,使用CharUtils.isAsciiPrintable方法进行判断。
isNumeric方法判断字符串是否为数字,在遍历的时候,使用Character.isDigit方法进行判断。
isNumericSpace方法在上一个方法中进行扩展,如果字符不是数字而是空格,也返回真。
isWhitespace方法判断字符串是否为空白,注意此处使用Character.isWhitespace方法进行判断,和前面使用''来认定space还是有些不同。
=====================
default相关
defaultString方法提供两种方法,如果只有原字符串,则在原字符串为null时返回"",否则用替换字符串作为原字符串为null时的返回值。
defaultIfEmpty方法是用isEmpty方法检测原字符串,如果为真,则返回替换字符串。
=====================
reverse相关
reverse方法把字符串进行反转操作,如果字符串为null,则返回null。否则,把其装入到一个StringBuffer中,利用sb的reverse来做反转。
reverseDelimited方法是把原字符串进行分割后各自反转,然后在连接起来。首先利用split方法分割成字符串数组,然后利用ArrayUtils的reverse方法进行反转。然后利用join方法进行连接。
=====================
abbreviate相关
abbreviate方法对字符串进行缩减,被省略的部分用...代替。参数包括原字符串,左侧被省略后开始的位移和返回字符串的最大长度。执行如下操作:
  如果原字符串为null,返回Null。
  如果最大长度小于4,则抛出IllegalArgumentException 异常。
  如果原字符串长度小于等于最大长度,则返回原字符串。
  如果位移大于原字符串长度,则位移等于原字符串的长度。
  如果原字符串长度减去位移后小于最大长度减去三个点的长度,则位移等于原字符串长度减去最大长度减去三个点的长度。
  如果位移小于等于4,则直接从原字符串取0到最大值减去3的位置的子字符串,然后加“...”并返回。(左侧不够放三个点)
  如果最大长度小于7,即左右两侧各三个点加最少的一个字符,则抛出IllegalArgumentException 异常。
  如果位移加最大长度减3小于原字符串的长度,则先加一段“...”,然后取出原字符串中位移到最后的子字符串再调用另外一个abbreviate方法。否则,先加一段“...”,然后取原字符串长度减去最大长度减3后的子字符串。

另一个abbreviate方法是位移缺省为0。
========================
difference相关
difference方法比较两个字符串,并返回字符串2中和字符串1不同的部分。执行如下操作:
  如果字符串1为null,则返回字符串2。
  如果字符串2为null,则返回字符串1。
  利用indexOfDifference方法获得不同的位置,如果位置为-1,则返回""。否则返回字符串2的从位置到最后的子字符串。如果字符串1大于字符串2的话,会返回""。

indexOfDifference方法返回两个字符串从哪个位置开始不同。执行如下操作:
  如果字符串1等于字符串2相等,则返回-1。
  如果字符串1或字符串2等于null,则返回0。
  遍历字符串1和字符串2,条件是小于其中较小的长度,如果一旦两个字符串的对应字符不同,则跳出循环。
  如果是中间跳出的,或两个字符串长度不同,则返回当前的位置。
  返回-1。

另外一个indexOfDifference方法返回一组字符串中开始不同的位置。执行如下操作:
  如果字符串数组为null或长度小于等于1,则返回-1。
  定义一组变量,包括两个布尔值,表示所有成员为null,和任意成员为null,缺省值分别为真和假。以及最小字符串长度和最大字符串长度。
  循环遍历数组,如果当前字符串为null,则任意成员为null的布尔值为真,最小字符串长度为0。否则所有成员为null的布尔值为假,最小字符串长度根据当前长度进一步缩小,最大字符串长度根据当前长度进一步放大。
  如果所有字符串为null,或者最长字符串长度为0且有字符串不是null,则返回-1。
  如果最小字符串长度为0,则返回0。
  从字符串数组中的第一个字符串中进行字符遍历,长度为最小字符串长度,如果字符串数组其他字符串中有一个字符和当前字符不符,则记录该位置,并退出遍历。
  如果该位置为-1,且最小字符串长度不等于最大字符串长度,则返回最小字符串长度,即各个字符串中的这个子集都是相同的。
  否则返回该位置。

getCommonPrefix方法取得一组字符串中一样的前缀。执行如下操作:
  如果字符串数组为null或长度为0,则返回""。
  利用indexOfDifference方法获得最小的一个有差别的位置。
  如果这个值等于-1,则如果第一个字符串为null,则返回"",否则返回第一个字符串。
  如果这个值等于0,则返回""。
  否则,返回第一个字符串中从0到当前位置的子字符串。
==========================
getLevenshteinDistance方法是为了计算两个字符串需要完全一致,较短的那个字符串需要修改的字符的数量。这个算法的实现比较复杂,这里就不记录了。
==========================
startWith/endWith相关
startsWith方法确定字符串是否以某前缀作为开始,参数中还包括是否考虑忽略大小写。执行如下操作:
  如果字符串为null,或前缀为null,则看是否都为null,如果一个不是null,则返回假。
  如果前缀的长度大于字符串的长度,则返回假。
  利用String的regionMatches方法获得结果。

另外两个方法只是在忽略大小写上的设置不同。

endWith方法和startWith基本相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值