皮皮网
皮皮网

【qq自动发消息源码】【通过dll查看源码】【行业概念公式源码】string isempty源码

时间:2024-12-27 15:14:25 来源:ufw源码

1.String源码粗略解读
2.常用的 list.isEmpty() 为何突然报null?
3.StringUtils在commons-lang3和commons-lang中的区别
4.StringUtils中isEmpty 和isBlank的区别

string isempty源码

String源码粗略解读

       深入解析Java中的String类

       String类作为Java中的基础类,几乎每一位开发者都与之紧密接触。了解其源码有助于深入理解类的实现细节。String类为final修饰,确保其不可变性,同时实现了Serializable、qq自动发消息源码Comparable、CharSequence接口。

       String类的核心在于底层实现为char类型的数组,并缓存哈希值,此特性使得其在HashMap等集合框架中表现优异。

       equal(Object)方法超越了基本的“==”比较,旨在验证两个字符串是否完全相同,通过比较长度和字符内容实现。

       hashCode()方法基于字符数组进行计算,采用哈希值与相乘并加权的策略。尽管设计良好,通过dll查看源码仍可能产生冲突,因此需要结合equal()方法进行验证。

       toString()方法调用Object类的同名方法,返回类名加上十六进制哈希值的字符串形式。

       intern()方法提供了一种机制,通过本地方法实现,允许查找或创建常量池中的字符串实例,提升内存效率。行业概念公式源码

       总结,String类提供了丰富的功能,包括但不限于isEmpty(),indexOf(),substring(),concat()等方法。探索其源码能够深化理解,对于提高编程技能大有裨益。闯关的口红 源码

常用的 list.isEmpty() 为何突然报null?

       发现项目中常用方法突然报null,今天就来详细探讨下原因。

       以往使用list集合判断是否为空时,通常会通过list.isEmpty()方法来判断返回值是否为true,以此继续执行业务流程。然而,近期这个方法突然报出null错误,这是微赞的源码怎么回事呢?

       业务场景模拟:

       创建一个父类,并在其中定义子类的list,main方法中给父类id赋值,但list未赋值。之后,尝试使用father.getSonList()方法时,遇到了空异常问题。而使用CollectionUtils进行判断时,则未出现此错误。

       下面看一段代码示例:

       原因分析:

       深入探究源码后发现,CollectionUtils里确实也包含了isEmpty的判断。那么,为何它没有报出错误呢?

       其实,我们知道&&和||都是短路操作符。&&要求两个条件都为真时,才会返回真值,一旦第一个条件为假,则后续条件不再执行,直接返回假值。而||只要第一个条件为真,就不再执行后续条件,直接返回真值。

       因此,问题原因在于:CollectionUtils在先判断是否为null的同时,使用了短路模式,并通过||操作符确保了即使list为空,也能够提前返回真值,避免了空异常的发生。这样一来,业务流程得以正常进行,避免了null错误的产生。

StringUtils在commons-lang3和commons-lang中的区别

        (1)入参类型不同

        commons.lang中入参为 Sring str

        commons.lang3中入参为 CharSequence cs(适用范围更广)

        (2)入参数量不同

        commons.lang3中支持多入参

        最近经常需要对String做一些判断和处理,于是就用到了Apache提供的StringUtils这个工具类,用的时候发现有两个不同的版本,一个版本位于org.apache.commons.lang下面,另一个则位于org.apache.commons.lang3下面。

        查了一下资料,lang3是Apache Commons 团队发布的工具包,要求jdk版本在1.5以上,相对于lang来说完全支持java5的特性,废除了一些旧的API。该版本无法兼容旧有版本,于是为了避免冲突改名为lang3。这些东西就不再细说了,我们来看看StringUtils中常用的一些方法有什么改变吧。

        可以看到这几个方法逻辑毫无变化,只是参数类型变了,由String变为CharSequence。那么这个CharSequence是什么呢?我们看看它的源码:

        CharSequence是一个字符序列的接口,其中定义了一些常用的如length()、subSequence()等方法,String也实现了这个接口。当然大家可能在String里用到的都是subString(),实际上String也实现了subSequence()这个方法,只是直接指向了subString()。

        lang3中使用CharSequence最大的好处就是令这些方法用处更加广泛,不止局限于String,其他一些实现了该接口的类也可以使用StringUtils中的这些方法去进行一些操作。另外我发现很多nio中的类都实现了这个接口,个人猜测可能也有为nio服务的目的。

        在lang中,第一步是先判断str1是否为空,而在lang3中,第一步则是先判断两个对象是否相同。这个不难理解,如果两个对象的地址相同,那么它们指向的就是同一个对象,内容肯定相同。

        在lang3中,还加入了一些同时判断多个参数的方法,可以看到实际上是将参数列表放入一个CharSequence数组中,然后遍历调用之前的isEmpty等方法。判断blank也有类似的方法。

        可能有人会觉得,很多方法String本身就有啊,为什么还要用StringUtils提供的呢?抛开参数类型不谈,我们可以看到,StringUtils中的方法大多都做了空校验,如果为空时会返回Null或者空串,而String本身的方法在很多传入参数或对象本身为空的时候都会报空指针错误。

        参考地址: StringUtils在commons-lang3和commons-lang中的区别

