首页 > 程序开发 > 软件开发 > Java >

Java面试题整理

2017-08-02

Java面试题整理,Hibernate。

Java面试题整理

Hibernate

1.Hibernate的核心接口有哪些?

Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。

这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制

2.Hibernate的缓存有哪些?

Session是一级缓存,SessionFactry是二级缓存。

SessionFactory是Hibernate的概念,对应一个数据存储源(如MySql,SQLServer,Oracle)

看你项目中用的哪个数据库,可以有多个,在XML文件中配置,由Configuration创建

SessionFactory可以创建Session,Session用来控制事务以及增删改查操作

SessionFactory是线程安全的,多线程可以同时访问它,创建一次就行

Session是线程不安全的,代表对数据库一次操作。一般每一次对数据库的操作都要创建一个Session,用之后关闭

1、内部缓存存在Hibernate中又叫一级缓存,属于应用事务级缓存

2、二级缓存:

a) 应用级缓存

b) 分布式缓存,比如使用Memcached可作为Hibernate二级分布式缓存

条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据

c) 第三方缓存的实现

3.Hibernate中get和load有什么区别?

不存在对应记录时表现不一样

load返回的是代理对象(javassist.jar生成二进制码),等到真正用到对象的内容才会发出SQL语句

get直接从数据库加载,不会延迟

get不支持懒加载 ,load支持

get查询数据库不存在的记录时返回null ,load就报异常了

4.Hibernate的工作原理?

读取并解析hibernate.cfg.xml配置文件

读取并解析映射信息,创建SessionFactory

打开Sesssion

创建事务Transaction

持久化操作

提交事务

关闭Session

关闭SesstionFactory

5.为什么要用Hibernate?

对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码

Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性

Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系

6.Hibernate如何实现延迟加载?

当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

7.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many

8.JDBC和Hibernate的比较?

JDBC与Hibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。

相同点:

两者都是JAVA的数据库操作中间件

两者对于数据库进行直接操作的对象都不是线程安全的,都需要及时关闭

两者都可以对数据库的更新操作进行显式的事务处理

不同点:

使用的SQL语言不同:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言

操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接传送到数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中。

数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致的。

Hibernate与JDBC哪个好?各自的优点和缺点:

1、内存消耗:采用JDBC的无疑是最省内存的,Hibernate的次之

2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用Batch语句,调整PreapredStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率

3、开发效率:在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人,JDBC次之 延迟加载是罪魁祸首,所谓“成也萧何,败也萧何” 有时发现查询速度很慢,检查才发现是我没有启用延迟加载,造成递归的数据都被加载进来了

如果加上了延迟加载,那么许多页面将无法使用,必须在程序里进行代码级别的递归的延迟加载数据的读取

1 用HQL来写查询语句,这是最高效的办法(推荐)

2 用JDBC,脱离了Hibernate范畴,缓存方面和乐观所方面会出现不一致,而且语句变得繁琐了(不推荐)

3 将前台要用到的实体,独立设计成单独的类,没有任何关联,都是单表,用到的只是Hibernate的封装以及简单的OR映射

4 在大数据量系统中都会遇到类似的问题,我的解决方法是少用一对多关联映射或者不用一对多关联,设置关联少的数据表,用SQL语句做关联的查询,Hibernate中映射的配置 Lazy都为False

9.Hibernate框架下如何实现分页?

Hibernate有自带分页功能

Query.setFirstResult() //从哪一条条记录开始

Query.setMaxResults() //希望获得的记录数

Spring

1.Spring的工作原理?

IoC(Inversion of control): 控制反转

概念:控制权由对象本身转向容器,由容器根据配置文件去创建实例并创建各个实例之间的依赖关系

核心:bean工厂,在Spring中,bean工厂创建的各个实例称作bean

AOP(Aspect-Oriented Programming): 面向切面编程

代理的两种方式:

静态代理:

? 针对每个具体类分别编写代理类

? 针对一个接口编写一个代理类

动态代理:

针对一个切面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类

b)、AOP的主要原理:动态代理

Spring的工作原理

Spring 已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用Java里的反射

反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟XMLSpring的配置文件来动态的创建对象,以及调用对象里的方法

Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能,这些都是通过配置类达到的

Spring的目的:

就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置内部通过反射去动态的组装对象),要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能

Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式)Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了也就基本上掌握Spring。

2.Spring底层动态代理失效,怎么实现切面?

Spring默认使用JDK动态代理(Proxy),但JDK动态代理是针对接口做代理的。如果类不是实现的接口的时候,就会使用cglib代理。当然,你也可

以在配置文件里指定使用cglib

JDK代理:只能代理实现了接口的类

cglib代理:不仅可以对实现接口的类进行代理,同时也可以对类本身生成代理(主要是通过继承这个类来生成的,所以不要将要代理的类设成final)

3.什么是动态代理?

动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实

代理一般会实现它所表示的实际对象的接口

代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道

4.为什么使用Spring?有什么优点?

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

可以使用容器提供的众多服务,如事务管理,消息服务等

