前言
|ू・ω・` )
Set和List一样,也继承于Collection,是集合的一种。和List不同的是,Set内部实现是基于Map的
附带图解
如图:所以我会重点讲TreeSet和HashSet
HashSet的概念
元素是无序的,也就是说你存进去的顺序不会给你排序(1.8JDK已经可以排序)
HashSet的实现:
HashSet<Object> hs = new HashSet<>();
那么它的结构又是怎样的呢
底层数据结构 :哈希表
像这种:
HashSet它可以根据在使用add()方法时自动判断是否有重复:
hs.add("java02");
hs.add("java03");
hs.add("java04");
hs.add("java05");
可但增加为对象时,HashSet就无法自动判断,这是因为对象只有引用地址给他判断:
hs.add(new person("bb", 18));
hs.add(new person("cc", 15));
hs.add(new person("aa", 16));
hs.add(new person("aa", 16));
这个时候HashSet就会执行两个方法;
- hashCode() :这个方法会将每个new 的对象的哈希码返回
public int hashCode() {
System.out.println(" 哈希:"+super.hashCode());
return super.hashCode();
}
结果:
哈希:2018699554
哈希:1311053135
哈希:118352462
哈希:1550089733
可那对象里面的name(字符串)的如果相同,那么哈希码也会是一样的,这样咱们就可以 进行判断了
public int hashCode() {
System.out.println(" 哈希:"+this.name.hashCode()+this.age);
return this.name.hashCode()+this.age;
}
结果:
哈希:3154
哈希:3183
哈希:3120
哈希:3120
- equals() :进入这个方法的前提就是在hashCode()的方法有没有相同的哈希码
如果没有则不会进入这个方法
进入了就判断:
public boolean equals(Object obj) {
System.out.println("进来了");
if(obj instanceof person) {
person p = (person)obj;
if(this.name.equals(p.name)&&this.age==p.age) {
return true;
}
}
return false;
}
这样就ok了,在我看来这就像两关,第一把有相同的才会进入第二关;
TreeSet的概念
TreeSet可以对set集合中元素进行排序
HashSet的实现:
TreeSet hs = new TreeSet<>(new comparaT());
hs.add("java02");
hs.add("java03");
hs.add("java04");
hs.add("java05");
以上的程序不会出现什么问题
但是下面:
hs.add(new person("bb", 18));
hs.add(new person("cc", 15));
hs.add(new person("aa", 16));
hs.add(new person("aa", 16));
如果增加为对象,若对象没有实现Comparable接口的话就会报错
class person implements Comparable<person>{
}
那么就要实现compareTo()方法
public int compareTo(person o) {
int num = 0;
num = this.age - o.age;
if(num==0) {
num = this.name.compareTo(o.name);
}
return num;
}
第二种:
先写一个实现Comparator的类
class comparaT implements Comparator<person3>{
@Override
public int compare(person3 o1, person3 o2) {
int num = o1.getAge()-o2.getAge();
if(num==0) {
num = o1.getName().compareTo(o2.getName());
}
return num;
}
}
然后在创建TreeSet的时候:
TreeSet hs = new TreeSet<>(new comparaT());
就可以实现排序功能
泛型
什么是泛型?
泛型是一种参数化类型,可以使得使得一个容器被指定只能放入什么类型。
重要的通配符:
泛型的通配符就是:?,
?表示的意思:
它表示一个不确定的类型,它的值会在调用时确定下来
那么这个时候通用的方法就能做了。
public void fun1(List<? extends Object> list){
System.out.println("泛型方法");
}
一。通配符的继承
- ? extends Number,这个时候通配符就被限制为了Number和” Number的子类型
二。通配符可以有上界。
- ? superInteger,这个时候通配符就被限制为了Integer和” Integer的父类型
一些好处:
- 防止不知道容器类型而导致的报错
2. 提高了代码的通用程度
3. 也不用去强制转换
4. 提高了性能
泛型类
如代码:
class person<T>{
}
泛型方法:
public <T> void personT(T t){
System.out.println(t.getClass().getSimpleName());
}
调用:
person gm = new person();
gm .personT("");
gm .personT(1);
gm .personT(2.0);
gm .personT(2.0f);
gm .personT('a');
gm .personT(3);
泛型接口:
public interface Tperson<T>{
T next();
}
静态方法:
public static <T> void show(T t){
}
总结
1,HashSet:特点 无序,无重复(String)对象的无重复要重写(hashCode()和equals())
2,TreeSet:特点 无序,无重复 可排序。
有两种方法 Comparable 和Comparator
大家也可以去看我的Comparable和Comparator的使用
Thanks♪(・ω・)ノ谢谢大家用来参考