一:spring框架util包中的StringUtils类主要是处理关于字符串

的功能方法,下面直接结合代码分析:

//判断字符串是否为空,如果为nul或者""则返回true,否则返回false
public static boolean isEmpty(Object str)
{
return str == null || "".equals(str);
}

  

//判断字符串是否有长度,不等于null同时长度大于0,则为true
//这里重载两个hasLength方法,其中CharSequence是String的父类,是接口
public static boolean hasLength(CharSequence str)
{
return str != null && str.length() > 0;
} public static boolean hasLength(String str)
{
return hasLength(((CharSequence) (str)));
}

  

//如果为空则直接返回false,如果字符串中有一个不是空白,则表示
//有内容,返回true
public static boolean hasText(CharSequence str)
{
if(!hasLength(str))
return false;
int strLen = str.length();
//遍历字符序列,如果其中有一个不是空白,则返回true
for(int i = 0; i < strLen; i++)
if(!Character.isWhitespace(str.charAt(i)))
return true; return false;
} public static boolean hasText(String str)
{
return hasText(((CharSequence) (str)));
}

  

//判断字符串是否包含空白,如果为空则直接返回false,,遍历字符序列,如果其中
//有一个字符是空白,则返回true,如果都不是,返回false
public static boolean containsWhitespace(CharSequence str)
{
if(!hasLength(str))
return false;
int strLen = str.length();
for(int i = 0; i < strLen; i++)
if(Character.isWhitespace(str.charAt(i)))
return true; return false;
} public static boolean containsWhitespace(String str)
{
return containsWhitespace(((CharSequence) (str)));
}

  

//去除字符串前后的空白
public static String trimWhitespace(String str)
{
if(!hasLength(str))
return str;
StringBuilder sb;
//去除字符串前导空白
for(sb = new StringBuilder(str); sb.length() > 0 && Character.isWhitespace(sb.charAt(0)); sb.deleteCharAt(0));
//去除字符串后导空白
for(; sb.length() > 0 && Character.isWhitespace(sb.charAt(sb.length() - 1)); sb.deleteCharAt(sb.length() - 1));
return sb.toString();
}

  

//去除字符串所有空白
public static String trimAllWhitespace(String str)
{
if(!hasLength(str))
return str;
StringBuilder sb = new StringBuilder(str);
//从第一个字符开始判断,是否为空白,如果是则删除,如果不是则index加1
//判断第二个,然后一直到sb.length=index,则跳出循环
for(int index = 0; sb.length() > index;)
if(Character.isWhitespace(sb.charAt(index)))
sb.deleteCharAt(index);
else
index++; return sb.toString();
}

  

//去除前导空白,只取空白的前一部分
public static String trimLeadingWhitespace(String str)
{
if(!hasLength(str))
return str;
StringBuilder sb;
//去除前导空白
for(sb = new StringBuilder(str); sb.length() > 0 && Character.isWhitespace(sb.charAt(0)); sb.deleteCharAt(0));
return sb.toString();
}

  

//去除后导空白,取去除空白后一部分
public static String trimTrailingWhitespace(String str)
{
if(!hasLength(str))
return str;
StringBuilder sb;
//去除后导空白
for(sb = new StringBuilder(str); sb.length() > 0 && Character.isWhitespace(sb.charAt(sb.length() - 1)); sb.deleteCharAt(sb.length() - 1));
return sb.toString();
}

  

//删除前导为leadingCharacter的字符
public static String trimLeadingCharacter(String str, char leadingCharacter)
{
if(!hasLength(str))
return str;
StringBuilder sb;
//只要前导是指定字符则删除
for(sb = new StringBuilder(str); sb.length() > 0 && sb.charAt(0) == leadingCharacter; sb.deleteCharAt(0));
return sb.toString();
}

  

//删除后导字符trailingCharacter
public static String trimTrailingCharacter(String str, char trailingCharacter)
{
if(!hasLength(str))
return str;
StringBuilder sb;
//只要后导是指定字符则删除
for(sb = new StringBuilder(str); sb.length() > 0 && sb.charAt(sb.length() - 1) == trailingCharacter; sb.deleteCharAt(sb.length() - 1));
return sb.toString();
}

  