容器提供单例模式支持

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

容器提供了众多的辅助类,能加快应用的开发

Spring对于主流的应用框架提供了集成支持,如Hibernate,JPA,Struts等

Spring属于低侵入式设计,代码的污染极低

独立于各种应用服务器

Spring的DI机制降低了业务对象替换的复杂性(依赖注入)

5.Spring的AOP是用什么来实现的?

Spring AOP就是用AspectJ来实现的,是依赖关系

AspectJ是动态代理的一种实现,而Spring默认使用的就是AspectJ来实现的动态代理,Spring自己的AOP就是使用AspectJ来实现的

AOP:Aspect OrientedProgramming(面向切面编程)

利用动态代理实现面向切面编程

Spring实现动态代理配置是有两种配置文件:

XML文件方式

Annotation方式,使用AspectJ类库实现的

AspectJ类库,AspectJ是一个专门用来实现动态代理(AOP编程)的类库,AspectJ是面向切面编程的框架,Spring使用就是这个类库实现动态代理的

AspectJ的专业术语:

JoinPoint连接点(切入点)

PointCut切入点,当需要定义一个切入点时,则需要使用这个

Aspect切面

Advice切入点的逻辑

Target被代理对象

Weave织入

6.Spring事务管理的7种传播行为和4种隔离级别?

REQUIRED:业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。

NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方

法调用结束后,原先的事务便会恢复执行。

REQUIRES_NEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。

MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出例外。

SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没

有事务的环境下执行。

NEVER:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。

NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效

事务隔离级别:

数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,ReadUncommited的隔离级别最低。

大多数据库默认的隔离级别为ReadCommited,如SqlServer、Oracle,当然也有少部分数据库默认的隔离级别为RepeatableRead,如Mysql。

ReadUncommited:读未提交数据(会出现脏读,不可重复读和幻读)

ReadCommited:读已提交数据(会出现不可重复读和幻读)

RepeatableRead:可重复读(会出现幻读)

Serializable:串行化

脏读:一个事务读取到另一事务未提交的更新新据。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读:一个事务读取到另一事务已提交的insert数据。

7.简述AOP用什么技术实现的?

动态代理技术实现的,如果用JDK实现动态代理,需要利用Proxy类和InvocationHandler接口

SpringMVC

1.SpringMVC的工作原理?

Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器、视图解析器、视图组成

整个处理过程从一个HTTP请求开始:

DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMapping),根据配置的映射规则,找到

对应的处理器(Handler)

调用相应处理器中的处理方法,处理该请求,处理器处理结束后会将一个ModelAndView类型的数据传给DispatcherServlet,这其中包含了处理结果的视图和视图中要使用的数据

DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将视图要显示的数据传给对应的视图,最后给浏览器构造一个HTTP响应

DispatcherServlet是整个Spring MVC的核心,它负责接收HTTP请求组织协调SpringMVC的各个组成部分

其主要工作有以下三项:

截获符合特定格式的URL请求

初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联

初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中

Session & Cookie

1.什么是Session?

Session 是客户端与服务器之间的会话,用来保存用户的信息。

在编程里是会话的意思

Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去

当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话

2.Session和Cookie区别?

Session是服务器端缓存,Cookie是客户端缓存。

Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案

3.说说Session分话的原理,Session与Cookie的关系及区别

服务器上通过Session来分别不同的用户Session ID

任何连接到服务器上的用户,服务器都会位之分配唯一的一个不会重复的Session ID

Session ID是由服务器统一管理的,人为不能控制

Session在服务器上2个基本操作:

Session.setAttribute(String key,Object obj)以键值对的方式存储数据

Session.getAttribute(String key)根据键获取数据

Session是服务器端缓存,Cookie是客户端缓存

Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案

4.Cookie中的值能否包含各种特殊字符及中文字符?如果不能,那应该如何处理?

当Cookie中包含有等号、空格、分号等特殊字符时,可能会导致数据丢失、或者不能解析的错误,一个较好的解决办法就是:在将Cookie值写入客户端浏览器之前,首先进行URLEncode编码,读取Cookie时,进行URLDecode即可。

5.如何判断Session过期?

request.getSession(boolean)这个方法里面传了一个boolean值,这个值如果是true,那么如果当前的Request的Session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在Request的当前会话不存在的时候就返回null

if(request.getSession(false)==null){

System.out.println("Session has been invalidated!");

} else{

System.out.println("Session is active!");

}

6.Session默认过期时间如何修改?

程序中Session都有一个默认的过期时间,其中Tomcat中的默认时间为30分钟,根据需要我们可以去手动设置Session的过期时间,以下是设置

Session的过期时间的三个方法:

1、在Tomcatconfconf/web.xm中的中设置:

30

2、在项目的web.xml中定义:

20

注:20则设置过期时间为20分钟

3.在程序中定义:

session.setMaxInactiveInterval(30*60);

WebService

1.WebService介绍

Web Service 是一项新技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据Web Service 规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。

