起因

今年4月找工作的时候,面试官给了我一支笔,叫我写一下String的equals方法,刚拿到笔的时候,我还觉得挺简单的,开始动笔之后,不会写,贼尴尬。

当时我写的思路

其实对于equals怎么写,那时候我还是有思路的,我先在纸上写下了euqals的特性

  1. 自反性:x.equals(x) == true
  2. 对称性: x.equals(y) == y.equals(x)
  3. 传递性:x.equals(y) == y.equals(z) == true 那么 x.equals(z) == true
  4. 一致性:x.equals(y) == x.equals(y)

之后我也写了实现的步骤

  1. 判断引用是否是同一个对象
  2. 判断传入是否为null
  3. 判断传入是否是同一个类型
  4. 对象转化
  5. 对需要对比的域进行对比
@Override
    public boolean equals(Object o) {
        // 引用是否同一个
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        String string = (String) o;
    }

这是我面试的时候,写的代码,只写到了类型转化之后。转完之后我就蒙了,string的内部实现是什么?string是用什么保存字符串的?这些我都没有印象。后面面试官提醒我是用char数组存储的字符串。知道之后我还是没能写出来,我不知道一个String对象要如何才能获取到char数组。

String内部实现

image.png
image.png
回来后看了String的源码,String内部使用char数组存储字符串,内部比较的时候,使用对象.value直接获取char数组。

总结

第一:我不知道String的内部实现
第二:本质是,开发过程一直使用的Lombok,从来没写过equals方法。在加上,面向对象编程,形成了固有思维,觉得获取一个对象的属性,必须使用get方法,修改属性必须使用set方法。没有考虑到,equals方法在对象内部,尽管属性使用的是private修饰,照样可以使用对象.value方法直接获取。


幻想的绝望
1 声望0 粉丝

在绝望中追寻