day 17 HashSet、TreeSet、comparable接口、comparator比较器

1.ArrayList嵌套

1.1 在集合中存放集合,和二维数组类似

ArrayList<ArrayList> arraylList=new ArrayList<>();

2.Set集合

2.1 定义

set集合存放的元素是无序的,不能存放重复元素

2.2 应用场景

1.当集合中不想有重复元素时,可以使用set集合

2.当需要排除集合中的重复元素时,可以使用set集合

3.HashSet集合

3.1 定义

1.HashSet集合中的元素通过hash值来比较,通过集合元素hashCode()和equals()方法来决定是否加入

2.元素最后存入的元素是由元素的hash值决定的,不是顺序的

3.2 存储原理

1.要加入集合的元素,先计算hash值,确定元素存放的位置,再通过equals方法判断要加入的元素是否和hash值所在位置的元素相等,如果相等,不加入,不相等就加入

2.如果两个元素计算出了相同的hash值,也同样加入

3.3 构造方法

1.无参构造

HashSet() 构造出一个新的HashSet对象,初始容量是16,扩容时扩大一倍

2.有参构造

HashSet(Collection<? extends E> c) 构造一个包含指定collection中元素的新set

3.4 常用方法

1.boolean add( E e) 如果此set集合中尚未包含指定元素,则添加指定元素

2.boolean remove(Object o) 移除某个元素

3.int size() 获取集合的⻓度

3.5 测试代码—去除ArrayList中的重复元素

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList=new ArrayList<>();
        arrayList.add(12);
        arrayList.add(213);
        arrayList.add(213);
        arrayList.add(45);
        arrayList.add(67);
        
        // 去除重复元素,将arrayList作为参数,创建hashSet对象
        HashSet<Integer> hashSet=new HashSet<>(arrayList);
        
        System.out.println(hashSet);
        
    }
}

4.LinkedHashSet集合

4.1 定义

兼顾了linked的有序性和HashSet的元素唯一性

4.2 代码测试

HashSet<Integer> hashSet1=new HashSet<>();
hashSet1.add(12);
hashSet1.add(34);
hashSet1.add(12);
hashSet1.add(67);

System.out.println(hashSet1);

LinkedHashSet<Integer> linkedHashSet=new LinkedHashSet<>();
linkedHashSet.add(23);
linkedHashSet.add(46);
linkedHashSet.add(23);
linkedHashSet.add(78);

System.out.println(linkedHashSet);

5.TreeSet集合

5.1 定义

1.treeSet集合中的元素,都是有顺序的,是通过比较元素的大小来进行存储的,大的存右边,小的存左边

2.collection集合中的元素,一般都是引用类的,而继承类treeSet集合中存放的对象,都必须实现Comparable接口,其中有comparaTo方法,此方法决定treeSet的排序规则

3.最后的元素会形成一个树结构

5.2 构造方法

1.TreeSet() 构造⼀个新的空set, 该set根据其元素的⾃然顺序(元素类中comparaTo方法设定的排序方法)进⾏排序

2.TreeSet(Comparator <? super E> comparator) 构建⼀个空的TreeSet, 他根据指定⽐较器进⾏排序,如果存放的元素类没有实现comparable接口并重写comparaTo方法,就需要创建比较器类comparator,并用比较器创建treeSet对象

5.3 常用方法

1.add(E e) 将指定元素添加到此set

2.first() 返回此set中当前第⼀元素

3.last() 返回此set中当前最后⼀个元素

4.floor() 返回此set中⼩于等于给定元素的最⼤元素,不存在则返回null

5.higher() 返回此set中严格⼤于给定元素的最⼩元素,不存在则返回null

5.4 添加原理

​ TreeSet会将第⼀个添加的元素作为中点, 以后添加的元素会先跟中点进⾏⽐较, 如果⼤于就接

着跟所⽐较元素的右边的元素接着⽐较,如果⼩于就接着跟所⽐较元素左边的元素接着⽐较, 直

到⽆法找到可⽐较的元素,就会将新添加的这个元素放到当前位置

5.5 comparable接口

1.comparaTo方法

1)如果方法返回的数小于0,表示当前元素小于要加入的元素,存在左边

2)如果方法返回的数等于0,表示当前元素等于要加入的元素,不加入

3)如果方法返回的数大于0,表示当前元素大于要加入的元素,存在右边

5.6 comparator比较器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHGY9Kfu-1639573382870)(C:\Users\tpszhao\AppData\Roaming\Typora\typora-user-images\image-20211215205217051.png)]

5.7 compara接口和comparator的区别

ComparableComparator的区别
 1. 使用上: Comparable接口必须让类自己去实现并且重写对应方法
            Comparator接口则是需要单个的实现类去单独实现他并且重写对应的方法
 2. 排序上: 对于实现类Comparable接口的类,每次排序使用的都是同一个规则,无法自行更改排序规则
            对于Comparator接口,则可以每次排序单独指定一个排序规则
 3. 修改源代码: Comparable接口使用的前提是可以修改对应的类
                Comparator接口则不需要修改对应的类,和类相互独立
 4. 参数使用上:Comparable不能作为参数,在方法中出现
               Comparator可以作为参数,在sort方法当中确定需要使用的排序的规则

同时存在的时候:  ComparableComparator的优先级  --- Comparator的优先级更高

6.Colleactions类,针对collection集合的操作方法类

6.1常用方法

1.sort(List list) 根据元素的⾃然顺序排序**(元素类继承了comparabla类,重写了comparaTo方法)**

2.sort(List list ,Comparator <? super E> comparator) (元素没有继承comparabla类)

3.swap(List list , int i , int j) 交换集合中两个⻆标位上的值

4.reverse(List<?> list ) 反转集合中的元素的顺序

5.replaceAll(List list, T oldVal**(旧元素), T newVal(新元素)**) 替换

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值