java面试(二)
1、实现多线程的方式以及优缺点
* 继承Thread类创建线程类
* 实现Runnable接口创建线程类
* 使用Callable和Future创建线程
通过继承Thread类或实现Runnable、Callable接口都可以实现多线程,不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已。因此可以将实现Runnable接口和实现Callable接口归为一种方式。这种方式与继承Thread方式之间的主要差别如下。
1.采用实现Runnable、Callable接口的方式创建多线程的优缺点:
优势:(1)线程类只是实现了Runnable接口与Callable接口,还可以继承其他类。
(2)在这种方式下,多个线程可以共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势:编程稍稍复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。
2.采用继承Thread类的方法创建多线程的优缺点:
劣势:因为线程类已经继承了Thread类,所以不能再继承其他父类。
优势:编写简单,如果需要访问当前线程,则无须使用Thread.currentThread()方法,直接使用this即可获得当前线程。
鉴于上面分析,因此一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。
2、有没有线程安全的list
有。Collections.synchronizedList与CopyOnWriteArrayList
3、单例有几种实现方式
* 懒汉式
* 饿汉式
* 使用静态内部类实现单例模式
* 使用枚举来实现单例
4、工厂设计模式是怎么实现的
把创建对象的工作,交给一个抽象出来的概念'工厂'去做,就是工厂设计模式。比如,你要新建一个用户对象 User user=new User();这很简单,也好理解。但是如果你用工厂设计模式去做,就算最简单的实现你也得加个类型,如:UserFactory,而里面的代码可能只是:
public static User getUser(){
return new User();
}
在使用的时候就是变成:User user = UserFactory.getUser();
工厂模式适用场景,首先得有较复杂的子父类结构,再者创建逻辑可能很复杂,这样才有意义,才有必要去使用工厂模式。又或者这个对象创建起来很消耗性能,且不是非得是全新的才能用,那么可以配合单例模式一起使用,实现对象的复用,达到性能优化的目的。
5、访问一个网址的时候会发生什么(eg:facebook.com)
浏览器查找域名的IP地址、 浏览器给web服务器发送一个HTTP请求、facebook服务的永久重定向响应、浏览器跟踪重定向地址、服务器“处理”请求、服务器发回一个HTML响应、浏览器开始显示HTML、浏览器发送获取嵌入在HTML中的对象、浏览器发送异步(AJAX)请求
6、数据库索引使用了哪种数据结构(我说B+树),为什么用B+树而不用红黑树
AVL 树和红黑树这些二叉树结构的数据结构可以达到最高的查询效率这是毋庸置疑的。既然如此,那么数据库索引为什么不用 AVL 树或者红黑树呢?这就牵扯到一个问题了,不考虑每种数据结构的前提条件而选择数据结构都是在耍流氓。
AVL 数和红黑树基本都是存储在内存中才会使用的数据结构,那磁盘中会有什么不同呢?
这就要牵扯到磁盘的存储原理了
操作系统读写磁盘的基本单位是扇区,而文件系统的基本单位是簇(Cluster)。也就是说,磁盘读写有一个最少内容的限制,即使我们只需要这个簇上的一个字节的内容,我们也要含着泪把一整个簇上的内容读完。
那么,现在问题就来了
一个父节点只有 2 个子节点,并不能填满一个簇上的所有内容啊?那多余的内容岂不是要浪费了?我们怎么才能把浪费的这部分内容利用起来呢?哈哈,答案就是 B+ 树。由于 B+ 树分支比二叉树更多,所以相同数量的内容,B+ 树的深度更浅,深度代表什么?代表磁盘 io 次数啊!数据库设计的时候 B+ 树有多少个分支都是按照磁盘一个簇上最多能放多少节点设计的啊!
AVL 数和红黑树基本都是存储在内存中才会使用的数据结构。在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。
7、平衡树有哪些
平衡树,即平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
平衡二叉树的常用算法有红黑树、AVL等。
8、在32位机和64位机中指针各占几位
32为占4个字节,64位占8个字节
求职面试题&解析