通俗的讲,Web Service 就是一个部署在Web 服务器上的一个应用程序,它向外界暴露出一个能够通过Web 进行调用的API。

这就是说,你能够用编程的方法通过Web 来调用这个应用程序。我们把调用这个Web Service 的应用程序叫做客户端,发布这个web 服务的机器称为Web Service 服务器。

优势:

异构平台的互通性

更广泛的软件复用

成本低、可读性强、应用范围广

迅捷的软件发行方式

WSDL:WebService服务描述语言

获取WEB的发布信息是通过wsimport来解析wsdl文件得到Java类来实现的。无论是获取发布的服务,还是调用发布的服务,都需要参考wsdl文件

CXF框架概念介绍

Apache CXF 是一个开源的Services框架,CXF 帮助您来构建和开发 Services。

这些 Services 可以支持多种协议,比如:SOAP1.1/1.2、POST/HTTP、RESTful、HTTP,CXF大大简化了Service,可以天然地和 Spring 进行无缝集成。

struts2

1:为什么要用Struts2框架?

它是建立在MVC这种公认的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上。因此,它天生就有MVC所带来的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等

其次,它是个开源项目得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护,并且经受了实战的检验,使其功能越来越强大,体系也日臻完善

是它对其他技术和框架显示出很好的融合性

2:Struts2的工作原理?

Struts2框架由3个部分组成:

核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。

在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。

1、核心控制器:FilterDispatcher

FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该

Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。

Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件。例如,对于login.action请求,Struts2调用名为login的Action来处理该请求。

Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。

Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理。因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。

3、一个请求在Struts2框架中的处理大概分为以下几个步骤:

客户端初始化一个指向Servlet容器(例如Tomcat)的请求 ,即HttpServletRequest请求

这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很

有帮助,例如:SiteMesh Plugin)

接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action

如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类

ActionProxy创建一个ActionInvocation的实例

ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

4.Struts2中的Action为什么是多例的?

Struts2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象

原因是:

Struts2的Action中包含数据

例如你在页面填写的数据就会包含在Action的成员变量里面,如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了

而Struts1的Action是单实例的

因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用同样Servlet也是单实例的

5.Struts2的数据都在ValueStack中,怎么保证数据的安全性?ValueStack生命周期多长?

因为ValueStack在ActionContext中,而ActionContext在ThreadLocal中,所以能保证数据的安全性

ValueStack的生命周期是一次请求,因为ActionContext把ValueStack放在Request域里面

6.OGNL有什么优点?

可以访问ValueStack和AcionContext

可以操作集合对象,很方便的构建各种集合

可以在 struts.xml访问action定义的属性

可以调用对象的方法

JSTL/EL只能在JSP中使用,而OGNL可以在更多的View使用

7.简述Struts2框架?

Struts2是基于JSP和Servlet的一个开源web应用框架,使用MVC设计模式,结构清晰,使程序员可以只关注业务逻辑,还具有丰富的标签库可以使用。

Struts2工作流程:

客户端发送请求

根据web.xml,请求被FileDispatcher接收

根据struts.xml的配置,找到需要调用的Action类,通过IOC方式将值注入给Action,Action调用业务逻辑组件处理业务逻辑。如果有配置拦截器,这一步还包含了拦截器

Action执行完毕,根据struts.xml中的配置找到对应的Result,并跳转到相应页面

响应到客户端浏览器

SQL

1.MySQL和Oracle的分页查询语句?

MySQL:

第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数

SELECT * FROM table LIMIT 5,10; #返回第6-15行数据

SELECT * FROM table LIMIT 5; #返回前5行

SELECT * FROM table LIMIT 0,5; #返回前5行

Oracle:

SELECT * FROM (SELECT A.*, ROWNUM RN FROM(SELECT * FROM TABLE_NAME) A ) WHERE RNBETWEEN 21 AND 40

2.常用的数据库优化方法有哪些?

建立索引 、导出历史数据 、定期整理索引(sp_msforeachtable 'dbccdbreindex("?")' ) 少用like,查询前检查条件是不是完整,如果完整就用 = 替代like查询,不要不检查条件完整不完整全部用like来

3.什么是动态游标?什么是静态游标?

静态游标是以游标打开时刻的当时状态显示结果集的游标。静态游标在游标打开时不反映对基础数据进行的更新、删除或插入。有时称它们为快照游标。

动态游标是可以在游标打开时反映对基础数据进行的修改的游标。用户所做的更新、删除和插入在动态游标中加以反映。

4.如何对SQL语句进行优化?

尽可能合理运用索引

少用“*”,比如select * from tableName,只查询自己需要的数据

使用LIKE ‘%关键字%’模糊查询时,由于关键字前面用了“%”符号,因此该查询必定会进行全表查询,尽量不要在关键字前加“%”符号

尽可能减少子查询的层数

尽可能在子查询中进行数据筛选

尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

5.Oracle里varchar2的最大长度?

字段类型:Oracle SQL varchar2的最大支持长度为4000个字节(bytes)

