查看原文
其他

Java基础篇——Java开发面试题6期

素文宅博客 Java精选 2022-08-09


Java面试前需要做足各方面的准备工作,肯定都会浏览大量的面试题,本人也不例外,通过浏览面试题和以往的面试经历,总结了从初级到中级以及高级的面试题,供大家学习讨论。


排序都有哪几种方法?请列举。口述用JAVA实现快速排序。

点击下方空白区域查看答案解析!

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序)快速排序的伪代码。


//使用快速排序方法对a[0:n-1]排序

从a[0:n-1]中选择一个元素作为middle,该元素为支点

把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点

递归地使用快速排序方法对left进行排序

递归地使用快速排序方法对right进行排序

所得结果为left+middle+right

MVC的各个部分都有那些技术来实现?如何实现? 

点击下方空白区域查看答案解析!

MVC 是Model-View-Controller的简写。

"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), 

"View" 是应用的表示面,用于与用户的交互(由JSP页面产生),

"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。


这些组件可以进行交互和重用。model层实现系统中的业务逻辑,view层用于与用户的交互,controller层是model与view之间沟通的桥梁,可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

点击下方空白区域查看答案解析!

有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法。


反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状 态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说, 如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

点击下方空白区域查看答案解析!

字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。

java中会存在内存泄漏吗,请简单描述。

点击下方空白区域查看答案解析!

的确存在Java的内存泄漏, 并且事态可以变得相当严重。


Java garbage collector自动释放哪些内存里面程序不在需要的对象,以此避免大多数的其他程序上下文的内存泄漏。但是Java应用程序依旧会有相当的内存泄漏。查找原因会十分困难。


有两类主要的Java内存泄漏:


非必要的对象引用

Java代码常常保留对于不再需要的对象引用,并且这组织了内存的垃圾收集器的工作。Java对象通常被其他对象包含引用,为此一个单一对象可以保持整个对象树在内存中,于是导致了如下问题: 

1)在向数组添加对象以后遗漏了对于他们的处理

2)直到你再次使用对象的时候都不释放引用。比如一个菜单指令可以插件一个对象实例引用并且不释放便于以后再次调用的时候使用,但是也许永远不会发生。

3)在其他引用依然需要旧有状态的时候贸然修改对象状态。比如当你为了在一个文本文件里面保存一些属性而使用一个数组,诸如"字符个数"等字段在不再需要的时候依然保留在内存当中.

4)允许一个长久执行的线程所引用的对象。设置引用为NULL也无济于事,在线程退出和空闲之前,对象不会被收集释放 


未释放的系统资源

Java方法可以定位Java实例意外的堆内存,诸如针对视窗和位图的内存资源。Java常常通过JNI(Java Native Interface)调用C/C++子程序定位这些资源。

垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

点击下方空白区域查看答案解析!

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。


垃圾回收器可以马上回收内存。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

什么是java序列化,如何实现java序列化?

点击下方空白区域查看答案解析!

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。


序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

内部类可以引用他包含类的成员吗?有没有什么限制?

点击下方空白区域查看答案解析!

一个内部类对象可以访问创建它的外部类对象的内容。


内部类如果不是static的,那么它可以访问创建它的外部类对象的所有属性。


内部类如果是sattic的,即为nested class,那么它只可以访问创建它的外部类对象的所有static属性。


一般普通类只有public或package的访问修饰,而内部类可以实现static,protected,private等访问修饰。


当从外部类继承的时候,内部类是不会被覆盖的,它们是完全独立的实体,每个都在自己的命名空间内,如果从内部类中明确地继承,就可以覆盖原来内部类的方法。

推荐阅读

 

Java基础篇——Java开发面试题5期

Java基础篇——Java开发面试题4期

Java基础篇——Java开发面试题3期

Java基础篇——Java开发面试题2期

Java基础篇——Java开发面试题1期

Spring基础篇——DI/IOC和AOP原理初识

微框架Spring Boot使用Redis如何实现Session共享

SpringMvc框架MockMvc单元测试注解及其原理分析


更多推荐↓↓↓
 

Java精选

关注微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存