面试总结。。。。待续写

来源:互联网 发布:莫知我哀 莫的意思 编辑:程序博客网 时间:2024/05/22 04:37

面试的基础问题:

1.HashMap的实现原理,怎么扩容。扩容的内部机制是什么?

这里贴一下在java开发里的一些公约:

关于hashCode方法,一致的约定是:

重写了euqls方法的对象必须同时重写hashCode()方法。

如果2个对象通过equals调用后返回是true,那么这个2个对象的hashCode方法也必须返回同样的int型散列码

如果2个对象通过equals返回false,他们的hashCode返回的值允许相同。(然而,程序员必须意识到,hashCode返回独一无二的散列码,会让存储这个对象的hashtables更好地工作。)

这里有一个更正式版的:翻译于google

第一:在某个运行时期间,只要对象的(字段的)变化不会影响equals方法的决策结果,那么,在这个期间,无论调用多少次hashCode,都必须返回同一个散列码。

第二:通过equals调用返回true 的2个对象的hashCode一定一样。


第三:通过equasl返回false 的2个对象的散列码不需要不同,也就是他们的hashCode方法的返回值允许出现相同的情况。

总结一句话:等价的(调用equals返回true)对象必须产生相同的散列码。不等价的对象,不要求产生的散列码不相同。

hashMap 工作流程:

调用hashMap 的hashcode方法  计算该对象的hashcode值,,根据该hashcode值,决定该对象在hashMap中的存储位置,

如果两个元素通过equals返回时true,但他们的hashcode值不同,则会存储在不同的地方。

如果两个元素的hashcode值相同,equals不同,则会造成冲突。(这样不好,会在该位置做一个链表,用尾插法插入新元素)

取值:根据get() 根据指定的key值。返回对应的value 此方法调用了getEntry(Object key)得到相应的entry.然后返回entry.getValue();

  哈希表的阈值 一开始等于16,此时table表为空{},当里面装填了数据以后,阈值为16*loadSize(16*3/4) =12.这里的阈值是用来判断,如果装填数据的数量大于它,那么可以开始扩容,为原来表长的两倍。扩容需要复制当前数据,会增加很大的开销。

2.常用设计模式工厂模式,简单说下它的基本情况

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

两者皆可。

观察者模式。

3.Wait 和sleep的区别。

答:wait 是object类下的方法,sleep是线程里的,占着cpu在睡觉,没有出让出cpu资源  ,没有释放锁,而wait释放了锁。在明确多少时间后肯定会继续运行,而wait是cpu阻塞了,不一定会运行。

sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。sleep可以在任何地方使用,wait,notify,notifyAll只能在同步代码块,或者同步控制方法里进行。

4.算法题单链表的逆序。


0 0
原创粉丝点击