网站建设准备资料表格,pyhton可以做网站吗,网站的分辨率是多少,公众号开发者密码重置文章目录1. 和 equals 的区别是什么#xff1f;2.Hashcode的作用3. 两个对象的hashCode() 相同#xff0c; 那么equals()也一定为 true吗#xff1f;4.泛型常用特点5.使用泛型的好处#xff1f;1. 和 equals 的区别是什么#xff1f;
“”
对于基本类型和引用类型 的作…
文章目录1. 和 equals 的区别是什么2.Hashcode的作用3. 两个对象的hashCode() 相同 那么equals()也一定为 true吗4.泛型常用特点5.使用泛型的好处1. 和 equals 的区别是什么
“”
对于基本类型和引用类型 的作用效果是不同的如下所示
基本类型比较的是值是否相同
引用类型比较的是引用是否相同
String x string;
String y string;
String z new String(string);
System.out.println(xy); // true
System.out.println(xz); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true因为 x 和 y 指向的是同一个引用所以 也是 true而 new String()方法则重写开辟了内存空间所以 结果为 false而 equals 比较的一直是值所以结果都为 true。 “equals”
equals 本质上就是 只不过 String 和 Integer 等重写了 equals 方法把它变成了值比较。看下面的代码就明白了
首先来看默认情况下 equals 比较一个有相同值的对象代码如下
class Cat {
public Cat(String name) {
this.name name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name name;
}
}
Cat c1 new Cat(小黑子);
Cat c2 new Cat(小黑子);
System.out.println(c1.equals(c2)); // false输出结果出乎我们的意料竟然是 false这是怎么回事看了 equals 源码就知道了源码如下
public boolean equals(Object obj) {
return (this obj);
}原来 equals 本质上就是 。
那问题来了两个相同值的 String 对象为什么返回的是 true代码如下
String s1 new String(叶子);
String s2 new String(叶子);
System.out.println(s1.equals(s2)); // true同样的当我们进入 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;
}原来是 String 重写了 Object 的 equals 方法把引用比较改成了值比较。
总结 对于基本类型来说是值比较对于引用类型来说是比较的是引用而 equals 默认情况下是引用比
较只是很多类重新了 equals 方法比如 String**、**Integer 等把它变成了值比较所以一般情况下
equals 比较的是值是否相等。
2.Hashcode的作用
java的集合有两类一类是List还有一类是Set。前者有序可重复后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢可以通过equals方法。但是如果元素太多用这样的方法就会比较慢。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域每个对象可以计算出一个哈希码可以将哈希码分组每组分别对应某个存储区域根据一个对象的哈希码就可以确定该对象应该存储的哪个区域
hashCode方法可以这样理解它返回的就是根据对象的内存地址换算出的一个值。这样一来当集合要添加新的元素时先调用这个元素的hashCode方法就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素它就可以直接存储在这个位置上不用再进行任何比较了如果这个位置上已经有元素了就调用它equal方法与新元素进行比较相同的话就不存了不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了几乎只需要一两次。
3. 两个对象的hashCode() 相同 那么equals()也一定为 true吗
不对两个对象的 hashCode() 相同equals() 不一定 true。
代码示例
String str1 keep;
String str2 brother;
System. out. println(String. format(str1%d | str2%d, str1.
hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));执行结果:
str11179395 | str21179395
false代码解读很显然“keep”和“brother”的 hashCode() 相同然而 equals() 则为 false因为在散列表中hashCode() 相等即两个键值对的哈希值相等然而哈希值相等并不一定能得出键值对相等。
4.泛型常用特点
泛型是Java SE 1.5之后的特性 《Java 核心技术》中对泛型的定义是 “泛型” 意味着编写的代码可以被不同类型的对象所重用。 “泛型”顾名思义“泛指的类型”。我们提供了泛指的概念但具体执行的时候却可以有具体的规则来约束比如我们用的非常多的ArrayList就是个泛型类ArrayList作为集合可以存放各种元素如Integer,String自定义的各种类型等但在我们使用的时候通过具体的规则来约束如我们可以约束集合中只存放Integer类型的元素如
ListInteger iniData new ArrayList()5.使用泛型的好处
以集合来举例使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合如整型集合类浮点型集合类字符串集合类我们可以定义一个集合来存放整型、浮点型字符串型数据而这并不是最重要的因为我们只要把底层存储设置了Object即可添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。
附上一篇博客介绍泛型