StringUtils中isEmpty 和isBlank的区别

       ã€€ã€€StringUtils在commons-lang-2.2.jar包中:org.apache.commons.lang.StringUtils ;

       ã€€ã€€

       ã€€ã€€StringUtils方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理,例如,如果输入为null则返回也是null等,具体可以查看源代码)。

       ã€€ã€€

       ã€€ã€€é™¤äº†æž„造器,StringUtils中一共有多个方法,并且都是static的,所以我们可以这样调用StringUtils.xxx()

       ã€€ã€€1. public static boolean isEmpty(String str)

       ã€€ã€€åˆ¤æ–­æŸå­—符串是否为空,为空的标准是str==null或str.length()==0

       ã€€ã€€ä¸‹é¢æ˜¯StringUtils判断是否为空的示例:

       ã€€ã€€StringUtils.isEmpty(null) = true

       ã€€ã€€StringUtils.isEmpty("") = true

       ã€€ã€€StringUtils.isEmpty(" ") = false //注意在StringUtils中空格作非空处理

       ã€€ã€€StringUtils.isEmpty(" ") = false

       ã€€ã€€StringUtils.isEmpty("bob") = false

       ã€€ã€€StringUtils.isEmpty(" bob ") = false

       ã€€ã€€2. public static boolean isNotEmpty(String str)

       ã€€ã€€åˆ¤æ–­æŸå­—符串是否非空,等于!isEmpty(String str)

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹ï¼š

       ã€€ã€€StringUtils.isNotEmpty(null) = false

       ã€€ã€€StringUtils.isNotEmpty("") = false

       ã€€ã€€StringUtils.isNotEmpty(" ") = true

       ã€€ã€€StringUtils.isNotEmpty(" ") = true

       ã€€ã€€StringUtils.isNotEmpty("bob") = true

       ã€€ã€€StringUtils.isNotEmpty(" bob ") = true

       ã€€ã€€3. public static boolean isBlank(String str)

       ã€€ã€€åˆ¤æ–­æŸå­—符串是否为空或长度为0或由空白符(whitespace)构成

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹ï¼š

       ã€€ã€€StringUtils.isBlank(null) = true

       ã€€ã€€StringUtils.isBlank("") = true

       ã€€ã€€StringUtils.isBlank(" ") = true

       ã€€ã€€StringUtils.isBlank(" ") = true

       ã€€ã€€StringUtils.isBlank("\t \n \f \r") = true //对于制表符、换行符、换页符和回车符StringUtils.isBlank()均识为空白符

       ã€€ã€€StringUtils.isBlank("\b") = false //"\b"为单词边界符

       ã€€ã€€StringUtils.isBlank("bob") = false

       ã€€ã€€StringUtils.isBlank(" bob ") = false

       ã€€ã€€4. public static boolean isNotBlank(String str)

       ã€€ã€€åˆ¤æ–­æŸå­—符串是否不为空且长度不为0且不由空白符(whitespace)构成,等于!isBlank(String str)

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹ï¼š

       ã€€ã€€StringUtils.isNotBlank(null) = false

       ã€€ã€€StringUtils.isNotBlank("") = false

       ã€€ã€€StringUtils.isNotBlank(" ") = false

       ã€€ã€€StringUtils.isNotBlank(" ") = false

       ã€€ã€€StringUtils.isNotBlank("\t \n \f \r") = false

       ã€€ã€€StringUtils.isNotBlank("\b") = true

       ã€€ã€€StringUtils.isNotBlank("bob") = true

       ã€€ã€€StringUtils.isNotBlank(" bob ") = true

       ã€€ã€€å…¶ä»–方法介绍:

       ã€€ã€€5. public static String trim(String str)

       ã€€ã€€åŽ»æŽ‰å­—符串两端的控制符(control characters, char <= ),如果输入为null则返回null

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹ï¼š

       ã€€ã€€StringUtils.trim(null) = null

       ã€€ã€€StringUtils.trim("") = ""

       ã€€ã€€StringUtils.trim(" ") = ""

       ã€€ã€€StringUtils.trim(" \b \t \n \f \r ") = ""

       ã€€ã€€StringUtils.trim(" \n\tss \b") = "ss"

       ã€€ã€€StringUtils.trim(" d d dd ") = "d d dd"

       ã€€ã€€StringUtils.trim("dd ") = "dd"

       ã€€ã€€StringUtils.trim(" dd ") = "dd"

       ã€€ã€€6. public static String trimToNull(String str)

       ã€€ã€€åŽ»æŽ‰å­—符串两端的控制符(control characters, char <= ),如果变为null或"",则返回null

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹ï¼š

       ã€€ã€€StringUtils.trimToNull(null) = null

       ã€€ã€€StringUtils.trimToNull("") = null

       ã€€ã€€StringUtils.trimToNull(" ") = null

       ã€€ã€€StringUtils.trimToNull(" \b \t \n \f \r ") = null

       ã€€ã€€StringUtils.trimToNull(" \n\tss \b") = "ss"

       ã€€ã€€StringUtils.trimToNull(" d d dd ") = "d d dd"

       ã€€ã€€StringUtils.trimToNull("dd ") = "dd"

       ã€€ã€€StringUtils.trimToNull(" dd ") = "dd"

       ã€€ã€€7. public static String trimToEmpty(String str)

       ã€€ã€€åŽ»æŽ‰å­—符串两端的控制符(control characters, char <= ),如果变为null或"",则返回""

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹ï¼š

       ã€€ã€€StringUtils.trimToEmpty(null) = ""

       ã€€ã€€StringUtils.trimToEmpty("") = ""

       ã€€ã€€StringUtils.trimToEmpty(" ") = ""

       ã€€ã€€StringUtils.trimToEmpty(" \b \t \n \f \r ") = ""

       ã€€ã€€StringUtils.trimToEmpty(" \n\tss \b") = "ss"

       ã€€ã€€StringUtils.trimToEmpty(" d d dd ") = "d d dd"

       ã€€ã€€StringUtils.trimToEmpty("dd ") = "dd"

       ã€€ã€€StringUtils.trimToEmpty(" dd ") = "dd"

       ã€€ã€€8. public static String strip(String str)

       ã€€ã€€åŽ»æŽ‰å­—符串两端的空白符(whitespace),如果输入为null则返回null

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹(注意和trim()的区别):

       ã€€ã€€StringUtils.strip(null) = null

       ã€€ã€€StringUtils.strip("") = ""

       ã€€ã€€StringUtils.strip(" ") = ""

       ã€€ã€€StringUtils.strip(" \b \t \n \f \r ") = "\b"

       ã€€ã€€StringUtils.strip(" \n\tss \b") = "ss \b"

       ã€€ã€€StringUtils.strip(" d d dd ") = "d d dd"

       ã€€ã€€StringUtils.strip("dd ") = "dd"

       ã€€ã€€StringUtils.strip(" dd ") = "dd"

       ã€€ã€€9. public static String stripToNull(String str)

       ã€€ã€€åŽ»æŽ‰å­—符串两端的空白符(whitespace),如果变为null或"",则返回null

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹(注意和trimToNull()的区别):

       ã€€ã€€StringUtils.stripToNull(null) = null

       ã€€ã€€StringUtils.stripToNull("") = null

       ã€€ã€€StringUtils.stripToNull(" ") = null

       ã€€ã€€StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"

       ã€€ã€€StringUtils.stripToNull(" \n\tss \b") = "ss \b"

       ã€€ã€€StringUtils.stripToNull(" d d dd ") = "d d dd"

       ã€€ã€€StringUtils.stripToNull("dd ") = "dd"

       ã€€ã€€StringUtils.stripToNull(" dd ") = "dd"

       ã€€ã€€. public static String stripToEmpty(String str)

       ã€€ã€€åŽ»æŽ‰å­—符串两端的空白符(whitespace),如果变为null或"",则返回""

       ã€€ã€€ä¸‹é¢æ˜¯ç¤ºä¾‹(注意和trimToEmpty()的区别):

       ã€€ã€€StringUtils.stripToNull(null) = ""

       ã€€ã€€StringUtils.stripToNull("") = ""

       ã€€ã€€StringUtils.stripToNull(" ") = ""

       ã€€ã€€StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"

       ã€€ã€€StringUtils.stripToNull(" \n\tss \b") = "ss \b"

       ã€€ã€€StringUtils.stripToNull(" d d dd ") = "d d dd"

       ã€€ã€€StringUtils.stripToNull("dd ") = "dd"

       ã€€ã€€StringUtils.stripToNull(" dd ") = "dd"

更多内容请点击【百科】专栏