加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

近5年常考Java面试题及答案整理(三)

发布时间:2020-12-24 14:06:24 所属栏目:交互 来源:网络整理
导读:副标题#e# div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post" div id="content_views" class="htmledit_views" ?上一篇: 68、Java中如何实现序列化,有什么意义
副标题[/!--empirenews.page--]

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
<div id="content_views" class="htmledit_views">

?上一篇:

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

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

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

答:字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。

面试题 - 编程实现文件拷贝。(这个题目在笔试的时候经常出现,下面的代码给出了两种实现方案)

fileCopy(String source,String target) (InputStream in = (OutputStream out = [] buffer = [4096 ((bytesToRead = in.read(buffer)) != -1 out.write(buffer,0 fileCopyNIO(String source,String target) (FileInputStream in = (FileOutputStream out = FileChannel inChannel = FileChannel outChannel = ByteBuffer buffer = ByteBuffer.allocate(4096 (inChannel.read(buffer) != -1 }

注意:上面用到Java 7的TWR,使用TWR后可以不用在finally中释放外部资源 ,从而让代码更加优雅。

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

答:代码如下:

counter = 0 (FileReader fr = (BufferedReader br = String line = ((line = br.readLine()) != index = -1 (line.length() >= word.length() && (index = line.indexOf(word)) >= 0 counter++ line = line.substring(index + } }

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

答:
如果只要求列出当前文件夹下的文件,代码如下所示:

File f = File("/Users/nnngu/Downloads" }

如果需要对文件夹继续展开,代码如下所示:

showDirectory( File("/Users/nnngu/Downloads" _walkDirectory(f,0 _walkDirectory(File f, _walkDirectory(temp,level + 1 ( i = 0; i < level - 1; i++ System.out.print("t" }

在Java 7中可以使用NIO.2的API来做同样的事情,代码如下所示:

main(String[] args) Path initPath = Paths.get("/Users/nnngu/Downloads" Files.walkFileTree(initPath, SimpleFileVisitor }

72、用Java的套接字编程实现一个多线程的回显(echo)服务器。

答:

ECHO_SERVER_PORT = 6789 (ServerSocket server = System.out.println("服务器已经启动..." ( Socket client = Thread( } ClientHandler .client = (BufferedReader br = BufferedReader( PrintWriter pw = String msg = System.out.println("收到" + client.getInetAddress() + "发送的: " + } } } }

注意:上面的代码使用了Java 7的TWR语法,由于很多外部资源类都间接的实现了AutoCloseable接口(单方法回调接口),因此可以利用TWR语法在try结束的时候通过回调的方式自动调用外部资源类的close()方法,避免书写冗长的finally代码块。此外,上面的代码用一个静态内部类实现线程的功能,使用多线程可以避免一个用户I/O操作所产生的中断影响其他用户对服务器的访问,简单的说就是一个用户的输入操作不会造成其他用户的阻塞。当然,上面的代码使用线程池可以获得更好的性能,因为频繁的创建和销毁线程所造成的开销也是不可忽视的。

下面是一段回显客户端测试代码:

main(String[] args) Socket client = Socket("localhost",6789 Scanner sc = System.out.print("请输入内容: " String msg = PrintWriter pw = BufferedReader br = BufferedReader( }

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读