Java------对象合理判空写法,以及String.equals合理写法以及一些String思考

org.springframework.util包下的StringUtils.isEmpty()方法对对象判空特别合适。

public static boolean isEmpty(Object str) {
        return str == null || "".equals(str);
    }

大神们的源码更加合理高效。

在对一些字符串值进行判断时,常用equals方法

        String s = "800";
        String a = null;


        System.out.println("800".equals(s));   //ture
        System.out.println(s.equals("800"));   //true
        System.out.println("800".equals(a));   //false  重要:合理写法
        System.out.println(a.equals("800"));   // 空指针异常

由此可见,在进行字符串判断时,并不需要,在值判断之前,再对字符串是否为空进行判断,只需要将以常量进行判断,也就是说以常量调用equals方法。字符串是否匹配常量值,而不是常量值是否匹配字符串。

既然这样就再看一下String.equals方法的源码

public boolean equals(Object anObject) {  //返回的是boolean值,传入的是object类型对象
        if (this == anObject) { //首先比较两个对象的内存地址是否一致。
        //this是一个对象中隐藏的引用变量,它保存了当前对象的内存地址,指向自身
        //this只能使用在实例方法中。谁调用这个实例方法,this就是谁。
        //this存储在堆内存当中对象的内部。
            return true;  
        }
        if (anObject instanceof String) {  //如果当前对象属于String类型
            String anotherString = (String)anObject;  //强转
            int n = value.length;   //value String类中的final字符串数组
            						//private final char value[];
            						//当前对象的数组化长度
            if (n == anotherString.value.length) { //循环比较
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

这里又涉及到value的赋值操作,再看一下源码是如何赋值value

    public String(String original) {  //String的构造方法
        this.value = original.value;  //将目标值的value赋值给String的私有字节数组属性value
        this.hash = original.hash;
    }
//由此可见 String.value;会返回一个字节数组

但是在平常使用时,并没有.value。这里其实传入的就是一个String类型的字符串。
在这里插入图片描述

但是这里有一个疑问,String在初始化时,传入的就是一个String对象,这不就意味着一直是循环嵌套?没有结束?是和自动装箱,八大基本对象和封装类有关吗?但是基本类型中字符类型对应的是char,封装类也是Char,并不是String。这里希望有大神能够回答下疑问。

尽管在IDEA中这种写法没有报错,但编译并不能通过,是因为value属性在String中并没有对应的get,set方法。并且属于私有化属性。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,String.equals()方法用于比较两个字符串是否相等。它是一个实例方法,可以通过字符串对象调用。该方法接受一个参数,用于与调用该方法的字符串进行比较。如果两个字符串相等,返回true;否则返回false。 例如,如果我们有两个字符串对象str1和str2,我们可以使用str1.equals(str2)来比较它们是否相等。 引用\[1\]中提到了Java中的可变长度参数列表的写法,即String... args。这种写法表示该方法接受0到多个String类型的参数。所以,如果我们想要比较多个字符串是否相等,可以使用可变长度参数列表来简化代码。 例如,我们可以定义一个方法来比较多个字符串是否相等: ```java public static boolean compareStrings(String... strings) { if (strings.length <= 1) { return true; } String firstString = strings\[0\]; for (int i = 1; i < strings.length; i++) { if (!firstString.equals(strings\[i\])) { return false; } } return true; } ``` 在上面的例子中,我们使用了可变长度参数列表来接受多个字符串参数。然后,我们使用String.equals()方法来比较每个字符串与第一个字符串是否相等。如果有任何一个字符串与第一个字符串不相等,返回false;否则返回true。 所以,如果你想要比较多个字符串是否相等,你可以使用类似上面的方法来实现。 #### 引用[.reference_title] - *1* *2* *3* [Java方法中参数String...你需要知道的事](https://blog.csdn.net/weixin_41634693/article/details/123223878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值