提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
Object类是所有类的祖先,一切类默认继承object
- package 接口;
- //object类
- class ePerson{
- public String name="hello";
-
- @Override
- public String toString() {
- return "ePerson{" +
- "name='" + name + '\'' +
- '}';
- }
- }
- class eStudent{
-
- }
- public class Text5 {
- public static void func(Object o){
- System.out.println(o.toString());
- }
- public static void main(String[] args) {
- // Object o=new Object();
- ePerson e=new ePerson();
- // func(o);
- func(e);
- }
-
- }
如果不重写tostring输出:java.lang.Object@776ec8df,这是object默认的tostring方法
重写输出:ePerson{name='hello'},这是自己实现的tostring方法(方法重写)
ePerson类:
- class ePerson{
- public String id;
-
- public ePerson(String id) {
- this.id = id;
- }
-
- @Override
- public String toString() {
- return "ePerson{" +
- "id='" + id + '\'' +
- '}';
- }
- }
直接==比较:
- public static void main(String[] args) {
- ePerson person1=new ePerson("123");
- ePerson person2=new ePerson("123");
- System.out.println(person1 == person2);
- }
这时输出false,为啥不是true呢,对象不同(地址不同)person1,person引用的地址不同
这时我们如果直接调用object类中equals呢?
如果直接调用object类中equals发现:
还是比较地址类似于==
1.在eperson类重写equals方法
- @Override
- public boolean equals(Object o) {
- ePerson tmp=(ePerson) o;
- return this.id.equals(tmp.id);
- }
注意,id是string类型,string也重写了equals方法,返回的equals是string写好的equals来比较内容相同
2.在test中调用equals
System.out.println(person1.equals(person2));
此时返回true
此时自己实现的还有缺陷(忽略了特殊情况),这个比较完整:
- @Override
- public boolean equals(Object o) {
- if(o==null){
- return false;
- }
- else if(this==o){
- return true;
- }
- else if(!(o instanceof ePerson){
- return false;
- }
- ePerson tmp=(ePerson) o;
- return this.id.equals(tmp.id);
- }
解释一下:
object类equals是判断对象内容是否相同
一般自定义的类型都得重写equals方法,来判断内容相同
如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
底层比较复杂c++实现,将这个地址以16进制输出。
- ePerson person1=new ePerson("123");
- ePerson person2=new ePerson("123");
- //将来我也想把他们放到同一个位置
- person1.hashCode();
- person2.hashCode();
此时俩个对象输出的地址是不一样的
- @Override
- public int hashCode() {
- return Objects.hash(id);
- }
注意这里调用的是Objects类的hash算法
当我们自己定义对象时建议都重写equals和hashcode方法,来满足需求