009期JavaSE面试题九集合之Set

32次阅读

共计 2083 个字符,预计需要花费 6 分钟才能阅读完成。

开篇介绍

大家好,我是 Java 面试题库的提裤姐,明天这篇是面试系列的第九篇,次要总结了 JavaSE 中汇合相干面试题,这篇是集系列的第二篇,次要解说 Set 汇合,第三篇次要解说 Map 汇合。在后续,会沿着第一篇开篇的常识线路始终总结上来,做到日更!如果我能做到百日百更,心愿你也能够跟着百日百刷,一百天养成一个好习惯。

List 和 Set 的区别?

List,Set 都是继承自 Collection 接口。都是用来存储一组雷同类型的元素的。

List 特点:元素有放入程序,元素可反复。
有程序,即先放入的元素排在后面。

Set 特点:元素无放入程序,元素不可反复。
无程序,即先放入的元素不肯定排在后面。不可反复,即雷同元素在 set 中只会保留一份。所以,有些场景下,set 能够用来去重。

留神:set 在元素插入时是要有肯定的办法来判断元素是否反复的。这个办法很重要,决定了 set 中能够保留哪些元素。

Set 如何保障元素不反复?

在 Java 的 Set 体系中,依据实现形式不同次要分为两大类。HashSetTreeSet
1、TreeSet 是二叉树实现的,Treeset 中的数据是主动排好序的,不容许放入 null 值
2、HashSet 是哈希表实现的,HashSet 中的数据是无序的,能够放入 null,但只能放入一个 null,两者中的值都不能反复,就如数据库中惟一束缚

在 HashSet 中,根本的操作都是有 HashMap 底层实现的,因为 HashSet 底层是用 HashMap 存储数据的。当向 HashSet 中增加元素的时候,首先计算元素的 hashcode 值,而后通过扰动计算和按位与的形式计算出这个元素的存储地位,如果这个地位位空,就将元素增加进去;如果不为空,则用 equals 办法比拟元素是否相等,相等就不增加,否则找一个空位增加。

TreeSet 的底层是 TreeMap 的 keySet(),而 TreeMap 是基于红黑树实现的,红黑树是一种均衡二叉查找树,它能保障任何一个节点的左右子树的高度差不会超过较矮的那棵的一倍。

TreeMap 是按 key 排序的,元素在插入 TreeSet 时 compareTo()办法要被调用,所以 TreeSet 中的元素要实现 Comparable 接口。TreeSet 作为一种 Set,它不容许呈现反复元素。TreeSet 是用 compareTo()来判断反复元素的。

HashSet 实现原理?

1. 基于 HashMap 实现的,默认构造函数是构建一个初始容量为 16,负载因子为 0.75 的 HashMap。封装了一个 HashMap 对象来存储所有的汇合元素,所有放入 HashSet 中的汇合元素实际上由 HashMap 的 key 来保留,而 HashMap 的 value 则存储了一个 PRESENT,它是一个动态的 Object 对象。

2. 当咱们试图把某个类的对象当成 HashMap 的 key,或试图将这个类的对象放入 HashSet 中保留时,重写该类的 equals(Object obj) 办法和 hashCode() 办法,而且这两个办法的返回值必须保持一致:当该类的两个的 hashCode() 返回值雷同时,它们通过 equals() 办法比拟也应该返回 true。
通常来说,所有参加计算 hashCode() 返回值的要害属性,都应该用于作为 equals() 比拟的规范。

3.HashSet 的其余操作都是基于 HashMap 的。

如何取到 Set 汇合中的第一个元素?

public static void main(String[] args) {Set set = new HashSet();
        set.add("tracy");
        set.add("hcx");
        set.add(123);
        set.add(4.5);
        System.out.println(set);//[4.5, hcx, tracy, 123]
        // 第一种办法
        if(!set.isEmpty()){System.out.println(set.iterator().next());// 4.5
        }
        // 第二种办法: 将 set 汇合转换成 list 汇合 取第一个
        List list = new ArrayList(set);
        System.out.println(list.get(0));// 4.5
    }

TreeMap 和 TreeSet 在排序时如何比拟元素?

TreeSet 要求寄存的对象所属的类必须是实现 Comparable 接口,该接口提供了比拟元素的 compareTo 办法,当插入元素时会调该办法比拟元素的大小.TreeMap 要求寄存的键值对映射的键必须实现 Comparable 接口,从而依据键对元素进行排序。

Collection 工具类中的 sort 办法如何比拟元素?

Collections 工具类的 sort 办法有两种重载的模式,
第一种要求传入的待排序容器中寄存的对象比拟实现 Comparable 接口以实现元素的比拟,
第二种不强制性的要求容器中的元素必须可比拟然而要求第二个参数, 参数是 Comparator 接口的子类型(须要重写 compare 办法实现元素的比拟)相当一个长期定义的排序规定,其实就是通过接口注入比拟元素大小的算法,也是对回调模式的利用。

正文完
 0