java集合框架相关面试题整理

腾讯-Java后台开发面经

  1. HashSet 和 HashMap 的区别是什么?

    1. HashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。
      在这里插入图片描述
  2. HashMap 是线程安全的么?线程安全需要用到什么?

  3. 介绍一下 HashMap。如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?

阿里巴巴-Java后台开发面经

  1. ArrayList 和 LinkedList 的区别是什么?

    • ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
    • LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
  2. 有了解过 HashMap 的具体实现么?

    • HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,可以调优初始容量和负载因子。HashMap非线程安全
  3. HashMap 和 ConcurrentHashMap 哪个效率更高?

    • 在1.8中ConcurrentHashMap的get操作全程不需要加锁,因为Node的成员val是用volatile修饰的和数组用volatile修饰没有关系,所以它比其他并发集合比如hashtable、用Collections.synchronizedMap()包装的hashmap;安全效率高。

今日头条-Java后台开发面经

  1. 编程题:判断一个链表是否是一个回文链表。
//判断一个链表是否是回文
    public boolean chkPalindrome(){
        if(this.head==null){
            return false;
        }
        //找到当前链表的中间位置
        Node fast = this.head;
        Node slow = this.head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        //从中间位置开始 后半部分进行反转
        Node cur = slow.next;
        while (cur != null) {
            Node curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        //head从头往后走  slow从后往前走
        while (slow!=head){
            //只要发现对应的val值不一样,就返回false  直到head和slow相遇
            if(head.val!=slow.val){
                return false;
            }
            if(head.next==slow)
            {
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
  1. hashCode主要是用来做什么用的

    • 为什么:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表的原理。

    • 是什么hashCode方法实际上返回的就是对象存储的物理地址(实际上并不是真正的在内存的物理地址,不过可以这样理解)。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

  2. Redis 的 zset 类型对应到 java 语言中大致是什么类型?

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值