变量类型:Oracle PLSQL varchar2最大支持长度为32767个字节(缓冲区)

6.innerjoin、leftjoin、rightjoin、fullout join有什么区别?

left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,leftjoin是以左表为准的.。 换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID),B表记录不足的地方均为NULL。

范例代码:

SELECT C.First_Name, C.Last_Name,O.Order_Id FORM Customer AS C LEFT JOIN Order AS O ON C.Customer_ID = O.Customer_ID

right join和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充。

inner join只显示出了 A.aID = B.bID的记录,这说明innerjoin并不以谁为基础,它只显示符合条件的记录。

7.查询分组后,每个分组前几条记录?

建表语句:

/* 创建表并初始化数据 */

drop table if exists Orders;

create table Orders(

id int primary key auto_increment,

Company varchar(255),

OrderNumber varchar(255),

);

插入数据:

insert into Orders(Company,OrderNumber,pid) values('IBM','3532',1);

insert into Orders(Company,OrderNumber,pid) values('IBM','4211',1);

insert into Orders(Company,OrderNumber,pid) values('IBM','2342',2);

insert into Orders(Company,OrderNumber,pid) values('IBM','12345',3);

insert into Orders(Company,OrderNumber,pid) values('W3School','45323',1);

insert into Orders(Company,OrderNumber,pid) values('W3School','2356',2);

insert into Orders(Company,OrderNumber,pid) values('Apple','4538',1);

insert into Orders(Company,OrderNumber,pid) values('Apple','4698',2);

insert into Orders(Company,OrderNumber,pid) values('Apple','3234',2);

insert into Orders(Company,OrderNumber,pid) values('Apple','3232',3);

insert into Orders(Company,OrderNumber,pid) values('W3School','6953',3);

insert into Orders(Company,OrderNumber)values('W3School','6953');

查询语句:/* 查询Orders表,以Company分组,查出每组中的前两个记录 */

SELECT * FROM Orders o WHERE 2 >(SELECTcount(*) FROM Orders WHERE Company = o.Company and OrderNumber >o.OrderNumber);

8.Mysql和Oracle数据库的区别?

Oracle是付费的,安全性能更高,一般银行系统这种安全性要求很高的系统都是用Oracle

Oracle对权限的管理非常细致,做的非常好,大概有159种权限,Mysql只有27种

主键,Oracle不可以实现自增,Mysql可以实现自增,Oracle需要新建序列实现,SEQ_USER_Id.nextval

Oracle的分页方法和Mysql的分页方法比起来非常麻烦,Oracle需要用到个子查询,Mysql用一个limit方法搞定,而且分页时,Mysql的游标从0开始,Oracle从1开始

Mysql属于中型数据库,Oracle属于大型数据库,但并不是说Mysql不能支撑大型应用,而是从功能上来看,Oracle拥有更丰富和完善的功能,不过一般我们也是使用他的一部分常用功能,而这一部分功能Mysql也是具备的 在程序员的角度上来说,Mysql比Oracle更加简单一些 在细节的使用上来说Mysql在字符串上可以用单引号也可以用双引号,Oracle则必须使用单引号

JavaSE

1.要求在不允许引入第三个变量的情况下交换var a=1; var b=2;

方法一: a=a+b; b=a-b;a=a-b; 输出a,b可以发现两值已经交换

方法二: a=a^b; b=a^b;a=a^b;

2.使用正则表达式验证邮箱

var re =/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/ ;

3.JSP的九大内置对象和四个作用域

九大内置对象:

request请求对象 用户端请求,此请求会包含来自GET/POST请求的参数作用域 Request

response 响应对象 网页传回用户端的回应 作用域 Page

pageContext 页面上下文对象 网页的属性在这里管理 作用域 Page

session会话对象 与请求有关的会话期 作用域 Session

application 应用程序对象 servlet正在执行的内容 作用域 Application

out 输出对象用来传送回应的输出 作用域 Page

config配置对象 servlet的构架部件 作用域 Page

page 页面对象 JSP网页本身 作用域 Page

exception 例外对象 针对错误网页,未捕捉的例外 作用域 page

四个作用域:page、request、session、application

Page范围是当前页面

Request 范围是当前请求周期(从请求发起到服务器处理结束,返回响应的整个过程)

Session范围当前会话(用户打开浏览器开始,到用户关闭浏览器并且会话失效的整个过程)

Application 范围是整个应用,从应用启动到应用结束

4:FileWriter和PrintWriter有什么区别?

在写文件时我认为:

PrintWriter out =new PrintWriter(new BufferedWriter(new FileWriter(filename)));

比较好点

PrintWriter 提供print系方法

BufferedWriter 提供缓冲,用以加速

FileWriter 用于写文件

FileWriter类/FileReader类:

用于对字符文件的读写的便捷的结点流类

使用时最好用BufferedReader/BufferedWriter对其进行包装。

PrintStream类(如System.out):

