提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、数据类型
Java 数据两种类型 – 基本类型的应用类型
- 基本类型
基本数据类类型存的是数值本身 - 引用类型
引用类型变量在内存放的是数据的引用
基本类型通过 == 比较的是他们的值大小,而引用类型比较的是他们的引用地址
二、使用步骤
1.String.equals源码
代码如下(示例):
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) { //判断对象实例是否是String
String anotherString = (String)anObject; //强转成string类型
int n = value.length;
if (n == anotherString.value.length) { //如果两个字符串相等,那么它们的长度自然相等。
//遍历两个比较的字符串,转换为char类型逐个进行比较。
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i]) //采用`==`进行判断,如果不相同,则返回false
return false;
i++;
}
return true; //否则返回true。
}
}
return false;
}
- 首先判断传进来的String和当前对象是否相同,相同就直接返回true;
- 再判断两个字符串长度是否相同
- 转换成char数组逐个进行比较
2.==和equals
Object的(示例):
public boolean equals(Object obj) {
return (this == obj);
}
如果不重写equals的话,默认都会走Object父类的==,对引用变量做内存地址比较
三、了解Class中的HashCode
为什么要有hashCode?
它主要配合基于散列的集合一起工作,比如HashSet,HashTable,HashMap等
当向集合里添加元素时候,首先需要添加元素是否相同,如果集合中元素特别多的时候,用equals需要遍历,所以采用计算该对象的hashcode值,先判断在指定地址是否有对象,如果没有就会用一个table保存,如果有的话就比较key值是否相同,相同就替换,不相同就插入
问题解答
问题:两个对象值相同(x.equals(y) == true),但是可能存在hashCode不同吗?
- 如果两个对象值相同,有可能存在不同的hashCode。具体的实现方法是,只重写equals方法,不重写hashCode。
- 这种处理方式会存在风险,在实际开发中,必须遵循重写equals方法的同时也需要重写hashCode方法这一原则。否则在Java散列集合类操作中,会存在null的问题。
问题:”new String(“abc”)到底创建了几个对象
- 会先实例化一个字符串对象
- 如果“abc”常量字符串不存在,则再创建一个abc常量字符串变量
参考:
https://blog.csdn.net/q331464542/article/details/121008673