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
;
@Override
public int hashCode() {
final int prime
= 31;
int result
= 1;
result
= prime
* result
+ age
;
result
= prime
* result
+ ((name
== null
) ? 0 : name
.hashCode());
return result
;
}
@Override
public 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
;
}
@Override
public String
toString() {
return "Person [name=" + name
+ ", age=" + age
+ "]";
}
@Override
public int compareTo(Object o
) {
Person p
= (Person
)o
;
if(this.age
> p
.age
) {
return 1;
}
if(this.age
< p
.age
) {
return -1;
}
return 0;
}
}
package connection2
;
import java
.util
.TreeSet
;
public class TestTreeSet{
```
public static void main(String
[] args
) {
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