格式化打印输出字节数据的流,该类提供的print[ln]()方法可格式化打印输出各种类型的数据(包括类对象) 它使用平台的默认字符编码将所有字符都转换为字节打印输出(写入)在需要写入字符而不是写入字节的情况下,应该使用PrintWriter类

5:简述JSP和Servlet的关系?

JSP---Java Server Pages

拥有Servlet的特性与优点(本身就是一个Servlet)

直接在HTML中内嵌JSP代码

只有当客户端第一次请求JSP时,才需要将其转换、编译Servlet代码

优点:

优良的性能 优于CGI,PHP,ASP

平台无关性 操作系统无关,Web服务器无关

可扩展性 标签库Tag的扩展机制,简化页面开发——Taglib uri

Servlet是在Web服务器上的Java程序,它提供服务,由它来传递给你html的格式

Servlet是服务器小小的Java应用程序

用来完成B/S架构下,客户端请求的响应处理

平台独立,性能优良,能以线程方式运行

Servlet API为Servlet提供了统一的编程接口

Servlet一般在容器中运行(必须部署在Servlet容器,才能响应客户端的请求,对外提供服务,要对外统一接口,由容器来调用)

JSP在被第1次访问的时候 会被转义编译成类Servlet也可以说JSP就是一个Servlet

2者的区别:JSP是Html中内嵌Java代码;Servlet把Html代码和Java代码分离开

JSP侧重与显示;Servlet侧重与控制逻辑

6:简述JAVA设计模式的概念?

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

7.部署在不同Tomcat的两个项目间如何通信?

使用WebService技术实现 、使用Socket技术实现 、使用Http请求技术实现

8.请你谈谈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是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。

9.AJAX的优缺点?

优点:

局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验

使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力

减轻服务器的负担,按需取数据,最大程度的减少冗余请求

基于XML标准化,并被广泛支持,不需安装插件等

缺点:

AJAX大量的使用了JavaScript和AJAX引擎,这些取决于浏览器的支持。在编写的时候考虑对浏览器的兼容性IE5.0及以上、Mozilla1.0、NetScape7及以上版本才支持,Mozilla虽然也支持AJAX,但是提供XMLHttpRequest的方式不一样 AJAX更新页面内容的时候并没有刷新整个页面,因此,网页的后退功能是失效的;有的用户还经常搞不清楚现在的数据是旧的还是已经更新过的这个就需要在明显位置提醒用户“数据已更新”对流媒体还有移动设备的支持不太好等,比如手机还有平板电脑

10.Java基础数据类型有哪些?最大长度分别是多少位?多少字节?

整数类型:

Byte 8位 1字节 范围:-128 ~ 127范围:-27 ~ 27-1

Short 16位 2字节 范围:-32768 ~ 32767 范围:-215 ~215-1

Int 32位4字节 范围:-2,147,483,648 ~2,147,483,647 范围:-231 ~ 231-1

Long 64位8字节 范围:-9,223,372,036,854,775,808~+9,223,372,036,854,775,807范围:-263 ~ 263 -1

浮点数型:

Float 32位4字节 范围:-3,40292347E+38 ~+3,40292347E+38范围:

Double 64位8字节 范围:-1.79769313486231576E+308~ 1.79769313486231576E+308范围:

其他类型:

Char 16位2字节(默认Unicode编码) 范围:‘\u0000′ ~ ‘\uFFFF’ 范围:

Boolean 1位0.125字节(8分之1字节) 范围:true/false

11.String有哪些方法?

trim() 去掉起始和结尾的空格

charAt (int index) 返回index所指定的字符

concat(String str) 将两字符串连接

equals()比较两个字符串

length()返回字符串的长度

replace(char old ,char new) 将old用new替代

valueOf()转换为字符串

substring(int1,int2) 取出字符串内第int1位置到int2的字符串

indexOf() 查找字符或者子串第一次出现的地方,lastIndexOf()查找字符或者子串是后一次出现的地方

startsWith(String str) 测试字符串是否以str开始,endsWith(Stringstr) 测试字符串是否以str结尾

getBytes将字符串转换成字节数组返回,toCharArray 将字符串转换成字符数组

toLowerCase() 将字符串内的字符改写成小写,toUpperCase() 将字符串内的字符改写成大写

12.冒泡排序的代码?

基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

实例:

冒泡排序(bubble sort):冒泡排序,每次两个相邻的值进行比较,内层循环结束,最后出现最大值。

/*

冒泡排序,每次两个相邻的值进行比较,内层循环结束,最后出现最大值。

内层循环arr.length-1 避免角标越界

arr.length-x 减少参与比较的数,因为这些数,已经是最大值,排在最后,没有必要参与比较。

*/

public static void bubbleSort(int[] arr){

for(int x=0;x

for(int y=0;y

if(arr[y]>arr[y+1]){

int temp =arr[y+1];

arr[y+1]=arr[y];

arr[y]=temp;

}}}}

13.递归算法题

一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于10000时,把值按照指定顺序输出来。先顺序后

逆序

public static void main(String[] args)throws Exception {

doubleNum(512);

}

