面试小结
2016-01-26 10:41
225 查看
面试小结
J***A部分
Q: ArrayList是怎么实现的?A: ArrayList实际是实现List接口,底层用数组来保存元素。其基本操作是对数组的操作。基本添加删除操作与数组没有区别,只是在添加到大于临时保存元素的数组时,要对保存元素的数组进行扩容。此外,对于插入操作,将index位置后的所有元素均往后移一位,而后将数据存入。
Q: J***A的泛型与CPP的模板有什么区别?
A: 泛型是JDK1.5引入的新特性,其与CPP的区别如下:
首先,J***A中的泛型不能接受基本类型作为类型参数,即List<int>是错误的写法,应该写成List<Integer>。
其次在 C++ 模板中,编译器使用提供的类型参数来扩充模板,因此,为 List<A> 生成的 C++ 代码不同于为 Lis<B> 生成的代码,List<A> 和 List<B> 实际上是两个不同的类。而 Java 中的泛型则以不同的方式实现,编译器仅仅对这些类型参数进行擦除和替换。类型 ArrayList<Integer> 和 ArrayList<String>的对象共享相同的类,并且只存在一个 ArrayList类。
此外,在编写代码时,CPP中可以直接调用模板类一个具体的方法,只要实例化类中存在此方法则不会报错,而J***A中不能直接调用泛型的具体方法。
Q: 泛型的实现原理?
A: 泛型的实现原理是类型擦除(type erasure)。J***A是伪泛型,在编译期间,所有的泛型信息都会被擦除掉。当泛型信息被擦除,编译器会使用其限定的类型对泛型进行替换,而没有被限定的则采用Object类替换。
实例:
//泛型定义 class Pair { private T value; public T getValue() { return value; } public void setValue(T value) { this.value = value; } } //原始类型形式 class Pair { private Object value; public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } }
操作系统部分
Q:进程和线程的区别。A:进程是系统资源分配的最小单位,线程是操作系统调度的最小单位。线程只拥有少量的资源的,其调度上下文切换速度远快于进程。
Q:什么时候用进程,什么时候用线程。
A:一般来说,多线程能更好的提高程序的并发度,提高CPU的利用率。但是多线程在处理中断问题时会出现一个中断导致所有线程都阻塞的情况,因此程序中存在大量中断时用多进程效率会更高。此外,多核系统中线程可以很好的利用资源,提高并发度,但是在多机系统中线程不再适用,所以在多机系统中应该用多进程提高效率。
Q:简单说一说操作系统的内存管理。
A:内存管理是操作系统的一个基本功能,一般为了避免内存碎片会采用分页、分段或者段页式来管理内存单元。此外还设计到虚拟地址的计算,根据虚拟地址计算实际地址。虚拟内存的运用,以及写入写出算法。
算法部分
n级台阶,每次可以走一级或者两级,总共有多少种走法?实例:如果是1级台阶,则有1种走法;2级台阶则有2种走法,分别是:1-1,2;3级台阶则有3种走法,分别是1-1-1,1-2,2-1。
此题显然用递归分析较为合适,假设到n级台阶有f(n)种走法,而到第n级台阶可以是跨1步走到,也可以是跨2步走到,跨一步走到的话,就是走到了n-1级台阶,共有f(n-1)种方法;跨两步走到的话,就是走到了n-2级台阶,共有f(n-2)种方法。所以递推关系如下:
f(1) = 1
f(2) = 2
f(n) = f(n-1) + f(n-2); n>2
具体实现代码如下:
[code]def fun(n): if n == 0: print "Invalid inpute" return 0 if n==1: return 1 if n==2: return 2 return fun(n-1)+fun(n-2)
考虑递归的效率问题,可以将此递归算法改写为迭代算法:
[code]def fun(n): if n == 0: print "Invalid inpute" return 0 if n==1: return 1 if n==2: return 2 a = 1 b = 2 result = 0 for i in range(3,n+1): result = a + b a = b b = result return result
相关文章推荐
- 【转】程序员为什么跳槽
- 黑马程序员 贪心法则的应用及简单理解
- 黑马程序员 一位数组的基本知识总结
- 技术人员的疆域
- 黑马程序员 NSlog和printf的区别
- 黑马程序员 OC中的block的基础理解
- java事务的类型——面试被问到
- 在开源“集市”工作时如何建立一个职业网络
- 怎样实现由专有环境向开源环境的职业转变
- 一次神秘而有趣的面试,让我进了 Google!
- 转:迅雷亲历面经:笔试+上机+面试(完整JAVA面试题求解大讨论)
- 一个PHP程序员应该掌握的10项技能!
- 一个PHP程序员应该掌握的10项技能!
- 书评-程序员修炼之道-从小工到专家
- 从张帅进入八强来谈程序员的苦恼
- LeetCode17. Letter Combinations of a Phone Number可能是世界上最简明的解法了
- 黑马程序员- IO流(下)
- 阿里面试总结--JAVA
- Java基础面试题笔记(3)
- 程序员必备的网站之Tutorialspoint