Object类

任何类都是继承object类。Object类提供equals方法,源码如下:

public boolean equals(Object obj) {

return (this ==obj);

}

实际上就是判断两个比较的是不是指向同一个内存空间。

String s1 = new String(“kvill”),String s2

= new String(“kvill”); s1.equals(s2)为ture,说明String类中已经重写了equals()方法,如果不重写equals()方法,那么s1.equals(s2)默认比较两个对象所指向的内存地址是否相同,返回值必然为false。

重写hashcode效率高,理论的说法它的复杂度只有O(1)。试想我们把元素放在线性表里面,每次要找一个元素必须从头一个一个的找它的复杂度有O(n)。如果放在平衡二叉树,复杂度也有O(log n)。

如果class永远不可能放在hash code为基础的容器内,不必override hashCode()。显然这种设置不合理。

哈希算法散列算法,把数据依据特定的算法指定到特定的地址上,当java集合要增加新的元素与,先用hashcode定位到物理位置。当2个元素hashCode一样但是equals为false的时候,那个HashMap里面的数组的这个元素就变成了链表。也就是hash code一样的元素在一个链表里面,链表的头在那个数组里面。

源码:

String类中的equals()方法:

public boolean equals(Object anObject)

{

//如果是同一个对象

if (this == anObject)

{

return true;

}

//如果传递进来的参数是String类的实例

if (anObject instanceof String)

{

String anotherString = (String)anObject;

int n = count;//字符串长度

if (n == anotherString.count) //如果长度相等就进行比较

{

char v1[] = value;//取每一个位置的字符

char v2[] =anotherString.value;

int i = offset;

int j = anotherString.offset;

while (n-- != 0) //对于每一位置逐一比较

{

if (v1[i++] != v2[j++])

return false;

}

return true;

}

}

return false;

}

对于object类的equals()方法,判断调用该方法的对象与要比较的对象是不是同一个对象(判断地址),而String类中的equals()方法,则判断当前字符串与传递进来的字符串的内容是否一致。

object类中的equals()方法:

public boolean equals(Object obj)

{

//调用equal的对象的地址和参数对象的地址是否相等

return (this == obj);

}

另外,对于java中的其他类,如果没有重写object类中的equals()方法,我们就可以认为调用该类的equals()方法就是判断这两个类是不是同一个类。只要是使用new类名(),这种形式生成的类(除单例外),我们都可以认为是不同的类(地址不同)。

1Object的toString()方法:

Object提供的toString方法是打印类名,@,hashCode。例如PhoneNum@19dn91

约定建议所有的子类覆盖以便提供更加舒适的方式。所有值得关注的信息。

当对象被传递给打印,关联操作符+,assert,调试器,该方法自动被调用。


2Object的hashCode()方法:

覆盖equals方法时总要覆盖hashCode方法,如果不这样做就会违背约定,所有与hash的操作都不正常,这样的集合包括hashSet,hashMap,hashtable。如果equals方法相等,那么hashCode一定相等,有些截然不同的实例在逻辑上是相等的。

在实际使用中,hashmap有一项优化,如果散列码不同,不必去检查equals方法。

理想状态上,散列函数应该把集合不集中的实例均匀分配到所有可能的散列上。如果每个对象被分配到同一个散列上,散列表退化为链表。

在散列码的计算中,注意排除冗余(即一个值可以由其他参与计算的值产生),不要试图去排除一个对象的关键部分来提高效率。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值