一Set接口
1Set接口的常用方法:和Collceion一样
2存储特点:相对无序存储,不可以存储相同的元素(排重),不能通过下标访问
二Set常用实现类HashSet(HashSet实现了HashMap键的维护)
HashSet特点:相对无序存储,不可以存储相同元素(排重),通过哈希表实现的集合
hashCode()是Object中的方法,每个对象的hashCode值是唯一的,所以可以理解成hashCode值表示这个对象在内存中的位置。
equals()方法是Object类中的方法,表示比较两个对象是否相等,若不重写相当于比较对象的地址,
HashSet中元素排重的原理:在创建一个HashSet集合往里面添加元素时,该集合会自动调用该元素的hashCode()方法,自动比较集合内是否有相同的哈希码(可以理解为地址),如果哈希码相同,集合会自动调用该类的equals()方法,如果equals()判断相等了才确定该元素是重复元素,它会将新添加的元素覆盖掉之前相同的元素。在使用基本类型包装器的时候,hashCode()和equals()已经被重写好了,不用再自己重写。
1在HashSet中添加自定义类型的属性相同元素,会被认为是不同的(hashCode不同,即地址不同),
package afternoon;
import java.util.*;
class Person
{
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
String name;
int age;
}
public class Test {
public static void main(String[] args) {
HashSet<Person> hash=new HashSet<>();
Person p1=new Person("AAA",1);
Person p2=new Person("AAA",1);
hash.add(p1);
hash.add(p2);
for(Person p:hash)
{
System.out.println(p.name+" "+p.age);
}
}
}
输出:
AAA 1
AAA 1
但是一般情况下,我们希望在元素属性相同的情况下认为这是同一个元素(排重),这就要在该类中重写hashCode()方法和equals()方法【两个必须全重写,缺一不可】
其中hashCode返回一个int型变量,一般返回对属性进行运算操作的值,格式为:public int hashCode()
equals相等返回true 不相等返回false,格式为:public boolean equals(Object o) 参数表必须是Object
package afternoon;
import java.util.*;
class Person
{
String name;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
/*hashCode方法返回值是int类型,所以重写时需要找到int类型的数据返回,还要保证此方法的返回值与对象的所有属性都相关,所以返回姓名属性的字符串的长度*/
public int hashCode()
{
return name.length()+age;
}
public boolean equals(Object o)
{
if(o instanceof Person)//先判断传入的参数对象是否是Person对象,若不是直接返回false
{
Person p=(Person)o;//若是,强转成Student对象,并比较属性的值
if(this.name.equals(p.name)&&this.age==p.age)//若属性的值相同,则返回true
return true;
}
return false;
}
}
public class Test {
public static void main(String[] args) {
HashSet<Person> hash=new HashSet<Person>();
Person p1=new Person("AAA",1);
Person p2=new Person("AAA",1);
hash.add(p1);
hash.add(p2);
for(Person p:hash)
{
System.out.println(p.name+" "+p.age);
}
}
}
输出:AAA 1
注:
obj.instanceof(class)
判断obj这个对象是不是class这种类型,
1.一个对象是本身类的一个对象
2.一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象
3.所有对象都是Object
4.凡是null有关的都是false null.instanceof(class)
三LinkedHashSet
LinkedHashSet类是具有可预知迭代顺序(相对有序)的Set接口的哈希表和链接列表实现。是HashSet的子类。
存储特点:
相对有序存储,不可以存储相同元素(排重),通过链表实现的集合(注定相对有序)
LinkedHashSet集合的元素排重与HashSet集合排重方法一致。
四TreeSet(排序)集合:TreeSet是TreeMap的键的维护
public class TestA {
public static void main(String[] args) {
TreeSet<Integer> t=new TreeSet();
t.add(3);
t.add(1);
t.add(2);
System.out.println(t);
}
}
输出:[1, 2, 3]
class MyComparator implements Comparator<Integer>{
public int compare(Integer o1, Integer o2) {
return -(o1-o2);
}
}
public class TestA {
public static void main(String[] args) {
TreeSet<Integer> t=new TreeSet<Integer>(new MyComparator());
t.add(3);
t.add(1);
t.add(2);
System.out.println(t);
}
}
输出:
[3, 2, 1]
五SortedSet接口
TreeSet除了实现了Set接口外,还实现了SortedSet接口
SortedSet接口中常用的方法: