一、Object:所有类的超类
1. equals方法
默认为引用相等,可以重写为状态相等。(同时要重写hashCode方法) 在IDEA中直接可以使用模板。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return Double.compare(employee.salary, salary) == 0 &&
id == employee.id &&
Objects.equals(name, employee.name) &&
Objects.equals(hireDay, employee.hireDay);
}
ps. getClass方法将返回一个对象所属的类。
2. hashCode方法
hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值由对象的存储地址得出。 字符串有相同散列码,因为字符串的散列码由内容导出,而字符串构建器则有着不同散列码,因为StringBuilder类中没有定义hashCode方法,而Object类的默认hashCode方法会从对象的存储地址的出散列码。
String s="OK";
StringBuilder sb=new StringBuilder(s);
System.out.println(s.hashCode()+" "+sb.hashCode());
String t=new String("OK");
StringBuilder tb=new StringBuilder(t);
System.out.println(t.hashCode()+" "+tb.hashCode());
如果重新定义了equals方法,就必须为用户可能插入散列表的对象重新定义hashCode方法
@Override
public int hashCode() {
return Objects.hash(name, salary, hireDay, id);
}
3. toString方法
@Override
public String toString() {
return getClass().getName() +
"[name='" + name + '\'' +
", salary=" + salary +
", hireDay=" + hireDay +
", id=" + id +
']';
最好通过调用getClass().getName()获得类名的字符串,而不要将类名硬编码写到toString方法中,这样toString方法也可以由子类调用。(这样子类可以直接写super.toString())
二、泛型数组列表ArrayList
“可变长度的数组容器” 是一个有类型参数的泛型类
ArrayList<Employee> staffs=new ArrayList<>();
staffs.add(new Employee("abc",10000,1999,9,1));
for(Employee e:staffs)
{
e.raiseSalary(5);
}
for(Employee e:staffs)
{
System.out.println("name="+e.getName()+"salary"+e.getSalary()+"hireDay="+e.getHireDay());
}
三、对象包装器与自动装箱
Integer类对应基本类型int,通常,这些类称为包装器Wrapper。
想要定义一个整形数组列表,尖括号中的类型参数不允许是基本类型, ArrayList<Integer> list=new ArrayList<>();
而调用 list.add(3) 会自动变换成list.add(Integer.valueOf(3)) 这种变换称为自动装箱(autoboxing)
相反 则会自动拆箱 int n=list.get(i)
ps.自动装箱和拆箱是编译器要做的工作。
|