java面试每日十题(七)

版权声明:欢迎来玩呀~ https://blog.csdn.net/Javaxiaobaismc/article/details/82870447

61、启动一个线程是调用run()还是start()方法?

答:启动线程用的是start()方法。当调用start()方法启动一个线程时,线程进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行而不是这个线程就会立即运行。当CPU分配给它时间时,才开始执行run()方法,run()方法中包含的是线程的主体,必须要重写的,无返回值。

 


62、什么是线程池(thread pool)?

答:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

 


63、线程的基本状态以及状态之间的关系?

答:1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3.阻塞(BLOCKED):表示线程因为某些原因放弃CPU,暂时停止运行。线程处于这个状态时,JVM不会分配CPU给线程,直到线程重新进入就绪状态才有机会获得运行。
4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。 6. 终止(TERMINATED):表示该线程已经执行完毕,或者遇到了未捕获的异常,就会退出run()方法,线程结束生命周期。

 


64、简述synchronized 和java.util.concurrent.locks.Lock的异同?

答:synchronized 是Java 语言层面的,是内置的关键字;Lock 则是JDK 5中出现的一个包,Lock 能完成synchronized所实现的所有功能并有一些后者不具备的功能,如锁投票、定时锁等候、可中断锁等候等;Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且最好在finally 块中释放(这是释放外部资源的最好的地方)。 

 

 

65、Java中如何实现序列化,有什么意义?

答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识型接口,用来标注该类对象是可以被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject方法来实现对象写出;如果需要反序列化就用输入流来建立对象输入流然后通过readObject方法从流中读取对象。序列化除了能够实现对象额持久化之外,还可以用于对象的深度克隆。

 


66、Java中有几种类型的流?

答:字节流(byte)和字符流(char)。字节流:InputStream、OutputStream;字符流:Reader、Writer。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。

 

 

67、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

答:

 

 

68、如何用Java代码列出一个目录下所有的文件?

答:

 


69、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

答:XML文档定义分为DTD和Schema两种形式,二者都是对XML语法的约束,其本质区别在于Schema本身也是一个XML文件,可以被XML解析器解析,而且可以为XML承载的数据定义类型,约束能力较之DTD更强大。对XML的解析主要有DOM(文档对象模型,Document Object Model)、SAX(Simple API for XML)和StAX(Java 6中引入的新的解析XML的方式,Streaming API for XML),其中DOM处理大型文件时其性能下降的非常厉害,这个问题是由DOM树结构占用的内存较多造成的,而且DOM解析方式必须在解析文件之前把整个文档装入内存,适合对XML的随机访问(典型的用空间换取时间的策略);SAX是事件驱动型的XML解析方式,它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理XML文件,适合对XML的顺序访问;顾名思义,StAX把重点放在流上,实际上StAX与其他解析方式的本质区别就在于应用程序能够把XML作为一个事件流来处理。将XML作为一组事件来处理的想法并不新颖(SAX就是这样做的),但不同之处在于StAX允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。

 


70、你在项目中哪些地方用到了XML?

答:XML的主要作用有两个方面:数据交换和信息配置。在做数据交换时,XML将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收者解密与解压缩后再从XML文件中还原相关信息进行处理,XML曾经是异构系统间交换数据的事实标准,但此项功能几乎已经被JSON(JavaScript Object Notation)取而代之。当然,目前很多软件仍然使用XML来存储配置信息,我们在很多项目中通常也会将作为配置信息的硬代码写在XML文件中,Java的很多框架也是这么做的,而且这些框架都选择了dom4j作为处理XML的工具,因为Sun公司的官方API实在不怎么好用。

猜你喜欢

转载自blog.csdn.net/Javaxiaobaismc/article/details/82870447