从源码分析java.lang.String.isEmpty()

今天在写代码的时候用到了java.lang.String.isEmpty()的这个方法,之前也用过,今天突发奇想,就看了看源码,了解了解它的实现方法,总结出来,大家可以交流交流。

通常情况下,我们使用这个方法的时候是这样的:

"hello wudb".isEmpty();

上面的代码返回的是false,然后我们打开源码分析,isEmpty()这个方法在很多类里面都有,我们今天分析的是String里面的,所以找到java.lang.String这个类,然后去找idEmpty()这个方法

 /**
     * Returns {@code true} if, and only if, {@link #length()} is {@code 0}.
     *
     * @return {@code true} if {@link #length()} is {@code 0}, otherwise
     * {@code false}
     *
     * @since 1.6
     */
    public boolean isEmpty() {
        return value.length == 0;
    }

源码里面已经所得很清楚了,当且仅当字符串的长度为0的时候返回的是true,否则返回的是false这两个布尔类型的值,方法中出现的value是什么呢,继续找

 /** The value is used for character storage. */
    private final char value[];

在String这个类的上方定义了一个char类型的一维数组,由此可以看到String的实现是基于char类型实现的(实际上是Unicode字符序列)。这一点在Stirng的另一个方法length()上面也有体现:

/**
     * Returns the length of this string.
     * The length is equal to the number of <a href="Character.html#unicode">Unicode
     * code units</a> in the string.
     *
     * @return  the length of the sequence of characters represented by this
     *          object.
     */
    public int length() {
        return value.length;
    }

这里的字符串长度也是使用的char数组的长度属性。

所以当字符串为""的时候"".isEmpty返回的是true,当字符串为null时null.isEmpty是会报错的。所以在使用isEmpty这个方法的时候,要先确保字符串时不能为null的。

工作之余看一看源码还是很有帮助的,我看网上就有讨论null、""和isEmpty之间的区别,其实像这样的问题,我们完全可以通过阅读源码来解决。

时间: 2024-10-24 21:52:47

从源码分析java.lang.String.isEmpty()的相关文章

Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder

一直以来,都是看到网上说“ StringBuilder是线程不安全的,但运行效率高:StringBuffer 是线程安全的,但运行效率低”,然后默默记住:一个是线程安全.一个线程不安全,但对内在原因并不了解.这两天终于下定决心看了下源代码,才深刻理解为啥一个线程安全.一个非线程安全. 一名话总结:java.lang.StringBuilder 与 java.lang.StringBuffer 同是继承于 java.lang.AbstractStringBuilder,具体在功能实现大多在 Abs

[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的

Launcher启动类 本文是双亲委派机制的源码分析部分,类加载机制中的双亲委派模型对于jvm的稳定运行是非常重要的 不过源码其实比较简单,接下来简单介绍一下 我们先从启动类说起 有一个Launcher类   sun.misc.Launcher; 仔细看下这简短的几行注释,可以得到有用的信息 ps:直接IDE里面查看反编译的,看不到注释的,可以下载openJDK查看源码,我的这个版本是openjdk-8-src-b132-03_mar_2014 sun.misc.Launcher这个类是系统用于

简单看看jdk7源码之java.lang包01

从今天开始简单开始读一遍jdk的源码,估计这个时间会很长,慢慢啃吧....(首先说一句抱歉,因为很多图都是直接百度扣的,图太多了不能为每一个图附上原版链接,不好意思!) 在网上看了很多的教程,读源码有一定的顺序,按照包的顺序:java.lang包,java.util包,java.util.concurrent包,java.util.concurrent.atomic包,java.lang.reflect包,java.lang.annotation包,java.util.concurrent.lo

java源码(1) -- java.lang.CharSequence

我也不知道看源码有什么用,只是喜欢去看看... java.lang.CharSequence CharSequence是char值的一个可读序列.此接口对许多不同种类的char序列提供统一的只读访问. CharSequence是一个接口,里面有4个方法,分别为: public interface CharSequence{ //功能 : 返回此字符序列的长度 int length(); //功能 : 返回指定索引的char值 char charAt(int index); //功能 : 返回一个

从源码分析java集合【LinkedList】

LinkedList是一个双端链表,他继承了AbstractSequentaiList顺序列表,实现了List,Deque,Cloneable,和Serializable接口.Deque是双端队列的接口,LinkedList有记录头的 first 和 尾的 last,所以我们可以对队列的两端进行操作.它还实现了Cloneable和Serializeble接口,它们分别是实现队列进行拷贝和序列化的接口. LinkedList的节点的结构是: private static class Node<E>

从源码分析java集合【ArrayList】

ArrayList的内部实现其实就是我们熟悉的数组,它继承了AbstractList,实现了List,RandomAccess,Cloneable和Serializable接口. RandomAccess接口是说明实现类是支持快速随机访问的,它的随机访问的性能非常好,通常它的List的实现类: for (int i=0, n=list.size(); i < n; i++) list.get(i); //比下面这个循环更快 for (Iterator i=list.iterator(); i.h

从源码分析java集合【HashMap】

Map如我们所知,存储的是键值对,它的基本单位是实现了Map.Entry<K,V>的Node<K,V>,Node 的属性如下: static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; } 看定义就能知道它的作用了,能够看到它存储了一个指向下一个节点的对象next,由此我们是大概能够想到它的存储方

深入源码分析Java线程池的实现原理

程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对CPU利用的优化手段. 网上有不少介绍如何使用线程池的文章,那我想说点什么呢?我希望通过学习线程池原理,明白所有池化技术的基本设计思路.遇到其他相似问题可以解决. 池化技术 前面提到一个名词--池化技术,那么到底什么是池化技术呢? 池化技术简单点来说,就是提前保存大量的资源,以备不时之需.在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用

java.security.SecureRandom源码分析 java.security.egd=file:/dev/./urandom

SecureRandom在java各种组件中使用广泛,可以可靠的产生随机数.但在大量产生随机数的场景下,性能会较低. 这时可以使用"-Djava.security.egd=file:/dev/./urandom" 加快随机数产生过程. http://blog.51cto.com/leo01/1795447 原文地址:https://www.cnblogs.com/antball/p/9667234.html