源码分析八(org.springframework.util包之StringUtils类))
一: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类))的更多相关文章
- 源码分析六(org.springframework.util包之Assert类)
一:抽象类Assert 抽象类不能够实例化对象,但是可以被继承,Assert类是功能类,所以方法都是static修饰 所以可以直接 类名.方法 调用. public abstract class A ...
- ABP源码分析八:Logger集成
ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...
- Vue.js 源码分析(八) 基础篇 依赖注入 provide/inject组合详解
先来看看官网的介绍: 简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱.这个就是这对选项要干的事情 provide和 ...
- dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理
SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...
- Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...
- Heritrix源码分析(八) Heritrix8个处理器(Processor)介绍(转)
本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/643367 本博客已迁移到本人独立博客: http://www.yun5u ...
- Spring源码分析之——导入spring-framework源代码到Eclipse
本人最近想要研究spring的源代码,但当要导入spring sub project到Eclipse里面去的时候遇到了不少麻烦(其实都怪自己想当然). 找到spring-framework的gitHu ...
- motan源码分析八:涉及到底层的客户端调用
之前我们分析了客户端调用服务端的源码,但是没有涉及到通讯层和序列化层,本文将之前讲过的内容做一次串联. 1.上层通过动态代理调用refer的call,每个refer又对应一个nettyclient,下 ...
- MyBatis框架的使用及源码分析(八) MapperMethod
从 <MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory> 文中,我们知道Mapper,通过MapperProxy ...
随机推荐
- 【微信小程序】数据与界面UI不同步,不能直接操作Page.data
问题:数据层与UI不同步 微信小程序也采用UI绑定数据源的形式,根据以前做WPF的经验,直觉上认为修改了数据层(Page.data)后,UI会自动更新,然而实验发现数据层修改后UI层未修改,导致数据层 ...
- 【jquery】图片前后对比效果——beforeAfter
今天分享一款 jquery 插件——图片前后对比(beforeAfter),效果如下: 使用方法: <!DOCTYPE HTML> <html lang="en" ...
- jquery 发get post请求
https://www.cnblogs.com/summers/p/3225375.html POST 方法不会缓存数据 $.get(URL,callback); 2个参数 callback 参数是请 ...
- Sword redis C语言接口介绍
hiredis安装 hiredis是redis官方推荐的基于C接口的客户端组件,它提供接口,供c语言调用以操作数据库. 在redis的源码包的deps/hiredis下就有它的源码 安装方法,进入de ...
- 【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel
http://blog.csdn.net/wirelessqa/article/details/8581652 android:sharedUserId 当APK安装的时候,userid这个标志就会产 ...
- 3D引擎Axiom的选择与学习.
经过前面针对OpenGL的一些特性的学习,越发觉得要学的更多,相关如LOD,各种阴影实现,场景管理如BSP与Octree等以及还没听过的各种的实现.有感自学的进度太慢,并且在做一些小DEMO时,心中不 ...
- Maven依赖机制
案例分析 让我们看一个案例研究,以了解它是如何工作的.假设你想使用 Log4j 作为项目的日志.这里你要做什么? 1.在传统方式 访问 http://logging.apache.org/log4j/ ...
- 深入理解Java对象序列化
关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...
- 嵌入式开发之zynq——zynq开发环境搭建
http://blog.csdn.net/shushm/article/details/51728690 http://www.cnblogs.com/fpga/p/4593602.html http ...
- Java获取正在执行的函数名
利用StackTrace堆栈轨迹获取某个时间的调用堆栈状态. package com.dsp.demo; public class TechDemo { public static void main ...