一 double和Double的区别

说一下日常使用中的主要区别吧

double是基本数据类型 Double是double的包装类型

double没有方法,Double有自己的属性和方法

double创建引用 Double创建对象

二 具体案例 

java Double判断是否为null java如何判断double不为空_java

 前端传过来的值中没有restaurantUsage,具体如图下

java Double判断是否为null java如何判断double不为空_包装类_02

java Double判断是否为null java如何判断double不为空_创建对象_03

 

 三 主要犯错点

刚刚说了嘛,Double是创建对象,值没有就为null,后面的自己一开始写的0,而不是2.0,结果爆出Integer类型无法转换为Double类型,这也是个教学吧,后面0.0也是一样的

四 集合判断不为空

我们常用的一般是这样判断的

java Double判断是否为null java如何判断double不为空_创建对象_04

当我敲下这行代码时,我好像记得我有看过一篇文章有个封装的方法可以更加简便的解决这个问题

java Double判断是否为null java如何判断double不为空_创建对象_05

 

 五 总结

这个问题到这里基本上就结束了,关于基本数据类型和包装数据类型有兴趣的可以看一下我的其它文章,这里用到包装类型的缘故是对象默认为null,用double接收不到好像会爆错,

然后时间还有再给大家分享一个今天看到的一个方法吧

六 额外分享

java Double判断是否为null java如何判断double不为空_创建对象_06

 这个是hutool工具包的一个方法,第三个参数是忽略大小写比较,跟踪进去看一下

第一个if可以这样看

StrUtil.equals(null,"2");//false
StrUtil.equals(null,null);//true

第二个if

StrUtil.equals("1",null);//false
StrUtil.equals(" ",null);//false

第三个判断

三目运算符嘛 ,当不忽略大小写进行比较时看后面哪个contentEquals比较

将此字符串与指定的 CharSequence 进行比较。
当且仅当此 String 表示与指定序列相同的 char 值序列时,结果才为真。
请注意,如果 CharSequence 是 StringBuffer,则该方法会在其上同步
    /**
     * Compares this string to the specified {@code CharSequence}.  The
     * result is {@code true} if and only if this {@code String} represents the
     * same sequence of char values as the specified sequence. Note that if the
     * {@code CharSequence} is a {@code StringBuffer} then the method
     * synchronizes on it.
     *
     * @param  cs
     *         The sequence to compare this {@code String} against
     *
     * @return  {@code true} if this {@code String} represents the same
     *          sequence of char values as the specified sequence, {@code
     *          false} otherwise
     *
     * @since  1.5
     */
    public boolean contentEquals(CharSequence cs) {
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
//判断类型,
            if (cs instanceof StringBuffer) {
                synchronized(cs) {
                   return nonSyncContentEquals((AbstractStringBuilder)cs);
                }
            } else {
                return nonSyncContentEquals((AbstractStringBuilder)cs);
            }
        }
        // Argument is a String
        if (cs instanceof String) {
//String类型直接比较,用equals
            return equals(cs);
        }
        // Argument is a generic CharSequence
//上面都不是那种类型,就采用通用比较方式,一个一个的比较字符
        char v1[] = value;
        int n = v1.length;
        if (n != cs.length()) {
            return false;
        }
        for (int i = 0; i < n; i++) {
            if (v1[i] != cs.charAt(i)) {
                return false;
            }
        }
        return true;
    }

看到stringBuffer,就讲一下吧

实际上,StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高

而他们又都继承AbstractStringBuilder这个类

接着看下面这个方法

private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
        char v1[] = value;
        char v2[] = sb.getValue();
        int n = v1.length;
        if (n != sb.length()) {
            return false;
        }
        for (int i = 0; i < n; i++) {
            if (v1[i] != v2[i]) {
                return false;
            }
        }
        return true;
    }

这里是因为类型不同,所以取值就有点不同,比较方式大同小异