美文网首页小卜java
JAVA面试汇总(三)集合(一)

JAVA面试汇总(三)集合(一)

作者: 汤太咸啊 | 来源:发表于2022-01-03 23:56 被阅读0次
JAVA多线程七篇终于写完了,今天开始了新的JAVA面试汇总,集合部分,这部分其实比多线程有意思多了,这个计划最多五篇,也许不到五篇,这是第一篇,开卷。

1.Collection和Collections 的区别?

(1)Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。List,Set,Queue接口都继承Collection。
(2)Collections是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),大多数方法都是用来处理线性表的。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class TestCollections {
    public static void main(String[] args) {
        ArrayList nums = new ArrayList();
        nums.add(100);
        nums.add(-80);
        nums.add(25);
        nums.add(91);
        nums.add(-1);
        System.out.println("集合是否为空:" + nums.isEmpty());
        System.out.println("默认顺序:" + nums);
        Collections.reverse(nums);
        System.out.println("反转后顺序:" + nums);
        Collections.sort(nums);
        System.out.println("排序后顺序:" + nums);
        Collections.shuffle(nums);
        System.out.println("混淆后顺序:" + nums);
        // 下面只是为了演示定制排序的用法,将int类型转成string进行比较
        Collections.sort(nums, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                String s1 = String.valueOf(o1);
                String s2 = String.valueOf(o2);
                return s1.compareTo(s2);
            }
        });
        System.out.println("指定排序后顺序:" + nums);
        System.out.println("最大的值是:" + Collections.max(nums));
        System.out.println("最小的值是:" + Collections.min(nums));
    }
}
//输出
集合是否为空:false
默认顺序:[100, -80, 25, 91, -1]
反转后顺序:[-1, 91, 25, -80, 100]
排序后顺序:[-80, -1, 25, 91, 100]
混淆后顺序:[91, 100, -80, 25, -1]
指定排序后顺序:[-1, -80, 100, 25, 91]
最大的值是:100
最小的值是:-80

2.修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?

这个有些坑人,让你先入为主的以为用了equals方法,实际上用的key的hashCode方法,除非那这个对象A当key存的时候,才会用A的hashCode方法,equals方法只是针对比较是否相同时才使用,网上写的都是错的。具体来看看我写的测试

import lombok.Builder;

import java.util.HashMap;
import java.util.Objects;

public class EqualsTest {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        Demo a = Demo.builder().a("aaa").build();
        Demo b = Demo.builder().a("bbb").build();
        map.put(a, "a");
        map.put(b, "b");
        map.put(b, "b");
        map.put("c", b);
    }
    @Builder
    static class Demo{
        public String a;
        public String b;
        @Override
        public boolean equals(Object o) {
            System.out.println("Override equals");
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Demo demo = (Demo) o;
            return Objects.equals(a, demo.a);
        }
        @Override
        public int hashCode() {
            System.out.println("Override hashCode");
            return Objects.hash(a);
        }
    }
}
//输出
Override hashCode
Override hashCode
Override hashCode

3.List,Set,Map的区别

(1)List和Set都是Collection的子类,所以这两个都实现了iterator接口(Collection),都可以使用迭代器遍历集合中的内容,而Map未继承Collection类。
(2)List可以存入重复的实体
(3)Set存入重复的实体则不会存入,是否重复如果是HashSet会针对hashCode方法的重写的比较是否相同,如果是TreeSet则会比较compareTo方法的重写比较大小排序
(4)Map是键值对形式,key,value。

4.List和Map的实现方式以及存储方式

(1)List中常用实现方式有ArrayList和LinkedList,ArrayList的存储方式是数组,查询快;LinkedList的存储方式是链表,插入、删除快。
(2)Set常用实现方式有HashSet和TreeSet,HashSet的存储方式是hashCode算法存储的数组,加入的对象需要实现hashCode方法,快速查找元素;TreeSet的存储方式是按顺序序存储的二叉树,需要实现Comparable接口来比较大小来排序
(3)Map常用实现方式有HashMap和TreeMap,HashMap的存储方式是通过hashCode算法存储的数组,当存入的数据达到一定程度会转换为红黑树(目前不了解,等我后边研究的),快速查找键值;TreeMap存储方式是对key值按顺序存储的红黑树,类似于TreeSet同样要实现Comparable接口来比较大小来排。

5.LinkedList实现原理

(1)通过双向链表实现的,内部存储了链表头/链表尾的节点以及存储节点的个数
(2)get(int index)判断index是在前半部分还是后半部分,前半部分从链表头开始遍历直到index位置,后半部分则从链表尾向前开始遍历直到index。
(3)set(int index, E element)同样是先查找到index的节点,替换掉
(4)add(int index, E element)同样是先查找到index的节点,在这个节点后边添加一个节点,如果原位置后边有节点,则将原位置后边的节点添加到新添加的节点的后边。
(5)remove其实一样先index节点,然后将他的前一个节点的指向当前节点的位置设置为null。

感谢各位的阅读,帮忙点赞,感谢各位。

相关文章

网友评论

    本文标题:JAVA面试汇总(三)集合(一)

    本文链接:https://www.haomeiwen.com/subject/qdbmqrtx.html