Java面试(解答题二)
阅读原文时间:2023年07月08日阅读:1

1.一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。备注:用户表:tb,角色字段为role,主键为id。请写出sql语句。

解答:

2.概述MVC体系结构

解答: MVC包括三类对象,model是应用对象,view是视图,controller是控制器,它定义用户界面对用户输入的响应方式。在MVC体系中,模型通常被称为“业务逻辑”,是真正完成任务的代码,视图就是使用界面,反映数据的变化。控制器控制着模型和视图之间的交互过程,它决定着向用户返回怎样的视图、检查通过界面输入的信息以及选择处理输入信息的模型.在MVC中,表示层和逻辑层分离,各部分可相互独立进行开发,便于开发和维护,提高了开发效率。

3.JSP如何获取HEML FORM中的数据?用什么方法将数据输出到标准设备中

解答:JSP表单中的form传值

页面间链接和数据传递的三种方式

(1)通过JSP表单form将数据提交到下一个页面;

(2)通过JSP表单链接将数据提交到下一个页面;

(3)通过JSP表单Session将数据提交到后续页面,session是一次会话只要浏览器不关闭就不会关闭会话,一般默认保存30分钟可以根据自己的需要更改 。

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

printf()函数的调用格式为: printf(“<格式化字符串>”, <参量表>);

其中格式化字符串包括两部分内容:

一部分是正常字符, 这些字符将按原样输出;另一部分是格式化规定字符, 以”%”开始, 后跟一个或几个规定字符, 用来确定输出内容格式。

参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用”,”分开, 且顺序一一对应, 否则将会出现意想不到的错误。

4.面向对象编程有很多重要的特性并简要描述

解答:

1、封装

面向对象编程核心思想这一就是就是将数据和对数据的操作封装在一起.通过抽象,即从具体的实例中抽取共同的性质形成一般的概念,比如类的概念.

2、继承

继承体现了一种先进的编程模式.子类可以继承父类的属性和功能,即子类继承了父类所具有的数据和数据上的操作,同时又可以增添子类独有的数据和数据上的操作.例如,”人类”继承了”哺乳类”的属性和功能,同时又增添了人类独有的属性和功能.

3、多态

 多态是面向对象编程的又一重要特征.有两种意义的多态(表现为方法的重写(Overriding)和重载(Overloading)) 

 一种是操作名称的多态,即有多个操作具有相同的名字,但这些操作所接收的消息类型必须不同.所谓操作名称的多态是指可以向操作传递不同消息,以便让对象根据相应的消息来产生一定的行为.

5.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

解答:方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。

覆盖者可能不会限制它所覆盖的方法的访问。

重载(Overloading)

(1)方法重载是让类以统一的方法处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数(类型)。重载Override是一个类中多态性的一种表现。

(2)java的方法重载,就是在类中可以创建多个方法,他们具有相同的名字,但具有不同参数和不同的定义。调用方法时通过传递给他们不同的参数个数和参数类型来决定具体使用那个方法,这就是多态性。

