Set集合
Set集合介绍
继承自Collection接口,①不包含重复元素,②没有索引,没有带索引的方法。
一、HashSet
java.util.HashSet实现了Set接口,
特点:
- 不允许重复的元素
- 没有索引,没有索引的方法。
- 无序集合,存储元素取出元素的顺序可能不一致。
- 底层是几个哈希表结构
由哈希表支持,不保证set的迭代顺序,底层不同步。
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(3);
set.add(2);
set.add(1);//只添加一次
Iterator<Integer> it = set.
(一)哈希表
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,不是对象的物理地址。通过Object类的hasCode()可以获取哈希值)
publi class Demo extends Object{
//public native int hashCode();//代表该方法掉哟个的是本地操作系统的方法
main(){
Person p1 = new Person();
int h1= p1.hashCode();
Person p2 = new Person();
int h2= p2.hashCode();
sysout(p1);//打印的就是hashCode 1
sysout(p2);//打印的就是hashCode 1
sysout(p1==p2);//false物理地址不同
}
public native int hashCode(){
return 1;
}
}
String s1 = new String("abc");//字符串重写了hashCode
String s2 = new String("abc");
s1和s2的hasncode一样
String s1 = new String("重地");//字符串重写了hashCode
String s2 = new String("通话");
s1和s2的hasncode一样
二、set集合不允许存储重复元素的原因
三、HashSet集合存储自定义类型元素
存放自定义元素,需要重写hashCode 和equals方法
public class DemoHashSet{
HashSet<Person> set = new HashSet<>();
Person p1 = new Person("name1",19);
Person p2 = new Person("name1",19);
Person p3 = new Person("name1",20);
//p1和p2的hashCode一样,为了不重复添加,需要重写HahsCOde和equals方法
}
hashCode(){}//重写
equals(){}//重写
四、LInkedHashSet集合
继承自HashSet结构
具有可预知迭代顺序的 Set
接口的哈希表和链接列表实现。此实现与 HashSet
的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e)
返回 true
后立即调用 s.add(e)
,则元素 e
会被重新插入到 set s
中。)
特点
- 底层是一个哈希表(数组+链表+红黑树)+链表,多了一条链表(记录元素的存储顺序),保证元素有序
- 有序,不允许重复