集合框架Set
List集合去重复
1.判断list集合中元素是否相等,依据的便是元素的equals 方法
equals方法有:
Contains调用了equals
比如使用Contains的思路如下图
Remove调用了equals
直接调用Remove方法对黑名单用户直接移除
判断是否存在于集合当中如下图
再使用remove方法如下段代码
list.remove(new Person("aa",18));
Set集合框架
**Set的特点**
1 元素是无序(存入和取出的顺序不一定一致),元素不可以重复;(注:普遍Set元素是无序的,但是jdk1.8底层源码进行了调优,会自动将int类型,或者String类型的数据进行一个默认排序,并且元素不可重复,元素重复再set集合中只会增加一次,这个论证是正确的也是片面的);
探究hashset
1.hashset本身具备去重的功能,但是它为什么具备这样的能力,它依靠的是什么?
答:hashset具备这样的功能依靠的是hashcode
1.将元素存放于集合当中
调用equals的方法判断是否存在于集合
再次 调用hashcode返回容器中的元素的坐标位置
(注:hashcode返回值代表着容器中的具体位置的坐标)
如下图
集合框架TreeSet
集合框架TreeSet的特点
1.自然排序
数据结构是has表
首先调用equals的方法判断集合中是否有元素
再次实现Comparblie接口(注:这种接口本身具备排序规则,这种排序规则被称为自然排序。要注意的是其他引用数据类型没有实现Comparable接口,那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,实现引用数据类型实现此接口就没问题了。);
案例:
class Person implements Comparable<Person>{}(注:实现接口的类)
其次判断条件:先判断主要条件,再判断次要条件(以免发生不符合逻辑的情况)
2.数据结构排序
可以对set集合进行排序,底层数据结构是二叉树;
保证元素唯一性的依据是,compareTo方法return 0
3.比较器排序
当元素自身不具备比较性时,或者具备的比较性不是所需要的;
注意:这时需要让集合自身具备比较性
在集合初始化时,就有了比较方式;
定义一个类,实现comparator接口,实现compare方法
当两种排序都存在时,比较器排序优先级更高
因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定,
那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法
比较器排序按照规则进行排序,先进行主要条件,在进行次要条件(先按照姓氏,再按照年龄)
案例:
再对象实现比较器排序
TreeSet hs = new TreeSet(new PersonComp());
结果
泛型
泛型的作用:
1.将运行时的异常转移到编译器
2.提升了代码的健壮性
如以下代码:
/**
- 泛型
- 1.将运行是的异常转移到编译期
- 2.提升了代码的健壮性
- @author 20190320
*/
public class FanXinDemo {
public static void main(String[] args) {
ArrayList al= new ArrayList<>();
al.add(1);
al.add(2);
al.add(3);
al.add(4);
al.add(5);
al.add(6);
Iterator it = al.iterator();
while(it.hasNext()) {
Object next =it.next();
int num=(Integer)next;
// if(next instanceof Integer) {
// num =(Integer)next;
// }
if(num % 2==0) {
System.out.println(num);
}
}
}
}
1.泛型 一般 出现在集合中,迭代器中 也会出现!
泛型 是为了 提高代码的 安全性。 泛型 确保数据类型的唯一性。
在我们常用的容器中, 越是 单一 约好处理啊!
2.? 是通配符 指代 任意类型
3.泛型的限定上限: <? extends E> 接受 E 或者 E 的子类型。(定义父类 填装子类 类型!)
泛型的限定下限: <? super E> 接收 E 或者 E 的父类。(一般用于定义 迭代器: 只需定义 父类类型的迭代器,否则 面向具体的话,扩展性和维护性不好!)