前百度面试官整理的——Java后端面试题(二)

对象的四种引用java

强引用只要引用存在,垃圾回收器永远不会回收面试

clipboard.png

可直接经过obj取得对应的对象 如 obj.equels(new Object()); 而这样 obj 对象对后面 new Object 的一个强 引用,只有当 obj 这个引用被释放以后,对象才会被释放掉,这也是咱们常常所用到的编码形式。算法

软引用 非必须引用,内存溢出以前进行回收,能够经过如下代码实现后端

clipboard.png

这时候sf是对obj的一个软引用,经过sf.get()方法能够取到这个对象,固然,当这个对象被标记为须要回收的对象 时,则返回null; 软引用主要用户实现相似缓存的功能,在内存足够的状况下直接经过软引用取值,无需从繁忙的 真实来源查询数据,提高速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。数组

弱引用 第二次垃圾回收时回收,能够经过以下代码实现缓存

clipboard.png

弱引用是在第二次垃圾回收时回收,短期内经过弱引用取对应的数据,能够取到,当执行过第二次垃圾回收时, 将返回null。弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,能够经过弱引用的 isEnQueued 方法返回对象是否被垃圾回收器标记。 ThreadLocal 中有使用到弱引用,安全

clipboard.png

虚引用 垃圾回收时回收,没法经过引用取到对象值,能够经过以下代码实现性能

clipboard.png

虚引用是每次垃圾回收的时候都会被回收,经过虚引用的get方法永远获取到的数据为null,所以也被成为幽灵引 用。虚引用主要用于检测对象是否已经从内存中删除。编码

Java获取反射的三种方法spa

1.经过new对象实现反射机制2.经过路径实现反射机制3.经过类名实现反射机制

clipboard.png

clipboard.png

Java反射机制

Java 反射机制是在运行状态中,对于任意一个类,都可以得到这个类的全部属性和方法,对于任意一个对象都可以 调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。

Class 类与 java.lang.reflect 类库一块儿对反射的概念进行了支持,该类库包含了 Field,Method,Constructor 类 (每 个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时建立的,用以表示未知类里对应的成员。

这样你就可使用 Constructor 建立新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用 invoke() 方法调用与 Method 对象关联的方法。另外,还能够调用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息 就能在运行时被彻底肯定下来,而在编译时不须要知道任何事情。

clipboard.png

运行结果:无参构造器Run......有参构造器Run......Apple

Arrays.sort 和 Collections.sort 实现原理 和区别

Collection和Collections区别

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操做的通用接口方法。

java.util.Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各类集合的搜索、排序、 线程安全等操做。 而后还有混排(Shuffling)、反转(Reverse)、替换全部的元素(fill)、拷贝(copy)、返 回Collections中最小元素(min)、返回Collections中最大元素(max)、返回指定源列表中最后一次出现指定目 标列表的起始位置( lastIndexOfSubList )、返回指定源列表中第一次出现指定目标列表的起始位置 ( IndexOfSubList )、根据指定的距离循环移动指定列表中的元素(Rotate);

事实上Collections.sort方法底层就是调用的array.sort方法,

clipboard.png

clipboard.png

legacyMergeSort (a):归并排序 ComparableTimSort.sort():Timsort 排序

Timsort 排序是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法

Timsort的核心过程

TimSort 算法为了减小对升序部分的回溯和对降序部分的性能倒退,将输入按其升序和降序特色进行了分 区。排序的输入的单位不是一个个单独的数字,而是一个个的块-分区。其中每个分区叫一个run。针对这 些 run 序列,每次拿一个 run 出来按规则进行合并。每次合并会将两个 run合并成一个 run。合并的结果保 存到栈中。合并直到消耗掉全部的 run,这时将栈上剩余的 run合并到只剩一个 run 为止。这时这个仅剩的 run 即是排好序的结果。

综上述过程,Timsort算法的过程包括

(0)如何数组长度小于某个值,直接用二分插入排序算法

(1)找到各个run,并入栈

(2)按规则合并run

前百度面试官整理的——Java后端面试题(三)

相关文章
相关标签/搜索