Java中经典的面试题

DogJay 2018-08-21 后端技术 92人已围观

 **1. 8种基本数据类型**



    java四类八种基本数据类型

    第一类:整型 byte(1字节8位) short(2字节16位) int(4字节32位) long(8字节64位)

    第二类:浮点型 float(4字节32位) double(8字节64位)

    第三类:逻辑型 boolean(它只有两个值可取true false)【1字节8位】

    第四类:字符型 char(2字节16位)

    在栈中可以直接分配内存的数据是基本数据类型。

    引用数据类型:是数据的引用在栈中,但是他的对象在堆中。

**2.23种设计模式**





创建型模式,共五种:

        工厂方法模式【核心工厂不在负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂的角色,仅仅负责具体工厂类必须实现的接口,不接触细节】、

        抽象工厂模式【】、单例模式【一个类只有一个实例,而且自行的向整个系统提供这个实例】、

        建造者模式、

        原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。



**3.继承和重载的区别**



Java的继承是子类对象继承父类对象的成员属性和成员方法,只允许单继承。

在继承的过程中可以实现方法的重写,即子类定义一个方法,覆盖从父类那里继承来的同名的方法。每当子类对象调用该方法时都是子类自己定义的方法,只有使用super关键字或父类名为前缀时,才会调用父类原来的方法。方法覆盖时,子类应与父类有完全相同的方法名,返回值类型和参数列表,子类中的覆盖方法不能使用比父类中被覆盖的方法更严格的访问权限。

方法重载要求有两个或多个方法名相同,只是方法参数列表不同的方法,它对返回值类型没有限定。





**4.abstract class和interface的区别**



在java中不允许一个类继承多个多个父类,但是要实现“一个类继承多个类的功能”就可以用接口,一个类实现多个多个接口从而间接实现多重继承。

从本质上讲,接口也是是一种抽象类。这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

多个无关的类可以实现同一个接口。一个类可以实现多个无关的接口。与继承关系类似,接口与实现类之间存在多态性。

java提供的接口都在相应的包中,通过引入包可以使用java提供的接口。也可以自己定义接口,一个java源文件就是由类和接口做成的。



**5.Java中作用域**





**6.Java中final,finalize和finally的区别**



*final*关键字可以用于类,方法,变量前,用来表示该关键字修饰的类,方法,变量具有不可变的特性。

(1)final关键字用于基本数据类型前:这时表明该关键字修饰的变量是一个常量,在定义后该变量的值就不能被修改。

(2)final关键字用于方法声明前:这时意味着该方法时最终方法,只能被调用,不能被覆盖,但是可以被重载。

(3)final关键字用于类名前:此时该类被称为最终类,该类不能被其他类继承。

*finalize*方法来自于java.lang.Object,用于回收资源。

可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。

在实际应用中,不要依赖使用该方法回收任何短缺的资源,这是因为很难知道这个方法什么时候被调用。

*finally*

当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行。假如我们打开了一个文件,但在处理文件过程中发生异常,这时文件还没有被关闭,此时就会产生资源回收问题。对此,java提供了一种好的解决方案,那就是finally子句,finally子句中的语句是一定会被执行的,所以我们只要把前面说的文件关闭的语句放在finally子句中无论在读写文件中是否遇到异常退出,文件关闭语句都会执行,保证了资源的合理回收。



**7.集合框架图**









**8.JAVA中Collection和Collections的区别**



java.util.Collection 是一个集合接口。 

它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。 

它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。、



**9.线程的生命周期**





1、线程的生命周期:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。 

2、当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。 

3、启动线程使用start()方法,而不是run()方法。 

4、只能对处于新建状态的线程调用start(),否则将引发IllegalThreadStateException异常。 

5、所有现代的桌面和服务器操作系统都采用抢占式调度策略,只有当一个线程调用了它的sleep()方法或yield()方法后才会放弃所占用的资源。 

6、线程从阻塞状态只能进入就绪状态,无法进入运行状态。 

7、程序会以如下三种方式结束,结束后就处于死亡状态。 

(1)run()或call()方法执行完成,线程正常结束。 

(2)线程抛出一个未捕获的Exception或Error。 

(3)直接调用该线程的stop()方法来结束该线程——该方法容易导致死锁,通常不推荐使用。 

8、isAlive()方法测试某个线程是否已经死亡。



**10.Java中的String,StringBuilder,StringBuffer三者的区别**



        首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:**StringBuilder > StringBuffer > String**

  String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的

        **在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的**

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

