拓展
1.什么叫多态.
-父类的引用指向子类的对象
-接口的引用指向实现类的对象
-多态时,方法名列表看父类,执行过程看子类.
-常规类->抽象类->接口 : 三者从大范畴上都属于类,三者的演变是一个逐步变得残缺的过程.
2.重载与重写.
-同一个类里,两个方法,同名不同参,叫作重载.
-注意同名又同参,但返回不同,不能构成重载.
-两个类里,子类重写父类方法,实现类重写接口方法.
3.谈谈堆,栈,常量池,以及无限递归为什么发生栈溢出?常量池的去重特性是什么?如何证明?
-基础型数据存栈
-对象型数据,引用部分存栈,对象内容部分存堆.
-字符串可以存常量池,可以存堆.
-堆空间受垃圾回收机制管理,不易溢出.
-栈空间不受垃圾回收机制管理,会随方法作用域即时回收,无限递归会造成出不了方法作用域,栈堆积,溢出.
4.List与Set的区别,Arraylist与LinkedList的区别,HashSet与TreeSet的区别.
-List有序,也就是遵循放入顺序
-Set无序,也就是不遵循放入顺序.但不代表随机乱序,而是有内在的固定顺序.
(HashSet内在顺序不可自定义,TreeSet内在顺序可以自定义,通过传入比较器.)
-少数非主流list或set不符合以上规则.
-ArrayList底层是数组,读取快,增删慢.LinkedList底层是链表,读取慢,增删快.
5.try-catch-finally中,catch提前return,finally还会不会执行?finally常用来干什么,static代码块常用来干什么?
-无论是try还是catch内提前return,finally都一定会执行.
-finally一般用来最终清理资源.
-静态代码块一般用来初始化资源.
6.==/equals()/hashcode()区别?String的equals()与hashcode()为什么针对内容?
-默认对象中,三者均针对地址.
-==不可重写,后二者可重写,重写后可以针对地址,也可以针对内容.
-String中的equals()/hashcode()都是重写过的,所以针对内容.
-对于一个自定义类,我们一旦重写了equals(),就要同步重写hashcode(),这个规范是用来满足hashset类集合判重的.
7.Set<高级类型>内部是如何判重的?为什么hashcode()判断相同后还要用equals()二次判断?
-Set类集合内部判重,都是hashcode()/equals()联合判断,具体流程先判hashcode()
,hashcode()不同,则直接判定两成员不同
,hashcode()相同,则用equals()做最终判断.
-hashcode()性能好,所以用hashcode()做快筛,但是它不准确,只能判假,不能判真
,而equals()性能不好,但是准确,真假都能判.
Aa BB 两的hash值都是2112
8.调用函数时,形参的改变能否影响实参?用实验证明你的观点.
-对于基础型数据,形参改变不能影响实参.
-对于对象型数据,形参改变要看哪一种改变
,引用关系的改变无法影响实参
,内容的改变可以影响实参.
9.final的作用,尤其是修饰高级类型对象时,什么可变什么不可变?
-final修饰类,代表类不可被继承.
-final修饰方法,代表方法不可被重写.
-final修饰变量,代表变量的引用关系不可改变,内容可变.
10.排序为什么要使用比较器?比较器中重写的那个方法会被触发1次还是多次?该片段对整个排序有何作用?
-比较器内部封装了一些基础排序算法.
-基础排序算法都会有两两比对的过程,比较器开放了这一过程给开发者重写,填充业务逻辑.
-所以重写的那个方法会被触发多次.
-比较器节省了我们写基础排序算法的精力,可以使我们更加专注于业务上的多字段排序需求.
(比如员工列表,先按入职日期排序,相邻同时入职的人再按年龄排序,…)
11.stream+lambda操作中并行流的特点?什么是工作窃取机制.
工作窃取机制,是并行流中的特点,当某一个流水线没有任务时,会从其他的流水线上偷任务过来执行!
如果任务有一定的顺序要求,选择:串行流
如果任务和任务没有多大的数据影响,可以:并行流
-
并行流的适用场景:并行流适用于处理大量数据、复杂的计算或需要并行执行的操作。如果数据量较小或操作较简单,则顺序流可能更适合。
-
并行流的顺序性:并行流的处理可能是无序的,操作可能以不确定的顺序执行。因此,如果需要保持元素的顺序或依赖操作的顺序,请谨慎使用并行流
5.String/StringBuilder/StringBuffer区别,为什么日常使用StringBuilder而不担心线程安全问题?
-Stri