public static void doubleNum(int n) {

System.out.println(n);

if (n <= 10000)

doubleNum(n * 2);

System.out.println(n);

}

14.JS中有哪些数据类型?

Undefined、Null、Boolean、Number、String、Object、Array、Function。

JavaScript有三种基本数据类型(字符串、数值、布尔 ),两种引用数据类型(对象、数组)和两种特殊数据类型(Null 、Undefined )。

15.String和StringBuffer的区别?

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。

String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。

典型地,你可以使用StringBuffers来动态构造字符数据。

另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

16.StringBuffer与StringBuilder的区别?

StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

String 不可变每次对其操作都会在数据池产生一个新的对象,不适合使用在对字符串进行频繁修改的场景

StringBuffer和StringBuilder可变,对其修改不会产生新的对象其两者区别在于StringBuffer线程安全而StringBuilder线程不安全,StringBuilder是线程非安全的效率比StringBuffer高

比喻:

String是一个商品

StringBuffer/StringBuilder是生产这个商品的流水线,

StringBuffer速度慢,但(线程)安全性高

StringBuilder速度快,但(线程)安全性差

17.把一个字符串类型的日期 转换成Date类型?

String brithday = new String("1991-02-02");

SimpleDateFormat sdf1 = newSimpleDateFormat("yyyy-MM-dd");

Date date = sdf1.parse(brithday);

System.out.println("将字符串转化为时间是" + date);

日期转换为字符串:

SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMDDHHMMSSmmm");

System.out.println(sdf2.format(new Date()));

18.和<%@includefile=""%>有什么区别?

动态:--动作,运行时包含,先处理后包含

父页面和包含进来的页面单独编译,单独翻译成servlet后,在前台拼成一个HTML页面。

a.能自动区分被包含文件是静态还是动态;

b.如果被包含文件是静态文件,处理方式跟第1种方式一样,

如果是动态文件,则各自处理完之后把结果包含进来发给客户端。

静态:<%@include file=""%>--指令,编译时包含,先包含后处理

父页面和包含进来的页面,代码合并后,才一起翻译成servlet,反馈到前台,形成一个HTML页面。

a.不管被包含文件是静态还是动态,直接将页面中的全部内容包含进来;

b.执行时先将包含进来的内容一起处理完之后再将所有的内容发给客户端。

19.什么叫面向接口编程?有什么好处?

在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。

这样做的好处是显而易见的,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,就像我们将一个WD的60G硬盘换成一个希捷的160G的硬盘,计算机其他地方不用做任何改动,而是把原硬盘拔下来、新硬盘插上就行了,因为计算机其他部分不依赖具体硬盘,而只依赖一个IDE接口,只要硬盘实现了这个接口,就可以替换上去。从这里看,程序中的接口和现实中的接口极为相似,所以我一直认为,接口(interface)这个词用的真是神似!

使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,就像造硬盘的不用等造CPU的,也不用等造显示器的,只要接口一致,设计合理,完全可以并行进行开发,从而提高效率。

20.事务的概念?开发中如何使用事务?

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

MySQL数据库开启事务命令:

start transaction 开启事务

rollback回滚事务

commit提交事务

savepoint 设置回滚点

rollback to savepoint 回滚到指定的回滚点

21.一个表有birthday字段类型为date,让你查出年龄?

SELECTname,(year(now())-year(birthday)) AS age FROM Student;

智力题:一个房间有三个灯泡,开关在房间外面,你只能进房间一次,找出灯泡和开关的对应关系 先开第1个开关,开较长时间再关掉,然后开第2个开关,马上进有灯泡的房间。

如果是亮的,是第2个开关。

如果是暗的,就摸一摸,热的就是第1个开关,冷的就是第3个开关。

22.JSON与XML的区别?

相同之处两个都是存放数据的。要说不同,那就是存数据的方式不一样,xml数据写在xml文件中,而json需要程序添加数据,xml是一个特殊的数据文件必须符合一定的规则

格式不同,XML是标签式的:aaa bbb,JSON是键值对形式的:book:{ name:aaa, writter:bbb },JSON更加轻量级,XML开始使用比较早,而且很严谨,两者都有广泛应用,不过现在比较推荐JSON。

23.Tomcat的默认端口号是多少,如何更改端口号?

8080是Tomcat服务器的默认的端口号。

我们可以通过修改Tomcat服务器的conf目录下的主配置文件server.xml来更改。

用记事本打开server.xml文件,找到如下部分:修改port的值即可

24.List与Set有什么区别?

Set List都继承 Colltction。

List接口与其实现类是容量可变的列表,可按索引访问集合中的元素,是有序的集合。

Set是一种不包含重复元素的Collection,也就是说 Set中只能有一个null元素。

List和Set是两个接口,其定义的数据类型都有自己的特点

List是顺序结构,可以是数组也可以是链表,Set就是集合,跟数学里的集合定义样,无重复(没有任何两个对象的equals方法是true)。

25.说出JAVA中一些常用的类,包,接口,请各举5个?

