有幸参加了腾讯的实习生面试,在一个高大上的艾丽华酒店里, 面试官很nice,将相关问题整理如下:
Java泛型实例化?
java 泛型对象能实例化吗T t=new T(),不能。因为在编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,自然就不行了 。
Java GC
- GC算法:引用计数、标记-清除、拷贝收集、标记-整理收集、
- Java采用根搜索算法。基本思想就是:从一个叫GC Roots的对象开始,向下搜索,如果一个对象不能到达GC Roots对象的时候,说明它已经不再被引用,即可被进行垃圾回收
HashMap结构,如何解决hash冲突
- HashMap是根据散列函数来实现。适用于在Map中插入、删除和定位元素。
- TreeMap是根据红黑树来实现的。适用于按自然顺序或自定义顺序遍历键(key)
链表求倒数第k个
环形链表判断,找出交合点。并证明思路。
双指针思路。
证明:根据信息列出2个方程即可求解。slow指针走的距离是fast指针走的距离的一半;fast指针比slow指针多走一圈。排序时间复杂度比较以及应用场景
快排 vs 归并 vs 堆排序
Java 包装类vs原始类
原始类性能比较好,包装类提供了一些方法可以使用,可以为null,而原始类一般初始化为0或者“”,不初始化为null。
集合类中的sort内部实现使用哪种排序算法?
java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序。
- 快速排序主要是对哪些基本类型数据(int,short,long等)排序
- 合并排序用于对对象类型进行排序。
- 原因
使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。对于基本数据类型,稳定性没有意义,而对于对象类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一直;
另外一个原因是由于合并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。补充一点合并排序的时间复杂度是n*logn, 快速排序的平均时间复杂度也是n*logn,但是合并排序的需要额外的n个引用的空间。
Java8.0新特性?
1、接口默认方法
2、lambda表达式Java引用类型
- 强引用(Strong Reference).就是为刚被new出来的对象所加的引用,它的特点就是,永远不会被回收。
- 软引用(Soft Reference).声明为软引用的类,是可被回收的对象,如果JVM内存并不紧张,这类对象可以不被回收,如果内存紧张,则会被回收。(缓存)。
- 弱引用(Weak Reference).弱引用的对象就是一定需要进行垃圾回收的,不管内存是否紧张,当进行GC时,标记为弱引用的对象一定会被清理回收。
- 虚引用(Phantom Reference).虚引用弱的可以忽略不计,JVM完全不会在乎虚引用,其唯一作用就是做一些跟踪记录,辅助finalize函数的使用。
个人感悟:
对于了解的东西不能停留在表面,不仅要会用、用好,更重要的是要从原理上去吃透,这样才能以不变应万变,立于互联网浪潮之中。
二面过程:
由于项目跟投的IOS客户端半点关系都没有,面试官直接呵呵了,15分钟结束面试。问了点基本的算法相关知识,直接看简历,都没自我介绍。
写冒泡排序 ,如何改进冒泡排序
- 记录交换次数,如果一趟排序交换次数为0,则退出循环,数组已经有序。或者标志位。
- 记录每一次元素交换的位置,当元素交换的位置在第0个元素时,则排序结束。
4亿数字中找出不重复的数字。
数组A大小为n-1,存放1-n之间的数字,数字没有重复,求数组A中1-n没有出现的数字。若n很大,为4亿呢?
数据库性能、并发性测试,如何查看
教训:投递岗位一定要跟自己的项目有点关系,否则面试官根本不会看你的项目,自己展示的东西就比较少。悲剧。。。