1. 从哈希表,二叉树和链表中取元素需要多少时间?如果你有数百万记录呢?
哈希表需要O(1)时间,二叉树需要O(logN) (N是树中节点数),链表需要O(N) (N是链表中节点数)。如果数据结构工作正常(比如哈希表没有或只有相对少量冲突,二叉树是平衡的),数百万记录并不影响效率。如果工作不正常,那么效率会随着记录数上升而下降。
2. 覆盖(Overriding)和重载(Overloading)的区别是什么?
覆盖在运行时决定,重载是在编译时决定。并且覆盖和重载的机制不同,例如在Java中,重载方法的签名必须不同于原先方法的,但对于覆盖签名必须相同。
3. fork一个进程和生成一个线程有什么区别?
当你fork一个进程时,新的进程将执行和父进程相同的代码,只是在不同的内存空间中。但当你在已有进程中生成一个线程时,它会生成一个新的代码执行路线,但共享同一个内存空间。
4. 什么是临界区?
临界区是一段代码,十分重要,在多线程中同一时间只能被一个线程执行。可以用信号量或互斥量来保护临界区。在Java中你可以用synchronized关键字或ReentrantLock来保护临界区。
5. 值类型和引用类型有什么区别?
值类型是更加优化的类型,总是不可变的(immutable),例如Java原始的int、long、double和float。引用类型指向一个对象,可能是可变的,也可能是不变的。你也可以说值类型指向一个值,引用类型指向一个对象。
6. 什么是在进程中的堆和栈?
在同一个进程中,有两块不同的内存区域。以Java来说,栈用来存储原始值和指向对象的引用类型,但对象本身总是在堆中被创建。堆和栈的一个重要区别是,堆内存被所有线程共享,但每个线程有自己的栈。
7. 什么是版本控制?
版本控制是用来存储代码和管理代码库版本的软件,例如SVN、CVS、Git、Perforce和ClearCase。它们在对比代码、审查代码和从之前的稳定版本构造时十分高效。所有的专业开发都使用某种版本控制工具,否则你无法有效的管理代码,尤其是如果有20个开发者在同一个代码库上工作的时候。版本控制工具在保持代码库一致性和处理代码冲突上扮演着十分重要的角色。
8. 什么是强类型程序设计语言?
在强类型语言中,编译器确保类型的正确性,例如你无法在String类型中存放数字,反之亦然。Java是强类型语言,因此存在各种数据类型(如int、float、String、char、boolean等)。你只能将兼容的值存入相应的类型中。
与此相反,弱类型语言不要求在编译时进行类型检查,它们根据上下文处理值。Python和Perl是两个常见的弱类型程序设计语言的例子,你可以将数字组成的字符串保存在数字类型中。