一 set集合
1 特点 :无序 无下标 不能重复
例子:创建一个Hasset 保存两个a 两个b 两个c 两个 d
HashSet<String> hashSet = new HashSet<>();
hashSet.add("a");
hashSet.add("a");
hashSet.add("b");
hashSet.add("b");
hashSet.add("c");
hashSet.add("c");
hashSet.add("d");
hashSet.add("d");
//使用增强for循环遍历
// for (String string : hashSet) {
// System.out.println(string);
// }
System.out.println(hashSet);
运行结果
从运行结果可以看出a b c d只出现了一次 可以看出他的特点不能重复
我们再来看看equals()方法 Hashcode()方法
我们给出一个需求保存5个人 并遍历
HashSet<Person> hashSet = new HashSet<>();
hashSet.add(new Person("小红",18));
hashSet.add(new Person("小小",11));
hashSet.add(new Person("小懒",12));
hashSet.add(new Person("小册",13));
hashSet.add(new Person("小刚",14));
hashSet.add(new Person("小丹",14));
for (Person person1 : hashSet) {
System.out.println(person1);
}
hasCode重写
public int hashCode() {
// this.name .haschcode +age
//写这么复杂就是为了让hascode 减少重复
// 少调用equals方法 提高存储效率
//为什么使用31
//1 31是质数 减少公约数
//2 31这个数不大也不小
final int prime = 31;
int result = 1;
result = prime * result + Age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
equals重写
//防御式判断 健壮性判断
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;//前面都为空 就说明这两个对象时相同对象
}
重写完之后 我们来看看运行效果
linkedHashSet—是HashSet的子类 他与HashSet的不同点在于 他是有序的(怎么存的怎么取出来)
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("f");
linkedHashSet.add("a");
linkedHashSet.add("b");
linkedHashSet.add("c");
linkedHashSet.add("d");
linkedHashSet.add("d");
System.out.println(linkedHashSet);
我们来做一个题目试试手
编写一个程序 ,获取10个1-20的随机数 要求随机数不能重复
我们先来列一个大体思路
1 创建一盒Set集合
2 随机10个数
3 把10个数 添加到集合中
4 当集合 的长度 < 10 就添加 >=10 不能添加
HashSet< Integer> hashSet = new HashSet<>();
while(hashSet.size() < 10) {
//随机数
int num= (int)(Math.random()*(20-1+1)+1);
//添加到Set中
hashSet.add(num);
//添加到Set
}
System.out.println(hashSet);
二 TreeSet
作用 排序 (去重)
1 让我们来看看Treeset 添加几个数的效果
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(1);
treeSet.add(1);
treeSet.add(0);
treeSet.add(-1);
treeSet.add(7);
treeSet.add(-100);
treeSet.add(-1000);
System.out.println(treeSet);
可以看出 他是按升序排列 且去重了
下面我们来看看比较器 Comparator
他有什么用呢
集合中保存字符串 按字符串长度进行比较
你可以根据实际情况去重写compareto()方法
TreeSet<String> set = new TreeSet<>(new Comparatorimpl());
set.add("aaa");
set.add("bb");
set.add("ddddd");
set.add("q");
for (String string : set) {
System.out.println(string);
}