【面经】美团优选后端一面

一 HashCode和equal方法是哪个类里面的

        HashCode() 和 equal() 方法都定义在 java.lang.Object 类中。由于 Object 类是所有 Java 类的父类,因此每个 Java 对象都可以调用这两个方法。

二 HashCode和equal方法的区别

        对于hashcode方法,会返回一个哈希值,哈希值对数组的长度取余后会确定一个存储的下标位置。不同的哈希值取余之后的结果可能是相同的,用equals方法判断是否为相同的对象,不同则在链表中插入。

        对于HashCode和equal方法,规定:

        如果两个对象相等,则hashcode一定也是相同的;
        两个对象相等,对两个对象分别调用equals方法都返回true;
        两个对象有相同的hashcode值,它们也不一定是相等的;

三 ==和equals区别

        ==常用于相同的基本数据类型之间的比较,也可用于相同类型的对象之间的比较:如果==比较的是基本数据类型,那么比较的是两个基本数据类型的值是否相等;如果==是比较的两个对象,那么比较的是两个对象的引用,也就是判断两个对象是否指向了同一块内存区域;

        equals方法主要用于两个对象之间,检测一个对象是否等于另一个对象。

四 ArrayList和LinkedList区别

        是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

        底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;

        插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。

        是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。

        内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

五 JVM常见的垃圾回收器

        垃圾回收器主要分为以下几种:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;

        Serial:单线程的收集器,收集垃圾时,必须stop the world,使用复制算法。它的最大特点是在进行垃圾回收时,需要对所有正在执行的线程暂停(stop the world),对于有些应用是难以接受的,但是如果应用的实时性要求不是那么高,只要停顿的时间控制在N毫秒之内,大多数应用还是可以接受的,是client级别的默认GC方式。

        ParNew:Serial收集器的多线程版本,也需要stop the world,复制算

        Parallel Scavenge:新生代收集器,复制算法的收集器,并发的多线程收集器,目标是达到一个可控的吞吐量,和ParNew的最大区别是GC自动调节策略;虚拟机会根据系统的运行状态收集性能监控信息,动态设置这些参数,以提供最优停顿时间和最高的吞吐量;

        Serial Old:Serial收集器的老年代版本,单线程收集器,使用标记整理算法。

        Parallel Old:是Parallel Scavenge收集器的老年代版本,使用多线程,标记-整理算法。

        CMS:是一种以获得最短回收停顿时间为目标的收集器,标记清除算法,运作过程:初始标记,并发标记,重新标记,并发清除,收集结束会产生大量空间碎片;

        G1:标记整理算法实现,运作流程主要包括以下:初始标记,并发标记,最终标记,筛选回收。不会产生空间碎片,可以精确地控制停顿;G1将整个堆分为大小相等的多个Region(区域),G1跟踪每个区域的垃圾大小,在后台维护一个优先级列表,每次根据允许的收集时间,优先回收价值最大的区域,已达到在有限时间内获取尽可能高的回收效率;

六 垃圾回收算法有哪些


七 了解IOC吗

        IOC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的bean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。在实际应用中,Spring通过配置文件(xml或者properties)指定需要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法(getBean())就可以获取到我们想要的根据指定配置进行初始化的实例对象。

        优点:IOC或依赖注入减少了应用程序的代码量。它使得应用程序的测试很简单,因为在单元测试中不再需要单例或JNDI查找机制。简单的实现以及较少的干扰机制使得松耦合得以实现。IOC容器支持勤性单例及延迟加载服务。

八 线程池

        程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。

        使用线程池的好处:

        降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
        提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行。
        提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

九 线程池创建要哪些参数

        corePoolSize : 核心线程大小。线程池一直运行,核心线程就不会停止。

        maximumPoolSize :线程池最大线程数量。非核心线程数量=maximumPoolSize-corePoolSize

        keepAliveTime :非核心线程的心跳时间。如果非核心线程在keepAliveTime内没有运行任务,非核心线程会消亡。

        workQueue :阻塞队列。ArrayBlockingQueue,LinkedBlockingQueue等,用来存放线程任务。

        defaultHandler :饱和策略。ThreadPoolExecutor类中一共有4种饱和策略。

        ThreadFactory :线程工厂。新建线程工厂。

十 MySQL索引有哪些

        普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 
        复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并 
        唯一索引:索引列的值必须唯一,但允许有空值

十一 为什么要有索引

        索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。

十二 事务的四大特性

        原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做

        一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

        隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的//操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

        持续性。也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

十三 redis的缓存穿透、雪崩、击穿

        缓存穿透:指查询一个缓存中不存在的数据,并且该数据在数据库中也不存在,每次查询都会访问数据库,导致缓存失效。解决方法包括使用布隆过滤器来拦截不存在的查询,或为空结果设置短期缓存。

        缓存雪崩:指缓存中大量数据在同一时间过期,导致大量请求涌入数据库,导致数据库压力过大。解决方法是为缓存设置随机过期时间,避免集中过期,或使用分布式锁保护数据库。

        缓存击穿:指某个热点数据由于过期时间到了而失效,导致大量请求同时查询数据库。解决方法包括加互斥锁或使用永不过期的缓存策略,并通过后台定期更新数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值