(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不同。无法以返回类型来作为重载函数的区分标准。

6.Java语言支持的8中基本数据类型是?什么是值传递和引用传递

解答:基本数据类型作为参数传递,形参直接赋值为实参,相当于是一份拷贝,方法里面操作形参,对实参没有任何影响。

引用数据类型作为参数传递,是将对象的地址值传递给形参,形参获得地址值后也和实参一样指向对象,所以在方法内部操作对象的属性、方法,实参也是同步变化,因为形参、实参根本就是指向同一个对象的。

7.Java集合类框架的基本接口有哪些?

解答:

Java集合类里最基本的接口有:

Collection:单列集合的根接口

List:元素有序  可重复 

ArrayList:类似一个长度可变的数组 。适合查询,不适合增删

LinkedList:底层是双向循环链表。适合增删,不适合查询。

Set:元素无序,不可重复

HashSet:根据对象的哈希值确定元素在集合中的位置

TreeSet: 以二叉树的方式存储元素,实现了对集合中的元素排序

Map:双列集合的根接口,用于存储具有键(key)、值(value)映射关系的元素。

HashMap:用于存储键值映射关系,不能出现重复的键key

TreeMap:用来存储键值映射关系,不能出现重复的键key,所有的键按照二叉树的方式排列

8.进程和线程的区别是什么?创建线程有几种不同的方式?概括的解释下线程的几种可用状态

解答:进程与线程的区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

创建线程的几种不同方式:①继承Thread类(真正意义上的线程类),是Runnable接口的实现。

②实现Runnable接口,并重写里面的run方法。

③使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。

调用线程的start():启动此线程;调用相应的run()方法

继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。

实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

线程的几种可用状态:

1. 新建( new ):新创建了一个线程对象。

2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。

3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。

4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:

(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列(waitting queue )中。

(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

9.分析题:假设现有一个新功能,用户点击一个按钮后就会自动发送一封邮件到用户的邮箱,现在用户反映没有收到邮件,你怎么去发现并解决问题?

解答:

  1. index.ftl

请依次解释上述struts配置中,各元素属性意义

Name: class: method: result:

解答:

11.试分析基本数据类型和引用数据类型的基本特点

解答:一、从概念方面来说

基本数据类型:变量名指向具体的数值引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值

二、从内存构建方面来说

基本数据类型:变量在声明之后java就会立刻分配给他内存空间

引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。

三、从使用方面来说

基本数据类型:使用时需要赋具体值,判断时使用“==”号

引用数据类型:使用时可以赋null,判断时使用equals方法

12.请简单说明什么是“依赖注入”

解答:大多数面向对象编程语言,在调用一个类的时候,先要实例化这个类,生成一个对象。

如果你在写一个类,过程中要调用到很多其它类,甚至这里的其它类,也要“依赖”于更多其它的类,那么可以想象,你要进行多少次实例化。

这就是“依赖”的意思。

依赖注入,全称是“依赖注入到容器”, 容器(IOC容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器中,可以“解析”出这个类的实例。

所以依赖注入就是把有依赖关系的类放入容器(IOC容器)中,然后解析出这个类的实例。仅此而已。

13.Abstract class 和 interface有什么区别

解答:1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现

4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果

7、抽象类里可以没有抽象方法

8、如果一个类里有抽象方法,那么这个类只能是抽象类

9、抽象方法要被实现,所以不能是静态的,也不能是私有的。

10、接口可继承接口,并可多继承接口,但类只能单根继承。

 

1.抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高

2.抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量

3.抽象类主要用来抽象类别,接口主要用来抽象功能.

4、抽象类中,且不包含任何实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。

14.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类时候可继承实体类?是否可以继续继承String类?

解答:

15.Sleep()和wait()有什么区别?

解答:  区别一:

sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。

wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。

   区别二 :

关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁(自己的感觉是sleep方法本来就是和锁没有关系的,因为他是一个线程用于管理自己的方法,不涉及线程通信)

区别三:

使用区域  

由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义    。

16.什么是BS架构?什么是CS架构

解答:

C/S结构 

即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。

B/S结构 

即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种 结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。 

B/S结构,主要是 利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器 就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows 98/Windows 2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。

17.你接触过哪些框架?

18.Hibernate中你使用过哪些关联映射配置?

解答:http://blog.csdn.net/qq_27550755/article/details/50070017

19.请简述你对AOP的理解?

解答:  AOP : Aspect Oriented Programming  面向切面编程。它是为解耦而生的。

      解耦是程序员编码开发过程中一直追求的境界。AOP在这方面给程序员带来的福音,在对业务类的隔离方面来说,它绝对是做到了解耦,但绝不是完美的解耦,这里在接下来的博客中再做介绍,这篇博客的主题是理解AOP。AOP的具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

20.谈一谈SpringMVC的工作原理

解答:1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

21.Springmvc的常用注解

解答:@Controller

@RequestMapping

@Resource和@Autowired

@ModelAttribute和 @SessionAttributes

@PathVariable

@requestParam

22.String,StringBuffer,StringBuilder的区别是什么?String为什么是不可变的

解答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。

2、String不可变是因为在JDK中String类被声明为一个final类。

3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。

ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。

23.GET,POST区别

解答:答:   基础知识:Http的请求格式如下。

          主要包含三个信息:1、请求的类型(GET或POST),2、要访问的资源(如\res\img\a.jif),3、Http版本(http/1.1)

                用来说明服务器要使用的附加信息

             这是Http的规定,必须空一行

[]      请求的内容数据

区别:

1、Get是从服务器端获取数据,Post则是向服务器端发送数据。

2、在客户端,Get方式通过URL提交数据,在URL地址栏可以看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。

3、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。

4、Get方式提交的数据最多1024字节,而Post则没有限制。

5、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。

24.反射讲一讲,主要概念,都在哪需要反射机制,反射的性能,如何优化

解答:   反射机制的定义:

是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。

反射的作用:

1、动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。

2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类

详见:http://blog.csdn.net/p785810989/article/details/6495956

25.对Spring的理解,项目中都用什么?怎么用的?对IOC和AOP的理解以及实现原理

解答: spring是一个开源框架,处于MVC模式中的控制层,它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势,其次它提升了系统性能,因为通过          依赖倒置机制(IOC),系统中用到的对象不是在系统加载时就全部实例化,而是在调用到这个类时才会实例化该类的对象,从而提升了系统性能。这两个优秀的性能            使得Spring受到许多J2EE公司的青睐,如阿里里中使用最多的也是Spring相关技术。

Spring的优点:

1、降低了组件之间的耦合性,实现了软件各层之间的解耦。

2、可以使用容易提供的众多服务,如事务管理,消息服务,日志记录等。

3、容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。

Spring中AOP技术是设计模式中的动态代理模式。只需实现jdk提供的动态代理接口InvocationHandler,所有被代理对象的方法都由InvocationHandler接管实际的处理任务。面向切面编程中还要理解切入点、切面、通知、织入等概念。

Spring中IOC则利用了Java强大的反射机制来实现。所谓依赖注入即组件之间的依赖关系由容器在运行期决定。其中依赖注入的方法有两种,通过构造函数注入,通过set方法进行注入。

详见:http://www.360doc.com/content/08/0113/20/7635_970484.shtml    http://www.zlmind.com/?p=694

26.线程同步,并发操作怎么控制

解答:Java中可在方法名前加关键字syschronized来处理当有多个线程同时访问共享资源时候的问题。syschronized相当于一把锁,当有申请者申请该

资源时,如果该资源没有被占用,那么将资源交付给这个申请者使用,在此期间,其他申请者只能申请而不能使用该资源,当该资源被使用完成后将释放该资源上的锁,其他申请者可申请使用。

并发控制主要是为了多线程操作时带来的资源读写问题。如果不加以空间可能会出现死锁,读脏数据、不可重复读、丢失更新等异常。

并发操作可以通过加锁的方式进行控制,锁又可分为乐观锁和悲观锁。

悲观锁:

悲观锁并发模式假定系统中存在足够多的数据修改操作,以致于任何确定的读操作都可能会受到由个别的用户所制造的数据修改的影响。也就是说悲观锁假定冲突总会发生,通过独占正在被读取的数据来避免冲突。但是独占数据会导致其他进程无法修改该数据,进而产生阻塞,读数据和写数据会相互阻塞。

乐观锁:

乐观锁假定系统的数据修改只会产生非常少的冲突,也就是说任何进程都不大可能修改别的进程正在访问的数据。乐观并发模式下,读数据和写数据之间不会发生冲突,只有写数据与写数据之间会发生冲突。即读数据不会产生阻塞,只有写数据才会产生阻塞。

详见:http://www.cnblogs.com/ego/articles/1514350.html      http://blog.csdn.net/niu870781892/article/details/6140755

27.ClassforName作用

解答:Class.forName(String,boolean,ClassLoader)可以指定加载类的类路径、是否初始化类参数、加载类的类加载器。当第二个参数为false时,只加载类,不初始化类。

28.进程和线程的区别是什么?

解答:进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

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

30.Java集合类框架的基本接口有哪些

31.数据连接池的工作机制是什么?

解答:J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的

池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其

表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连

接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表

记为空闲,其他调用就可以使用这个连接。

32.Java中的流分类都有哪些

解答:字节流类

抽象父类: InputStream,OutputStream

实现类包括如下几种:

BufferedInputStream 缓冲流-过虑流

BufferedOutputStream

ByteArrayInputStream 字节数组流-节点流

ByteArrayOutputStream

DataInputStream 处理JAVA标准数据流-过虑流

DataOutputStream

FileInputStream 处理文件IO流-节点流

FileOutputStream

FilterInputStream 实现过虑流-字节过虑流父类

FilterOutputStream

PipedInputStream 管道流

PipedOutputStream

PrintStream 包含print() 和 println()

RandomAccessFile 支持随机文件

字符流

抽象父类:Reader, Writer

实现类:

Java中流的分类都有哪些?

BufferedReader

BufferedWriter

PrintWriter

CharArrayReader

CharArrayWriter

FileReader

FileWriter

FilterReader

FilterWriter

InputStreamReader

OutputStreamWriter

PipedReader

PipedWriter

StringReader

StringWriter

33.面向对象的特征

解答:

34.浏览器和Servlet通信使用的是什么协议

解答:

35.Java网络编程

解答:   网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。所以,基础的网络编程可以和打电话一样简单。网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。虽然通过IP地址和端口可以找到网络上运行的一个程序,但是如果需要进行网络编程,则还需要了解网络通讯的过程。

36.Thread类中的start()和run()方法有什么区别?

解答:1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。

2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

记住:多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发

37.Spring由哪几个模块组成

解答:1. Spring Core:

Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

2.Spring Context:

构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。

3.Spring DAO:

DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。

4.Spring ORM:

ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。

5.Spring AOP:

Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。

6.Spring Web:

Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。

7.Spring Web MVC:

Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。

38.Jsp常用的动作

解答:

 JSP共有以下6种基本动作

  1. jsp:include:在页面被请求的时候引入一个文件。

  2.jsp:useBean:寻找或者实例化一个JavaBean。

  3.jsp:setProperty:设置JavaBean的属性。

  4. jsp:getProperty:输出某个JavaBean的属性。

  5. jsp:forward:把请求转到一个新的页面。

  6.jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

GC是什么?为什么要GC,谈谈你对GC的理解

解答:Java有了GC,就不需要程序员去人工释放内存空间。当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间。当然,如果需要,程序员可以在Java程序中显式地使用System.gc()来强制进行一次立即的内存清理。

39.Java中的volatile关键字的作用?

解答:volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存。

40.线程之间如何进行通信

解答:①同步

这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。

②while轮询的方式③wait/notify机制④管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信

41.为什么wait(),notify(),notifyAll()等方法是放在Object类中的而不是放在Thread类中的?

解答:wait和notify的本质是基于条件对象的,而且只能由已经获得锁的线程调用。java的每个Object都有一个隐式锁,这个隐式锁关联一个Condition条件对象,线程拿到这个隐式锁(比如进入synchronized代码区域),就可以调用wait,语义是在Condition条件对象上等待,其他的线程可以在这个Condition条件对象上等待,等满足条件之后,就可以调用notify或者notifyAll来唤醒所有在此条件对象上等待的线程。

42.简要阐述java BI0和NI0的原理和区别,如果可以的话选择其中一种简单实现客户端啊、服务端程序

解答:

43.解释同步和异步,阻塞和非阻塞的区别:并从以下四种IO模型中任选一种阐述其原理。同步阻塞IO、同步非阻塞IO、IO多路复用、异步IO的原理

解答:阻塞:用户进程访问数据时,如果未完成IO,等待IO操作完成或者进行系统调用来判断IO是否完成

非阻塞:用户进程访问数据时,会马上返回一个状态值,无论是否完成

同步:用户进程发起IO(就绪判断)后,轮询内核状态

异步:用户进程发起IO后,可以做其他事情,等待内核通知

网络IO模型和文件IO模型是一样的,上图是IO的5种模型,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动的IO、异步IO。

一次IO包括两个过程,内核数据准备 、把数据从内核空间copy到用户空间。

1、阻塞IO(recvfrom系统调用)是在两个过程应用都处于阻塞状态。

2、非阻塞IO(recvfrom系统调用)是应用发出IO操作后可以立刻返回,通过轮询盘判断数据是否准备好,在copy数据阶段阻塞应用。

3、多路复用IO(select 、recvfrom系统调用)是阻塞调用select,查找可用的套接字,如果有套接字可用,那么就阻塞调用(recvfrom)完成数据的copy过程。linux select就是这种模型,缺点是一次select会扫描所有的socket。

4、信号驱动的IO(SIGIO、recvfrom)是应用发出SIG IO后立刻返回,内核中数据准备好后,通知应用,由应用进行阻塞recvfrom调用从内核copy数据。linux epoll就是基于事件的就绪通知方式,省去了所有socket的扫描开销。

      epoll,kqueue比select高级,select是在内核里做轮询操作, epoll是使用回调机制, 消耗的资源更少. 套接字比较多的时候,每次select()都要通过遍历Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。epoll给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询。

5、异步IO(aio-read)是应用发出aio-read后马上返回,数据准备好后,由操作系统把数据copy到应用,并通知应用数据copy完成。

44.请结合自身实际工作情况,说出三点与java代码、性能优化有关的案例

解答:http://www.importnew.com/16181.html

45.如何优化网页加载速度

解答:http://www.cnblogs.com/MarcoHan/p/5295398.html

46.简述jsp获取request,session对象的方式,至少二种

解答:用request获取session里面的值的方法:

1、通过request获取session对象:request.getSession();

2、用session获取其内部的值:session.getAttribute(“valuename”)

47.Struts2中,#@$的用法

解答:http://www.cnblogs.com/sharpest/p/6030265.html

48.描述一下java中Hashtable和HashMap的区别,你还用过哪些集合类,各自有什么有点和缺点

解答: 1、HashTable线程同步,HashMap非线程同步。

2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。

3、HashTable使用Enumeration,HashMap使用Iterator。

4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。

49.解释以下修饰符:public,protected,private,final,static,分别用于class,variable。Function时的含义

解答:

 public(公共访问权限):这是一个宽松的访问控制级别,如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,那么这个成员或外部类就可以被所有类(注:在该类外部,若是类成员,则需要类调用成员或外部类;若是非static的类,则应先实例化后,对象对其调用)访问,不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。

private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。很显然,这个访问控制符用于修饰成员变量最合适,使用它来修饰成员变量就可以把成员变量隐藏在该类内部。

protected(子类访问权限):如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰,那么这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类访问。在通常情况下,如果使用protected来修饰一个方法,通常是希望其子类来重写这个方法。

default(包访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)或者一个外部类不使用任何访问控制符修饰,就称它是包访问权限,default访问控制的成员或外部类可以被相同包下的其他类访问。

final:可用于修饰类、变量和方法,用于表示它修饰的类、方法和变量不可改变。

50.J2EE是什么,核心是什么

解答:J2EE 是使用 Java 技术开发企业级应用的工业标准,它是 Java 技术不断适应和促进企业级应用过程中的产物。 

适用于企业级应用的 J2EE,提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的 

开发、管理和部署。J2EE 是一个标准,而不是一个现成的产品。

.

servlet 

Servlet是java平台上的CGI技术。Servlet在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他 

类似CGI的 技术相比,Java Servlet具有更高的效率并更容易使用。 

对于Servlet,重复的请求不会导致同一程序的多次转载,它是依靠线程的方式来支持并发访问的。

.

.

JSP(Java server Page) 

JSP是一种实现普通静态HTML和动态页面输出混合编码的技术。从这一点来看,非常类似Microsoft ASP、 

PHP等技术。借助形式上的内容和外观表现的分离,Web页面制作的任务可以比较方便地划分给页面设计人员,并 

方便地通过JSP来合成。在运行时态,JSP将会被首先转换成Servlet,并以Servlet的形态编译运行,因此它的效 

率和功能与Servlet相比没有差别,一样具有很高的效率。

JDBC 

JDBC(java Database Connectivity,java数据库连接)API是一个标准SQL(Structured Query 

Language, 结构化查询语言)数据库访问接口,它使数据库开发人员能够用标准java API编写数据库应用程序。 

JDBC API主要用来连接数据库和直接调用SQL命令执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、 

动态SQL语句以及带IN和OUT参数的存储过程。Java中的JDBC相当于Microsoft平台中的ODBC(open Database Connectivity)

.

.

EJB 

EJB定义了一组可重用的组件:Enterprise Beans。开发人员可以利用这些组件,像搭积木一样建立分布式应用。

.