看他死皮赖脸跟在后面没有要走的意思,也索性由他去了。
打开门,W先森跟自己家一样,关了门,而且还检查了一下门关的严实不严实,检查完之后,打量着房间,踱步到沙发前,坐了下来,扫了一下桌子,懒洋洋地说:“不给我倒杯水吗?你就是这样招待客人的吗?”
我看了看桌子瞥了眼他,笑道:“我大包小包风尘仆仆过来住的酒店,哥哥,还能带着吃的喝的吗?”
“那水总有吧?妹妹?”
“没有,他这壶不知道多少人用过了,我不想用。”
“那你给我找个啥喝行吗?刚喝完酒,嗓子疼。”他往后一仰,寻了个舒适的位置,扶着额头,食指轻点太阳穴。
“啊?那我下去给你买点儿吧,你想喝什么?”我站到他面前。
“算了,别下去了,你出去万一找不回来咋办?”
“没事,我自己想喝,顺便给你带,别想太多,你喝什么?”
“那你看着买吧。”他嗤笑,好似看穿了我的掩饰和局促。
我按电梯下楼,脚步软绵绵的,像踩在棉花上,一切都像一场梦,我在脑海里设想过很多再次见面的场景,没想到在我毫无准备的时候就匆匆见了,晃了晃脑袋,走进商店,看到五颜六色琳琅满目的饮料,我不知道该选什么,谁让我是个天秤座呢,选择恐惧症,如果选不了要不都不买,要不全买了,这种情况下,明显只能选择后者咯,想了想先拿了一瓶农夫山泉,想了想他好像喜欢喝茉莉蜜茶,我喜欢茉莉清茶,一样一瓶,对了,他好像喝了酒,买个酸奶吧,喝了酒是不是得头疼,还是再那个维生素饮料吧,不知不觉,怀里已经搂了一大堆了,付了账回去,我也是一天没喝水了,打开茉莉清茶,边走边喝,进屋把东西往他面前一放。
“你咋买了这么多,有钱人就是不一样啊。”
“喝吧,喝完早点儿走吧,我困了,想早点儿睡觉了。”
他刚拧开瓶盖,喝了一口,听见我说的话,放下饮料,不满道:“你这是撵我呢?这么不欢迎我。本来还想着说我现在在做面试官,也面试了不少人,想看看帮你看看简历,再给你说说重点知识呢,哎呀,主人既然赶人了,那我也不得不走啊。”
话虽这样说,但是他连一点儿要走的意思都没有。
“怎么会呢?我这刚刚喝了口茶,忽然就精神了好多,一点儿睡意也没有。我们快开始吧。”我眨巴着眼睛,装作无辜的样子。
他也不搭理我,我赶忙上前又拿了一瓶饮料献殷勤。
可他根本不理我这茬,“我这瓶还有呢。”
“那...我们从哪儿开始呢?”
“你站这儿?”我赶紧继续坐到我的落地窗上。
“那先给你圈一下重点吧,你好好听啊。”
“好的呢,郑老师。”
“其实也没啥重点知识,首先你要知道集合框架都有哪些?”半天没动静,问:“问你呢?”
“啊,问我啊,有List、Map、Set,list有ArrayList和li,map有hashmap、treemap、hashtable,set有hashset、treeset、sortedset。”
“嗯,可以。那你知道ArrayList和li的区别吗?”
“对于随机访问get和set(查询方法),ArrayList优于Li,因为Li要移动指针。对于新增和删除操作add和remove,Li比较占优势,因为ArrayList要移动数据。ArrayList底层是数组实现的,li底层是双链表。ArrayList线程不安全,效率高;li线程安全,效率低。”这个很基础,我还是知道的。
“答得挺好的嘛。”他微微一笑,“下一个,hashmap和hashtable的区别呢?”
“HashMap和Hashtable都实现了Map接口主要的区别有:线程安全性,同步synization,以及速度。HashMap可以接受为null的键值key和值value,而Hashtable则不行。HashMap是非syable是synized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable,Java 5提供了tHashMap,它是HashTable的替代,比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的eor迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出odifiEx,但迭代器本身的remove()方法移除元素则不会抛出odifiEx异常。由于Hashtable是线程安全的也是synized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。HashMap不能保证随着时间的推移Map中的元素次序是不变的。
hashMap和Hashtable的区别都实现了Serializable接口,都支持序列化,实现了eable接口,能被克隆。 HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。 HashMap扩容时是当前容量翻倍,Hashtable扩容时是容量翻倍+1 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用t并发包下的tHashMap。HashTable是线程安全的。 HashMap中key和value都允许为null。在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 Hashtable 的键值都不能为null。”
“可以啊,小脑瓜可以记这么多东西,有点儿东西啊。”他一眼不眨看着我,继续问:“hashmap底层的实现原理呢?”
“HashMap是Map接口的实现类,键值对存储,并允许null作为键的值,线程不安全,即方法为非同步方法。jdk7.0中的HashMap采用数组+链表形式进行存储,但是如果一个数组对应的链表长度过大时,通过key进行查询时效率较低;为了提高效率,jdk8.0中HashMap最大的优化亮点就在于采用了数组+链表+红黑树的存储方式。jdk8.0的HashMap 底层结构依然是一个数组(默认长度为16)也称为哈希表,同样的数组元素是一个单向的链表,每一个数组存储的元素代表的是每一个链表的头结点;一个链表长度>=8,数组的长度不小于 64 时,会将此链表转换为红黑树的存储方式。”我内心还是有点儿开心的,劳资背了那么久,还算是有点儿用呢。
“可以,mysql隔离级别呢?有几种?”
“四种,读提交,读未提交,重复度,可串行化。”
“这个很简单吧,其实面试也就很简单的。乐观锁悲观锁知道吗?”
“乐观锁ized、ReentrantLock。”
“那synized和lock你知道有什么区别吗?”
“Loized 所能实现 Loized 线程有更直观的语义和更好的性能。 Lock 是重入锁,即一个线程可以多次获取同一个锁,重入锁的性能相对 synized 较高;不过从 JDK6.0开始,JDK 在 synized 做了大量的优化,使得两者性能差距缩减。Lolock()方法在 finally 中手动释放锁标记;而 synized 可以自动释放锁标记。”
“死锁要怎么处理?”
“改变加锁的顺序,利用 Lock 中的 tryLock()方法试图获取锁标记,尽可能避免锁的嵌套使用。”
“内存模型知道吗?”
“嗯......”我冥思苦想半天,忘记了,这个太难背了,“我记不起来了。”
他嘴角微扬,反而比刚才更高兴,“虚拟机栈:描述的是 java 方法执行的内存模型,每个方法被执行的时候,都会创建一个“栈帧”用于存储局部变量,操作栈,方法出口等信息。每个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同,是线程私有的。堆内存:也叫 java 堆,CG 堆。是 JVM 中所管理的内存中最大的一块内存区域,是线程共享的,在 JVM 启动时创建。存放了对象的实例及数组。方法区:用于储存虚拟机加载的类信息,常量,静态变量,是各个线程共享的内存区域运行时常量池:方法区的一部分,Class 文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。”他顿了顿,“我能抽根烟吗?”
“不能。一会儿就睡觉了,一股烟味没法睡。”
他还是自顾自地拿了根烟点着了,“我就抽一根。”他抽了两口,继续说:“程序计数器是最小的一块内存,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,异常处理,线程恢复等基础功能都需要依赖计数器完成。直接内存:直接内存并不是虚拟机内存中的一部分,也不是 JVM 规范中定义的内存区域。jdk1.4中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分配堆外内存,即本机内存,不会影响到对内存的大小。设计模式你都知道哪些?”
“单例模式,多例模式,工厂模式,适配器模式,代理模式。”
“嗯,你知道单例模式有哪几种吗?”
本站域名已经更换为m.adouyinxs.com 。请牢记。