//忽略大小写,判断字符串是否已prefix开始
public static boolean startsWithIgnoreCase(String str, String prefix)
{
//如果源字符串str或者前缀字符串prefix为null,则返回false
if(str == null || prefix == null)
return false;
//如果str以prefix开始,return true
if(str.startsWith(prefix))
return true;
//如果源字符串的长度小于prefix的长度,返回false
if(str.length() < prefix.length())
{
return false;
} else
{
将源字符串prefix长度转换为小写,前缀字符串也转换为小写,比较是否相等
String lcStr = str.substring(0, prefix.length()).toLowerCase();
String lcPrefix = prefix.toLowerCase();
return lcStr.equals(lcPrefix);
}
}

  

//忽略大小写,判断源字符串str是否以suffix结尾,处理逻辑类似上一个方法
public static boolean endsWithIgnoreCase(String str, String suffix)
{
if(str == null || suffix == null)
return false;
if(str.endsWith(suffix))
return true;
if(str.length() < suffix.length())
{
return false;
} else
{
String lcStr = str.substring(str.length() - suffix.length()).toLowerCase();
String lcSuffix = suffix.toLowerCase();
return lcStr.equals(lcSuffix);
}
}

  

源码分析八(org.springframework.util包之StringUtils类))的更多相关文章

  1. 源码分析六(org.springframework.util包之Assert类)

    一:抽象类Assert 抽象类不能够实例化对象,但是可以被继承,Assert类是功能类,所以方法都是static修饰 所以可以直接  类名.方法 调用. public abstract class A ...

  2. ABP源码分析八:Logger集成

    ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...

  3. Vue.js 源码分析(八) 基础篇 依赖注入 provide/inject组合详解

    先来看看官网的介绍: 简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱.这个就是这对选项要干的事情 provide和 ...

  4. dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理

    SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...

  5. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?

    阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...

  6. Heritrix源码分析(八) Heritrix8个处理器(Processor)介绍(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/643367       本博客已迁移到本人独立博客: http://www.yun5u ...

  7. Spring源码分析之——导入spring-framework源代码到Eclipse

    本人最近想要研究spring的源代码,但当要导入spring sub project到Eclipse里面去的时候遇到了不少麻烦(其实都怪自己想当然). 找到spring-framework的gitHu ...

  8. motan源码分析八:涉及到底层的客户端调用

    之前我们分析了客户端调用服务端的源码,但是没有涉及到通讯层和序列化层,本文将之前讲过的内容做一次串联. 1.上层通过动态代理调用refer的call,每个refer又对应一个nettyclient,下 ...

  9. MyBatis框架的使用及源码分析(八) MapperMethod

    从 <MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory> 文中,我们知道Mapper,通过MapperProxy ...

随机推荐

  1. pthread_cond_wait和pthread_cond_signal以及互斥变量的使用情况

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h& ...

  2. redis关闭/重启服务器

    通过docker实现: 一.创建redis服务器与客户端 docker run -p : -d --name redis-server docker.io/redis: redis-server -- ...

  3. [leetcode]Minimum Depth of Binary Tree--二叉树层序遍历的应用

    题目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the ...

  4. android开发(31) 动画演示 - 从页面底部向上弹出dialog,消失时逐渐向下

    我想实现一个效果,从底部向上逐渐弹出.如下图所示: 1.点击 显示 按钮时,一个dialog对话框从底部慢慢向上弹出. 2.关闭dialog时, dialog缓慢的移动向底部消失.很平滑的效果.   ...

  5. elasticsearch6.4 memory locking requested for elasticsearch process but memory is not locked 终极解决

    echo "es hard memlock unlimited">>/etc/security/limits.confecho "es soft memloc ...

  6. oracle分页查询原理浅析

    原因一 oracle默认为每个表生成rowmun,rowid字段,这些字段我们称之为伪列 1 创建测试表 CREATE TABLE TEST( ID NUMBER, NAME VARCHAR2(20) ...

  7. jquery 回车事件实现代码

    // 键盘事件 1.keydown()  keydown事件会在键盘按下时触发. 2.keyup()  keyup事件会在按键释放时触发,也就是你按下键盘起来后的事件 3.keypress()  ke ...

  8. Linux C++ 访问子目录以及里面的文件

    #include <iostream> #include <fstream> #include <string> #include <vector> # ...

  9. c++ 的类 和 类继承, 什么是c++中的基类和派生类?

    闲云潭影日悠悠,物换星移几度秋 你既然已经做出了选择, 又何必去问为什么选择.鬼谷绝学的要义, 从来都不是回答, 而是抉与择 普通类 #ifndef TABTENN0_H_ #define TABTE ...

  10. android设置主mic/副mic录音

    //添加MIC设置参数 /hal/audio_extn/audio_extn.c @@ -75,6 +75,7 @@ struct audio_extn_module { bool ras_enabl ...