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方法。并且属于私有化属性。
在这里插入图片描述

おすすめ

転載: blog.csdn.net/cz_chen_zhuo/article/details/116200322