`

        String:适用于少量的字符串操作的情况

        StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

        StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

`



**11.创建线程有几种不同的方式?你喜欢哪一种?为什么?**



有三种方式可以用来创建线程:

继承Thread类

实现Runnable接口

应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。



**12.Enumeration接口和Iterator接口的区别有哪些?**



Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。



**13.说一下Servlet的体系结构。**



所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多线程可以并行的为多个请求服务。



**14.解释下Servlet的生命周期。**



对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servlet(译者注:这里应该是Servlet而不是server)的destroy()方法把Servlet删除掉。



**15.doGet()方法和doPost()方法有什么区别?**



doGet:GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。

doPOST:POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。



**16.什么是cookie?session和cookie有什么区别?**



cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:

无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。

在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。



**17.隐含对象是什么意思?有哪些隐含对象?**



JSP隐含对象是页面中的一些Java对象,JSP容器让这些Java对象可以为开发者所使用。开发者不用明确的声明就可以直接使用他们。JSP隐含对象也叫做预定义变量。下面列出了JSP页面中的隐含对象:

application

page

request

response

session

exception

out

config

pageContext



**18.spring工作原理**



1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 

3.DispatcherServlet请请求提交到目标Controller 

4.Controller进行业务逻辑处理后,会返回一个ModelAndView 

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 

6.视图对象负责渲染返回给客户端。 



**19.请你谈谈SSH整合:** 



SSH: 

Struts(表示层)+Spring(业务层)+Hibernate(持久层) 

Struts: 

Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。 

在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action) 

Hibernate: 

Hibernate是一个持久层框架,它只负责与关系数据库的操作。 

Spring: 

Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。 



**20.介绍一下Spring的事务管理:** 



事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。 

这样可以防止出现脏数据,防止数据库数据出现问题。 

开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。 



spring提供了几个关于事务处理的类: 

TransactionDefinition //事务属性定义 

TranscationStatus //代表了当前的事务,可以提交,回滚。 

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。 

spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。 



编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象. 



**21.Spring里面如何配置数据库驱动?** 



使用”org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下: 

 

     

        org.hsqldb.jdbcDriver 

     

     

        jdbc:hsqldb:db/appfuse 

     

    sa 

     

 



**22.如何在web应用里面配置spring?** 



在web.xml中加入如下同容,在启动web服务器时加载/WEB-INF/applicationContext.xml中的内容。 

 

context 

 

org.springframework.web.context.ContextLoaderServlet 

 

1 

 

通过如下类得到ApplicationContext实例 

    WebApplicationContextUtils.getWebApplicationContext 



**23.Spring里面如何定义hibernate mapping?** 



添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下: 

 

     

        org/appfuse/model/User.hbm.xml 

     

 



**24.解释一下Dependency injection(DI,依赖注入)和IOC(Inversion of control,控制反转)?** 



依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖 

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。 



**25.spring中的BeanFactory与ApplicationContext的作用有哪些?** 



1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。 

2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: 



a. 国际化支持 

b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”), “file:c:/config.properties” 

c. 事件传递:通过实现ApplicationContextAware接口 

3. 常用的获取ApplicationContext的方法: 

FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组 

ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件 

WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现 

 

org.springframework.web.context.ContextLoaderListener 

 

 

context 

org.springframework.web.context.ContextLoaderServlet 

1 

 

这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件 

 

contextConfigLocation 

/WEB-INF/myApplicationContext.xml 

 



**26.spring中的核心类有那些,各有什么作用?** 



BeanFactory:产生一个新的实例,可以实现单例模式 

BeanWrapper:提供统一的get及set方法 

ApplicationContext:提供框架的实现,包括BeanFactory的所有功能 



**27.使用Spring有什么好处?** 



◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题,。 



◆Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。 

◆Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种 一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可 很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。 

◆Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。 

◆Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 

◆使用Spring构建的应用程序易于单元测试。 

◆Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 

◆Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。 

■Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。 

Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。 

总结起来,Spring有如下优点: 

◆低侵入式设计,代码污染极低 

◆ 独立于各种应用服务器,可以真正实现Write Once,Run Anywhere的承诺 

◆Spring的DI机制降低了业务对象替换的复杂性 

◆Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部 



28





吐槽(0)

上一篇:Java中的随机方法

下一篇:Java冒泡排序

文章评论

    共有0条评论

    验证码:

文章目录