您的当前位置:首页正文

Java开发人员面试题分析汇总(持续更新中)

2024-11-30 来源:个人技术集锦

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需要申请证书,是收费的。



SFTP是Secure File Transfer Protocol的缩写,是安全文件传送协议。可以为传输文件提供一种安全的加密方法。跟FTP几乎语法功能一样。SFTP是SSH的一部分,是一种传输档案至Blogger伺服器的安全方式。它本身没有单独的守护进程,必须使用sshd守护进程来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以使用SFTP是十分安全的。但由于这种传输方式使用了加密解密技术,所以传输效率比普通的FTP要低得多。在对网络安全要求较高时,代替FTP使用。


10.Java的参数传递中,值传递和引用传递区别。


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<cookies.length;i++){
		Cookiecookie = cookies[i]l
				if("username".equals(cookie.getName())){}
	}
}

//服务器端设置cookie
String username = "";
Cookie usernameCookie = new Cookie("username",username);
response.addCookie(usernameCookie);


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主页:  。欢迎大家访问!

















显示全文