类:Object、String、Integer、System、file、FileInputStream、FileOutputStream

包:lang包、io包、util包、sql包、date包、

接口: List、Map、Iterator、Connection、Writer、Reader、InputStream、OutPutStream

26.常见的异常有哪些,举几个,并说出它们是如何出现的呢?

NullPointException空指针异常

IOException输入输出流异常

ClassNotFoundException类型转换异常

ArrayIndexOutOfBoundsException下标越界异常

NumberFormatException数字格式化异常

FileNotFoundException文件未找到异常

SQLException操作数据库异常

NoSuchMethodException方法未找到异常

27.int和Integer有什么区别,Integer下有哪些常用方法?

int是Java提供的8种基础数据类型之一。Java为每个原始类型提供了包装类,Integer是java为int提供的包装类。

int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。

28.面向对象的特征有哪些?解释一下每一个?

封装指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

封装实际上有两个方面的含义:把该隐藏的(对象的属性和实现细节)隐藏起来,把该暴露的(方法)暴露出来。这两个方面都需要通过使用Java提供的访问控制符来实现。

继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法。Java的继承具有单继承的特点,每个子类只有一个直接父类。

多态指的是子类对象可以直接赋给父类变量,但运行时依然表现子类的行为特征,这意味着同一个类别的对象在运行时可能表现出不同的行为特征。

只有子类重写了父类的方法。使用父类类型创建的引用变量,所赋的值为子类类型创建的实例(对象)时,用这个新建的对象调用子类重写父类的方法才会出现多态。

也就是说多态有3个条件:1、继承 2、重写(子类重写父类继承的方法) 3、父类引用指向子类对象

好处: [封装:安全] [继承:重用] [多态:灵活]

29.说说什么是分布式和集群?

分布式强调同一个业务被分拆成不同的子业务,被部署在不同的服务器上(可能是性能的问题,也可能是安全的问题,也可能是模块对服务器的需求不同的问题将业务进行分解),服务器可以跨域也可以同域。

而集群偏重平行处理,一台服务器不能提供足够的能力,而采用多台服务器并行处理一个问题。

集群是指所有的设备共同完成相同的功能,每一个设备的功能都是完整的,但是在外界看来是一个设备。

分布式是所有的设备集结后,共同组成一个体系,相互之间协同工作,同时又各自完成自己的相应的工作,但是所有的功能不是在一个设备上,而是由不同的设备完成,但是由一个设备作为统一的接入点和协调点。

30.说说你对TCP和UDP协议的了解?

TCP

Transmission Control Protocol (传输控制协议)

特点:

面向连接、可靠、效率稍低

通过三次握手,建立连接,形成传输数据的通道。在连接中进行大数据量传输

例如:

因为TCP协议能够发现丢失的传输数据并重新发送,所以适合文件传输,接收邮件

UDP

User Datagram Protocol (用户数据报协议)

特点:

无连接、不可靠、速度快

将数据及源和目的封装成数据包中,不需要建立连接。每个数据报的大小在限制在64k内

例如:

UDP协议不能保证传输没有丢失

视频通话,即时通信,IP电话 (VoIP)电话

UDP需要学习使用的类:

DatagramSocket

DatagramPacket

需要建立发送端,接收端。

建立数据包。将数据存储在数据包中.

调用Socket的发送接收方法。

关闭Socket。

发送端与接收端是两个独立的运行程序。

UDP发送:

第一步:创建Socket

需要创建Socket, 发送端不需要指定ip地址和端口, 使用本机地址发送, 会自动找到未使用的端口。

需要使用DatagramSocket此类表示用来发送和接收数据报包的套接字。

java.lang.Object

java.net.DatagramSocket

可以通过构造函数创建该Socket对象

DatagramSocket socket = newDatagramSocket();

第二步:创建数据包

发送时需要创建数据包如何创建数据包?使用DatagramPacket

java.lang.Object

java.net.DatagramPacket 此类表示数据报包。

创建数据包时需要通过构造函数指定发送的数据(字节数组),数据长度(数组长度),接受方的IP地址(InteAddress类),接受方端口号(port)。

构造函数:

DatagramPacket(byte[] buf, int length,InetAddress address, int port)

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

第三步:发送数据

有了Socket 有了数据,如何发送数据包?使用Socket的send方法将数据包发送出去

voidsend(DatagramPacket p)

从此套接字发送数据报包。

第四步:关闭Socket

使用Socket的close方法关闭。

void close() 关闭此数据报套接字。

注意: 在发送端,要在数据包对象中明确目的地IP及端口。

UDP接收

第一步:需要创建Socket,

接收时必须指定端口号.

DatagramSocket socket = new DatagramSocket(8888);

第二步:创建数据包,

接收时也需要创建数据包, 用来存储数据. 需要一个字节数组.

DatagramPacket packet = newDatagramPacket(new byte[1024], 1024);

接收数据

第三步:接收数据

使用DatagramSocket 的receive方法接收数据.该方法需要指定数据包.

socket.receive(packet);

