1.Arrays.sort 实现原理和 Collections.sort 实现原理
Collections.sort底层其实调用的是List.sort,List.sort调用了Arrays.sort。
Arrays.sort如下:
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
legacyMergeSort(a):归并排序 --------大神的提醒,这个方法已经废弃了不用管他。。。
也就是说Arrays.sort调用的TimSort, ------源码上的注释说了这个方法是Tim为python写的sort方法,被借鉴到这里称之为TimSort。也就是说,Arrays.sort,Collections.sort的底层实现均是TimSort。
Timsort参考大佬的博客-点我跳转
Timsort排序是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法。
2.LinkedHashMap的应用
基于LinkedHashMap,可以实现LRU(LeastRecentlyUsed,最少最近使用)缓存,需要重写removeEldestEntry方法。LinkedHashMap内部维护了一个双向链表,默认的顺序为插入顺序。开启访问顺序时(构造函数第三个参数设置ture),每次将最近调用的键值对,放在链表最后,当链表长度大于阈值时,LRU会删除最少使用(链表头)的数据。
LRU简单的实现
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Iterator;
public class LRUCache<K,V> extends LinkedHashMap<K,V>
{
private int cacheSize;
public LRUCache(int cacheSize){
super(16,0.75f,true);
this.cacheSize = cacheSize;
}
@Override
public boolean removeEldestEntry(Map.Entry<K,V> eldest){
return size()>cacheSize;
}
public static void main(String[] args)
{
LRUCache<String,Integer> cache = new LRUCache<>(3);
cache.put("qw",2019);
cache.put("dhf",1420);
cache.put("sdf",1233);
cache.put("qw",2017);
cache.get("dhf");
cache.put("jgkk",546546);
Iterator<Map.Entry<String,Integer>> it = cache.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String,Integer> entry = it.next();
System.out.println(entry.getKey()+","+entry.getValue());
}
}
}
3. cloneable接口实现原理
目前没有查到比较贴合的回答,我就献丑了,啊哈哈哈。
实现对象的克隆,需要实现接口Cloneable,并重写Object类的clone方法。cloneable只是个标识接口,没有方法体实现。
public interface Cloneable{}
调用重写的clone才能完成克隆,Object的clone方法:
protected native Object clone() throws CloneNotSupportedException;
Object类的clone方法是个本地方法,因此这里方法体是空的。本地方法的方法体在JVM中C实现的。Object类中的clone方法只是个浅拷贝,非基本类型的引用,在原对象上下修改会影响克隆对象的属性,如下clone重写就是浅拷贝:
@Override
public Object clone() throws CloneNotSupportException{
return super.clone();//调用默认实现的clone方法
}
要实现深拷贝需要将属性也克隆一下(生成新的实例对象),如下就是深拷贝(假设类名为Test,类成员变量为String类型的str):
@Override
public Object clone() throws CloneNotSupportException{
Test t1=(Test)super.clone();
t1.str = new String(this.str);
}
4.异常分类以及处理机制
异常分类:error和exception继承自父类Throwable.其中exception进一步可以分为运行时异常RuntimeException和非运行期异常Checked Exception.运行时异常一般包括NullPointerException、IndexOutOfBoundsException等。非运行期异常必须被捕获处理。
处理机制:
1.捕获异常:try-catch-finally
2.声明抛出异常,交给调用者处理throws或者在方法中抛出异常throw。
本文深入解析了Java中TimSort的实现原理,展示了如何利用LinkedHashMap实现LRU缓存,探讨了Cloneable接口的克隆机制,并详细解释了Java异常处理机制。
2238

被折叠的 条评论
为什么被折叠?



