基本功
java 9种基本类型 boolean char byte short int long float double void
java泛型 java的泛型是伪泛型,java在编译期间,所有的泛型信息都会被擦掉,这就是通常所说的类型擦除。泛型一般有三种使用方式:泛型类,泛型接口,泛型方法
==和equasl的区别
== : 它的作用是判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型比较的是内存地址)因为java只有值传递,所以,对于==来说,不管是比较基本类型数据,还是引用类型数据类型变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址
equas():它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量,equals()方法存在于object类中,而Object类是所有类的直接或间接父类
equals()方法存在两种使用情况:
情况1:类没有覆盖equals()方法,比较该类的两个对象时,等价于通过”==”比较这两个对象,使用的默认是Object类equals()方法
情况2:类覆盖了equals()方法,一般,我们覆盖equals()方法来比较两个对象的内容相等;若他们内容相等,则返回true(即,认为这两个对象相等)说明:
String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而string的equals方法是比较对象的值
当创建string类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建值相等的对象。如果有就把它赋值给当前引用,如果没有就在常量池中重新创建一个String对象
String
类equals()
方法:public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; 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; }
hashCode()和equals()
- hashcode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中的索引位置,hashcode() 定义在jdk的object类中,这就意味着java中的任何类都含有hashCode()函数。另外需要注意的是:Object的hashcode方法是本地方法,也就是用c语言或者c++实现的,该方法通常用来将对象的内存地址转化为整数之后返回。
public native int hashCode();
散列表存储的(key-value),它的特点是:能根据“键”快速检索出对应的值,这其中就列用到 了散列码
为什么要重写equals时必须重写hashcode方法
如果两个对象相等,则hashcode一定意识相同的。两个对象相等,对两个对象分别调用equeas方法都返回true,但是,两个对象有相同的hashcode值。它们也不一定相等的,因此,equasl方法被覆盖过,则hashCode方法也必须被覆盖
hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
为什么两个对象有相同的hashcode的值,它们也不一定是相等的?
因为hashCode()所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值,越糟糕的杂凑算法越容易碰撞,但这也与数值域分布的特性有关,(所谓碰撞也就是不同的对象得到相同的hashCode)
如果hashSet在对比的时候,同样的hashCode有多个对象,它会使用equals()来判断是否真的相同,也就是瘦hashcode只是用来缩小成本。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 ggchzzz@163.com