1.单例模式常见的应用场景分析。
在23种设计模式中,单例模式排行老大。虽然理解容易,但是对于应用场景。你真的熟悉么?使用单例,是由于没必要每个请求都新建一个对象,这样既浪费CPU又浪费内存;之所以多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对象状态改变导致了对象对另一个请求做了错误的处理。
先来说说Java
web中的单例应用场景:数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象。我们常用的service和Dao层的对象通常都是单例的(由于其所有的请求都用一个对象来处理),而struts中的action则是多例,由于每个请求是用一个新的对象来处理的(因为action本身含有请求参数的值,即可改变的状态)。log4j日志记录也是单例模式,因为从始至终都仅维护一个对象。(应用程序的日志应用,一般都用单例模式实现,这一般是由于共享的日志文件一直处理打开状态,因为只能有一个实例去操作,否则内容不好追加)。
2.什么是平衡二叉树?
它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
3.什么是红黑树?
红黑树是特殊的平衡二叉树。遵循红定理和黑定理。红定理:在一条路径上不能出现两个相连的红节点;黑定理:根节点必须是黑节点,而且所有节点通向树的尾端的路径上,所含的黑节点的个数必须相等。
4.什么是B树?(二插搜索树)
所有节点存储一个关键字,非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;所有非叶子结点最多拥有两个孩子。
5.什么是B-树?(多路搜索树)
根节点子树[2,m]; 非根节点非叶子节点的子树[m/2,m];每个节点的关键字数为[m/2 - 1,m-1].
6.什么是B+树?
B+树是B-树的变体,在B-树的定义之上,补充定义有:所有关键字都在叶子节点出现;所有叶子节点增加一个链指针;非叶子结点的子树与关键字个数相同。
总结:平衡二叉树是一种二插搜索树。其可以保证在log2(n)的时间内找到节点,而普通的二插搜索树在最坏情况下性能近似与链表,所用时间为log(n).红黑树用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。B树多用在内存里放不下,大部分数据存储在外存上。因为B树层数少,因此可以确保每次操作,读取磁盘的次数尽可能少。在数据较小,可以完全放倒内存中时,红黑树的时间复杂度比B树低。反之,数据量较大,外村中占主要部分时,B树因其读磁盘次数少,而具有更快的速度。
补充红黑树的由来:在查找中,虽然hash表查找非常迅速,但是随着数据种类增多,hash表长会变得更长,且冲突也会越来越多,那么如何才能实现无论在多大数据量的情况下,查找依然是高性能的呢?同时我们又知道树是很好的一种数据结构,用于插入,删除,查找等都是很高效的数据结构,但问题是在很坏的情况下,操作很费时间,它的性能得不到保证,比如二叉查找树中如果左子树与右子树相差太远,那么查找时就很费时间。这时为了保证具有高效性,就得保证左树与右树不能差的太远,当向树中插入时,就按一定规则调整,使其达到规则,从而使其整体与局部查找效率得到提高。这就是红黑树的规则。
7.final ,finally, finalize三者的区别。
finalize是一个方法,而且它是Object类中的一个方法。当垃圾收集器在确定这个对象没有被引用时调用对象的finalize方法。它的作用是为GC清理对象之前做一些必要的清理工作。(如输入输出连接的对象的finalize方法可执行显式IO事务,以便在永久对象之前中断连接)。
finally用在try,catch异常机制中,不管什么情况都会执行。
final表示类,表示不可以被继承;修饰基本数据类型,即常量不可变;修饰引用类型,指向的对象内容可变,对象不可变。
8.Error Exception RuntimeException区别。
异常机制的继承结构首先,基类为Throwable;Error和Exception继承Throwable;RuntimeException和IOException等继承Exception。
Error描述了内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。程序级别不能处理。
Exception包括RuntimeException和其他非RunableException。RuntimeException包括错误的类型转换、数组越界访问和访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问的异常。非RuntimeException(IOException等):这类异常一般是外部错误,例如试图从文件后面读取数据。这并不是程序本身的错误,而是在应用环境中出现的外部错误。
总结:比如 5 /0就是RuntimeException异常,这样的异常可以在程序里不做处理,不会报错,运行时才会出现异常。
非RuntimeException异常就是在程序里就要try catch的,不进行处理就会报错。
9.区别TCP,UDP,http,https,SFTP,FTP
TCP可靠连接,三次握手,四次挥手;
UDP不可靠链接;
HTTPS是SSL+HTTP协议构件的可进行加密传输,身份认证的网络协议。要比HTTP协议安全。它使用SSL即是安全套接字层(SSL)进行信息交换。HTTP需要申请证书,是收费的。
FTP是文件传输协议。在网站上,如果你想把文件和别人共享,最便捷的方式就是把文件上传到FTP服务器上,其他人通过FTP客户端程序下载所需要的文件。FTP进行文件传输需要通过端口进行。一般所需要的端口:控制端口-TCP端口21.控制器端,用于发送指令给服务器以及等待服务器响应。数据链路-TCP端口20.数据传输端口,用来建立数据传输通道,主要用来从客户向服务器发送一个文件,从服务器向客户发送一个文件,从服务器向客户发送文件或目录列表。FTP为了适应不同的网络环境,支持主动连接和被动连接两种模式。这两种模式都主要针对数据链路进行的,跟控制链路无关。
SFTP是Secure File Transfer Protocol的缩写,是安全文件传送协议。可以为传输文件提供一种安全的加密方法。跟FTP几乎语法功能一样。SFTP是SSH的一部分,是一种传输档案至Blogger伺服器的安全方式。它本身没有单独的守护进程,必须使用sshd守护进程来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以使用SFTP是十分安全的。但由于这种传输方式使用了加密解密技术,所以传输效率比普通的FTP要低得多。在对网络安全要求较高时,代替FTP使用。
10.Java的参数传递中,值传递和引用传递区别。
值传递的时候,传递的参数是值的拷贝传递,传递动作完成以后就没有关系了。引用传递,传递的参数是引用的地址。也就是变量所对应的内存空间的地址。这两者的区分类比C语言中的用函数交换两个数的值。
11.服务器网络编程中,解决会话跟踪有哪几种方法?
Cookie;
Session;URL重写;
cookie在J2EE项目中使用,Java中把Cookie封装成java.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象,对客户端Cookie进行操作。通过request.getCookies()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie()向客户端设置Cookie。Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。
public class CookieTest {
//服务器获取cookie
Cookie[] cookies = request.getCookies();
for(int i=0;cookies != null && i
12.Java集合框架是什么?说出一些集合框架的优点?
每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector,Stack,HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下,使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。
集合框架的部分优点如下:
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类;
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高;
(3)通过使用JDK附带的集合类,可以降低代码维护成本;
(4)复用性和可操作性;
13.集合框架中的泛型有什么优点?
Java1.5引入了泛型,所有的集合接口和实现都大量的使用它。泛型允许我们为集合提供一个可以容纳的对象类型。因此,如果你添加其他类型的任何元素,他会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码简洁,我们不需要使用显式转换和instanceOf操作符。他也给运行时带来好处,因为不会产生类型检查的字节码指令。
14.Java集合框架的基础接口有哪些?
Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。
Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。
List是一个有序集合,可以包含重复元素。你可以通过他的索引来访问任何元素。List更像一个长度动态变换的数组。
Map是一个将key映射到value的对象,一个Map不能包含重复的key,每个key最多只能映射到一个value。
一些其他的接口有:Queue,Dequeue,SortedSet,SortedSet,SortedMap,ListIterator
15.为何Collection不从Cloneable和Serializable接口继承?
Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。例如,一些如List的Collection实现允许重复的元素,而其他的如Set就不允许。很多Collection实现有一个公有的clone方法,然而,把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现,重要的是实现。
当与具体实现打交道的时候,克隆或者序列化的语义和含义才发挥作用。所以,具体实现应该决定如何对他进行克隆或者序列化,或它是否可以被克隆或序列化。
在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定他是否可以被克隆和序列化。
16.为何Map接口不继承Collection接口?
尽管Map接口和他的实现也是集合框架的一部分,但Map不是集合,集合也不是Map.因此,Map继承Collection毫无意义,反之亦然。
如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是他不适合“一组对象”规范。
17.Iterator是什么?
Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。
18.Enumeration和Iterator接口的区别?
Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要。但是与Enumeration相比,iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其他线程去修改集合。
迭代器取代了Java集合框架中的Enumeration,迭代器允许调用者从集合中移除元素,而Enumeration不能做到。为了使他的功能更加清晰,迭代器方法名已经经过改善。
19.为何没有像Iterator.add()这样的方法,向集合中添加元素?
语意不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,Listiterator没有提供add操作,他要确保迭代的顺序。
20.为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标?
它可以在当前Iterator的顶层实现,但是他用的很少,如果将它加到接口中,每个继承都要去实现它,这没有意义。
21.Iterator和ListIterator之间有什么区别?
(1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List;
(2)Iterator只可以向前遍历,而ListIterator可以双向遍历;
(3)ListIterator从Iterator接口继承,然后添加一些额外的功能,比如添加一个元素,替换一个元素,获取前面或后面元素的索引位置;
22.遍历一个List有哪些不同的方式?
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!