第四步: 从数据包中获取数据

byte[] data = packet.getData();

第五步:获取数据长度

int len = packet.getLength();

第六步:获取发送端ip地址

packet.getInetAddress().getHostAddress();

第七步:获取发送端端口号

packet.getPort();

第八步:关闭socket

socket.close();

注意: 在接收端,要指定监听的端口。

TCP客户端

第一步:创建客户端Socket

需要指定连接到服务器的地址和端口号, 并尝试连接

客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。

Socket socket = newSocket("192.168.1.220", 8888);

第二步:连接成功获取输入输出流

连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通getInputStream(),getOutputStream()获取即可。

socket.getInputStream();

socket.getOuputStream();

第三步: 将数据写出到服务端

使用字节输出流的write() 方法

第四步:关闭socket

调用close方法

连接成功之后获取输入输出流

socket.getInputStream();

socket.getOuputStream();

获取流之后就可以通过输入输出流发送和读取数据了, 客户端的输入流连接服务端输出流, 客户端输出流连接服务端输入流

客户端案例:

public class TcpClient {

public static void main(String[] args) throws IOException, IOException{

System.out.println("客户端启动...");

// 创建客户端

Socket socket = new Socket("127.0.0.1", 50000);

// 与服务端建立连接,获取输入输出流

InputStream in = socket.getInputStream();

OutputStream out = socket.getOutputStream();

// 将数据写出到服务端

System.out.println("客户端发送数据...");

out.write("Tcp,你好我是客户端...".getBytes());

// 关闭socket

out.close();

}

}

TCP服务端

第一步: 创建服务端

ServerSocket, 需要指定端口号. 客户端连接的就是这个端口.

java.lang.Object

java.net.ServerSocket

创建ServerSocket

ServerSocket serverSocket = newServierSocket(8888);

第二步:和客户端建立连接

通过accept方法

Socket accept()

侦听并接受到此套接字的连接。

该方法会侦听是否有客户端连接,如果有建立连接,并获取客户端的Socket

也就是说服务端创建之后可以获取客户端连接, 返回一个Socket对象, 这个Socket就是和客户端连接的Socket

Socket socket = serverSocket.accept();

第三步: 接受客户端的数据,获取客户端的数据

服务端获取这个socket的输入输出流, 就可以和客户端发送接收数据了socket.getInputStream();

socket.getOutputStream();

第四步:获取客户端的ip地址和端口号

使用服务端获取的Socket 获取ip地址和端口.

InetAddress getInetAddress()

返回套接字连接的地址。

int getPort()

返回此套接字连接到的远程端口。

第五步:关闭客户端和服务端

在服务端中分别调用close方法.

31、jQuery中AJAX发送请求的方法,get请求和post请求有什么区别?

get是从服务器获取数据,post是向服务器发送数据

get是小数据量传输,post是大数据量传输

get请求的参数队列会在是通过url地址传输,在url地址上就能看到传输的参数,post看不到

get安全性低,post安全性高,但get的执行效率比post高

如果是传输机密信息建议用post

如果是数据查询建议用get

32.Java启动参数Xms和Xmx的含义?

参数名含义 默认值

Xms初始堆大小 物理内存的1/64(<1GB)

Xmx最大堆大小 物理内存的1/4(<1GB)

Xmn年轻代大小

Xss每个线程的堆栈大小

33.如何格式化double数据,保留小数点后x位,有多少种方式?

这里我们拿 Math.PI来讨论,保留两位小数点。(PI = 3.141592653589793)圆周率&pi;

【方案1】

Math.round( Math.PI * 100 ) /100.0

Math.PI * 100 = 314.1592653589793

Math.round(314.1592653589793) = 314

314 / 100.0 = 3.14 (注意这里要除以 100.0,如果除以100的话,会是整除)

【方案2】

String.format( "%.2f", Math.PI)

String类的静态方法

【方案3】

new DecimalFormat("#.00").format(Math.PI)

java.text.DecimalFormat

34.Final、finally、finalize的区别?

Final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

因此一个类不能既被声明为 abstract的,又被声明为final的。

将变量或方法声明为final,可以保证它们在使用中不被改变。

被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。

被声明为final的方法也同样只能使用,不能覆盖(重写)。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。

方法名,Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

它是在 Object 类中定义的,因此所有的类都继承了它。

子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

注意:finalize不一定被JVM调用,只有当垃圾回收器要清除垃圾时才被调用。

35.概述MVC体系结构?

MVC是Model-View-Controller的简写。

M代表业务逻辑层(通过JavaBean,EJB组件实现)。

V是视图层(由JSP页面产生)。

C属于控制层(一般可以用基础的Servlet实现,也可用Struts等开源框架实现)

通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

36.说说ArrayList,Vector,LinkedList的存储性能和特性?

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。

37.short s1 = 1; s1 = s1 + 1;有什么错? shorts1 = 1; s1 += 1;有什么错?

short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)

short s1 = 1; s1 += 1;(可以正确编译)

相关文章
最新文章
热点推荐