java面试题与回答(二)

本文深入解析了Java中TimSort的实现原理,展示了如何利用LinkedHashMap实现LRU缓存,探讨了Cloneable接口的克隆机制,并详细解释了Java异常处理机制。

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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值