Objiect类、Set中的HashSet和TreeSet的简单了解

1.Object类

1.1toString();

StringtoString()返回对象的字符串表示形式
public String toString()

返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。

toString类方法Object返回一个由其中的对象是一个实例,该符号字符的类的名称的字符串@` ”和对象的哈希码(内存地址)的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

1.2equals方法

booleanequals(Object obj)指示一些其他对象是否等于此。

boolean eaqual(Object obj);

public boolean equals(Object obj) {
     return (this == obj);
 }

Object 类下面的方法比较是两个对象的地址。不看内容的

为啥String类下面的equals方法比较的是内容呢?String类继承了Object

equals方法重写了Object类下面的。为啥重写?

当父类的需求,满足不了子类的需求的时候要重写父类的方法

1.3hashCode方法

哈希码值:在Object类下面,将内存地址(十六进制的值)转为十进制的值,此时这个十进制的值就叫hash码。

返回对象的哈希码值。 支持这种方法是为了散列表,如HashMap提供的那样

hashCode的注意事项是:

  • 只要在执行Java应用程序时多次在同一个对象上调用该方法, hashCode方法必须始终返回相同的整数,前提是修改了对象中equals比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。

  • 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。

  • 要求如果两个对象根据equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。

尽可能多的合理实用,由类别Object定义的hashCode方法确实为不同对象返回不同的整数。 (hash码的值通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。)

注意:无论何时重写equals方法,通常需要重写hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码

2.Set集合

也是一个接口,父接口是Collection

存储数据的特征:无序的,不可重复的

HashSet实现类:依靠hash值进行存储的,如果两个元素的hash值一样的话,就不再进行存储重复的那个元素了

TreeSet:底层是二叉树,对存储数据进行自然排序

2.1.HashSet

package com.qfedu.a_test;
​
import java.util.HashSet;
import java.util.Set;
​
public class Demo1 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("b");
        set.add("bc");
        set.add("c");
        System.out.println(set);//[a, bc, b, c]
        Set<Integer> set1 = new HashSet<>();
        set1.add(16);
        set1.add(6);
        set1.add(36);
        set1.add(23);
        System.out.println(set1);//[16, 36, 6, 23]
    }
}
​

HashSet集合存对象

总结:以后set集合中如果想存对象的时候,要求对象的内容如果一样的话,不能存到set集合中,咋办?重写equals方法和hahsCode方法

package com.qfedu.a_test;
​
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
​
class Dog{
    int age;
    String name;
​
    public Dog(int age, String name) {
        this.age = age;
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
​
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dog dog = (Dog) o;
        return age == dog.age && Objects.equals(name, dog.name);
    }
​
    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}
public class Demo2 {
    public static void main(String[] args) {
        Set<Dog> set = new HashSet<>();
        Dog dog1 = new Dog(2, "狗蛋");
        Dog dog2 = new Dog(2,"狗蛋");
        set.add(dog1);
        set.add(dog2);
        System.out.println(set);
    }
}
​

2.2.TreeSet

TreeSet中存对象会出现类转换异常的错误,需要去实现Compareable这个接口,Compareto去对比两个对象的int类型的数值,如果相等,就不再存储那个相等的对象。

package com.qfedu.a_test;
​
import java.util.Set;
import java.util.TreeSet;
class Student implements Comparable<Student>{
    String name;
    int age;
​
    public Student(String name, int age) {
​
        this.name = name;
        this.age = age;
    }
​
    @Override
    public int compareTo(Student o) {
        System.out.println(12);
        int num =  this.age - o.age;
        return num;
    }
​
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Demo3 {
    public static void main(String[] args) {
        Set<Student> set = new TreeSet<>();
        Student stu1 = new Student("张三",23);
        Student stu2 = new Student("李四",32);
        Student stu3 = new Student("王五",42);
        Student stu4 = new Student("赵六",12);
        set.add(stu1);
        set.add(stu2);
        set.add(stu3);
        System.out.println(set);
        /*
        12
        12
        12
        12
        [Student{name='张三', age=23}, Student{name='李四', age=32}, Student{name='王五', age=42}]
         */
    }
}
​
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值