javaSet,hash()和equals()判断是否重复

    xiaoxiao2022-07-12  147

    Set (接口) extends Connection(接口)

    ———————HashSet(类)

    ———LinkHashSet(类)extends HashSet implements Set

    1.set 是存取无顺序的,不可重复相同的值(可以添加相同的值,但是只显示一个)

    public class SetOne { ``` public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("wy"); set.add("wxj"); set.add("wf"); set.add("wy"); System.out.println(set); for (String string : set) { System.out.println(string); } } }

    运行结果如下图!!!

    HashSet(底层是哈希表实现的,可以去除重复,但是是无序。)

    ​ 哈希表里存放的哈希值,HashSet存放的顺序是按照哈希值存放的,取数据也是按照哈希值取的。

    HashSet的不放入重复的值,是通过每个元素的HashCode和Equals来判断的。

    ​ 当你想往HashSet中存放对象的时候,HashSet会调用元素的hashcode方法来计算hashcode值,如果与之前存放的对象的hashcode都不重复,hashset就会假设没有重复的值出现。如果hashcode的值相同,就会调用equals方法进行比较,如果equals方法返回为true则判定为此对象以重复,如果equals返回为false,那么认为新元素没有重复,可以加入。

    因此我们自定义类[hashset.add(new Person(“wy”,20))]的时候需要重写hashCode,来确保对象具有相同的hashCode值,因为自定义默认调用object中的hashcode和equals方法

    表中的第一个表是元素1.2.3的hashcode值不相同,以行存储。

    表中的第二个表是元素1.2.3的hashcode值列相同,equals返回为false,以列存储,在相同的哈希值下顺延。

    通过hashcode来判断在内存中的位置。一个hashcode值上可以存放多个元素。

    TreeSet(类,红黑树的数据结构,默认对元素进行自然排序,如果在比较的时候两个对象返回值为零,则重复)

    红黑树算法的规则:左小右大

    1.让存入的元素自定义比较规则

    ​ 这时需要实现comparable接口,重写compareTo( public int compareTo(T o); )方法,让元素自身具有比较性,叫做自然排序,也叫默认排序。

    2.让TreeSet指定排序规则

    ​ 实现comparator接口,重写compare方法(int compare(T o1, T o2)?,并将该子类的实例对象作为参数传递给TreeMap集合的构造方法使用原因:元素自身不具备比较性,或者具备的比较性不被需要。

    注意:在同时实现了comparable和compare接口的时候,要优先使用comparator接口中的方法。与此同时,要增加比较的次要条件(eg:在比较年龄和姓名的时候,需要对年龄进行升序排序,如果年龄相同,那该怎么办呢?不能直接返回return 0;这是就需要加入次要的比较条件,只有当二者都相同的情况下才会返回0)

    这两个方法都是判断返回值来确定是否相同,如果是零则相同

    当在TreeSet中输入字符串的时候,会自动进行升序的排序,这是因为String类实现了Comparable接口(此接口只有一个compareTo方法),字符串重写了CompareTo()方法,所以字符串对象会进行升序排序,所以在写TreeSet写自定义元素(例如:Person类)的时候,就需要实现comparable接口。

    package connection2; public class Person implements Comparable{public String name;public int age;@Overridepublic int hashCode() {final int prime = 31;int result = 1; ​ result = prime * result + age; ​ result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false; ​ Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stub ​ Person p = (Person)o;if(this.age > p.age) {return 1;}if(this.age < p.age) {return -1;}return 0;} // @Override // public int compareTo(Object o) { // // TODO Auto-generated method stub // return 0; // } ​ ​ ​ } package connection2; import java.util.TreeSet; public class TestTreeSet{ ``` public static void main(String[] args) { //如果不实现comparable的compareTo()方法则只能存入一个 TreeSet<Person> ts = new TreeSet<Person>(); ts.add(new Person("aaa", 20)); ts.add(new Person("ccc", 10)); ts.add(new Person("bbb", 30)); System.out.println(ts); } ``` }

    四,LinkedHashSet

    看到link想到的是first,last

    看到array想到的是下标

    看到hash想到的是equals和hashcode

    看到tree就想到了两个接口,comparable,comparator

    最新回复(0)