1、请解释hashCode()和equals()方法有什么联系?
Java对象的eqauls()方法和hashCode()方法是这样规定的:
➀相等(相同)的对象必须具有相等的哈希码(或者散列码)。
➁如果两个对象的hashCode相同,它们并不一定相同。
两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能说明这两个对象在一个散列存储结构(如下图,可能都在2的地址中,但是在2地址中的位置不同)中。
所以set在添加元素的时候 通过数组加链表加红黑树结构实现添加 如果hashcode不同 在数组中存放的位置就不一样 。 如果hashcode一样,就产生了哈希冲突 再判断equals方法 如果一样 就不添加 如果不一样 就加入到链表中 当链表的节点大于8时 就以红黑树的方式存储
2、请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
什么是构造方法:
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
public class ADHero{
protected String name;
//构造方法
public ADHero(String name) {
this.name = name;
}
public static void main(String[] args) {
AD hero1 = new ADHero("hb");//实例化过程中会调用构造方法
}
}
构造函数重载:
构造方法 的重载和方法的重载类似,名字都是类名,但是可以输入的参数个数不同。
在实例化过程中,会根据输入参数的不同,调用不同的构造方法。
public class ADHero{
protected String name;
//构造方法
public ADHero(String name) {
this.name = name;
}
//构造方法重载
public ADHero(String name,int hp){
this(name);
this.hp = hp;
}
public static void main(String[] args) {
AD hero1 = new ADHero("hb");//实例化过程中会调用构造方法
AD hero1 = new ADHero("hb",100);//调用第二个构造方法
}
}
复制构造方法
浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象。
深拷贝就是两个对象的值相等,但是互相独立。
构造函数的参数是该类的一个实例。
浅拷贝:
ublic class Employee {
private int id;
private String name;
//要创建拷贝构造方法,首先需要声明带有和本类相同类型的参数构造函数:
public Employee(Employee employee) {
this.id = employee.id;
this.name = employee.name;
}
}
但是如果类中包含可变类型就要通过该构造函数实现深拷贝。
为了实现深拷贝,我们需要根据原始可变对象类型构造新的实例。
深拷贝:
public class Employee {
private int id;
private String name;
private Date startDate;
public Employee(Employee employee) {
this.id = employee.id;
this.name = employee.name;
this.startDate = new Date(employee.startDate.getTime());
}
}