JAVA面试复习目录,顺利迎战面试

3、SOAP是什么:simple object access protocal,简单对象访问协议,它是作为一个基于xml格式的协议,用于在网络上传输数据。底层是基于http协议的,可以这么理解:soap=http+xml,而http协议的底层又是基于TCP/IP协议的。soap现有两个版本1.1和1.2。

4、SOAP的组成如下:

Envelope – 必须的部分。以XML的根元素出现。

Headers – 可选的。

Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

5、java调用webserivce的四种房四海

1>.利用wsimport命令生成客户端调用的java代码

2>.利用HttpUrlConnection对象,手工拼接soap协议报文,向服务器发送请求获取数据。

3>.通过ajax调用js+xml跨域请求,这个浏览器是不支持的,但是我们可以绕过去

4>.

第十三章:中科商贸物流管理系统

面试题:说一下你最近做的一个系统。

最近我们开发的一套系统是给中科商贸公司开发的,这公司是做小型电器出口的,最近几年业务做到海外去了,随着他们公司不断壮大,原来那套系统已经没办法满足他们的发展需要了,所以他们公司领导就想搞一套物流系统,提高他们的办公效率。整个系统有仓储管理(包括:采购单、仓库、货物、条形码、入库、出库、退货、盘点、库存、库存上限报警、统计查询)、展会管理(包括:展会管理、出单管理)、货运全流程管理,包括购销合同、出货表月统计、出口报运、装箱单、海运委托单、发票、财务统计、决策分析(包括:成本分析图、销售情况统计、重点客户、经营情况同期比对统计、工作绩效等)这么些功能。我在这个项目中,负责货运管理部分模块的开发以及决策分析报表的开发。

货运管理模块里,我负责开发合同管理、报运管理、装箱管理、生产厂家模块。这三个模块之间是紧密联系的,所谓合同管理就是对中科商贸公司所有的合同进行CRUD的操作、合同下的货物管理、货物下的附件管理。在这个模块里,最复杂的地方是需要理清合同、货物、附件、生产厂家之间的关系以及货物信息的导出处理。一个合同包含多个货物,一个货物可以有多个附件,一个生产厂家可以生产多个货物,所以合同跟货物之间是一对多的关系,货物跟附件是一对多的关系,生产厂家跟货物之间是一对多的关系。理清了这一层关系后,开发起来就简单了。

在我们物流项目中,有很多的设计技巧和开发亮点,比如说:

1、在操作货物信息和附件信息的时候,在合同列表中,为了方便用户录入货物信息,我们在每条合同信息后面,加了一个货物的超链接,点击货物的超链接,可以进入货物信息管理页面,对货物进行CRUD操作,由于货物信息每次录入的比较多,为了方便用户快速录入,每次录入一条货物信息后,我们还是跳转到该货物信息录入界面,同时,了解到用户每次录入货物信息的时候都是一次性录入多个厂家的多个信息,所以我们在跳到该页面的时候,进行了生产厂家等信息的回显,这样极大的提高了用户操作效率。

2、在录入附件信息的时候,用户以往的系统是点击一条合同信息进入到该合同对应的货物列表页面,再点击货物列表中的一个超链接进入到附件列表页面,当用户想直接录入附件信息的时候,需要点几次才能到达附件页面,所以我们在设计这个的时候,直接在合同列表页面加了一个附件按钮,点击这个超链接直接进入到附件录入页面,在这个录入页面,给用户提供一个货物信息的下拉框进行选择,这样又方便了用户的附件信息的录入了。

3、在合同管理界面,我们提供了合同的批量复制功能。

4、在导出出货表的时候,为了避免多线程安全问题,后下载的文件覆盖前下载的文件,我们采用了按照时间点自动分目录的方式,文件名采用UUID算法命名。

5、当系统上线时间长了,系统的历史合同数据、历史货物信息、历史附件信息数据越来越多,严重影响了系统性能,我们对系统提供了历史数据归档功能,当用户点击归档按钮的时候,将每年数百万的历史数据导出到excel文件中。

6、在生产厂家信息维护界面,为了方便用户录入,我们采用了自定义的一个js控件进行了批量新增和批量修改,这样加快了用户操作的速度。

7、系统上线后,出现了很多性能问题,反应速度不是很快,用户不太满意,为此,我们做了一个系统性能的分析,利用struts2的拦截器,在拦截器中,对所有用户访问的哪个类的哪个方法、方法执行消耗的时间等进行记录,并存储到数据库中,然后用amFlash技术做性能分析报表,找到系统的性能瓶颈,然后针对性的进行优化,两个礼拜后,我们对系统的性能报告进行分析,发现,用户主要访问的模块在上午8:30-9:30,主要访问的模块是货物信息录入、查询以及附件信息的录入查询,因为这个点是上班时间点,而且录入货物信息和附件信息较多,所以,针对这几个方法,我们采取了以下优化策略:

1>、利用hibernate抓取策略进行优化,尽量减少增加、和查询的sql语句;

2>、报表查询时,采用原生态的sql语句,不用hibernate的hql语句,使用Spring的JdbcTemplate模版,为此,我们单独又写了一个spring配置文件,这个配置文件的作用是配置数据库连接池和给JdbcTemplate模版注入属性,对于加载Spring配置文件的这个类,我们采用单例设计模式,避免多次创建对象实例,做到了性能最优和线程安全。

3>、对数据字典进行二级缓存的配置,避免多次与数据库的交互。

8、在这个项目中,我们还用到了JBPM工作流技术,在合同录入完毕后,需要中科商贸公司的法务部进行审核,然后提交到总经理进行审核,这是一个典型的工作流程。

9、导出出货表的技术我们使用了POI,能够导出图文并茂的出货表,还能够对商品价格进行自动计算,不需要购买第三方报表,给用户省去了买报表的钱,得到了用户的肯定。

第十四章:设计模式总结

设计模式是前人经验的总结,前辈们解决问题的一些好的方法,它是用来解决一些重复出现的问题、特定问题的解决方案,抽象出来就成了设计模式了。比如单例设计模式、工厂设计模式、代理设计模式、模版方法设计模式、装饰设计模式、观察者设计模式、策略设计模式。我们项目中用到的设计模式有如下几个:

1、单例设计模式

所谓单例设计模式,就是说内存中只有一份对象的实例,单例模式呢,有三个要素,第一个就是要求对象的构造函数是私有化的,这样,外部就不能直接创建你对象的实例了,第二个是提供一个私有的静态的类类型的变量;第三个是提供一个静态的public的方法,这个方法用于向外部提供你这个对象的实例;对于那个私有的静态的类类型的变量,你可以直接给它赋值,这种方式叫做饿汉式加载,因为变量是静态的嘛,所以在加载这个类的字节码的时候就会实例化这个类对象,也可以不赋值,在getInstance方法中给它赋值,这种方式叫懒汉式加载,这种方式有个缺陷,就是当高并发访问的时候会出现安全问题,我们可以通过在getInstance方法上加synchronized关键字来解决这个安全问题,但是直接在方法上加同步关键字,有一点点性能影响,我们可以在方法内部,通过两个if判断+同步关键字的方式,来同时解决线程安全问题和性能问题。

我们项目中有用到这个单例模式,我做的那个物流管理项目,采用的是混合架构,在操作数据库的时候,对于普通的对性能要求不高的方法我们采用hibernate来做,对于像报表统计和大批量数据的查询操作,我们采用Spring框架的JdbcTemplate模版,单独配置了一个配置文件,然后定义了一个AppContext类,这个类就是单例的,它的作用是加载这个配置文件,这个配置文件只加载一次就可以了,我们是将这个加载工作放在AppContext这个类的构造函数中加载的,所以我们这个AppContext类自然而然就设计成单例模式了。

2、工厂设计模式

所谓工厂设计模式就是说我们对象的创建依让另外一个对象帮我们来创建java编程中,我们通常用面向接口来编程,就是说我们要创建一个对象的时候,不直接创建对象,而是在等号左边用接口类型来接收,等号右边用具体的实现类,

比如:Person p = new American();这样做的好处是让我们的封装隔离,就是说接口只负责定义一个具体的骨架,具体的算法和实现在具体的实现类中去做。但是像上面我说的这种Person p = new American()的写法,客户端调用这个p中的方法的时候还是依赖了具体的实现类,虽然外部不知道你里面怎么写的,但是内部你还是依赖了这个具体的实现类,这样的代码耦合度还是太高,所以我们通过采用另外一个类来创建这个Person接口类型的一个对象,这个类就是工厂类,它负责创建这个Person接口类型的对象,在创建的时候他可以进行逻辑判断,然后决定创建哪个具体的实现类给你。

我们的这个Spring框架就是这个原理,在我们进行三层架构开发的时候,业务层依赖DAO层,Action依赖Service层,为了降低三层之间的依赖,我们采用spring框架来帮我们解耦,只需要在Action中定义service组件的引用,在service层定义DAO层的引用即可,具体的实现类我们不给,在容器初始化的时候,Spring容器获取配置文件中的信息,利用工厂给每个组件创建具体的实现类,这样降低了各组件之间的依赖,增加了程序的可扩展性。你比如说一个银行系统,建设银行和农业银行调用的数据都是从一个数据库来的,他们的DAO层和表现层都是一样的代码,但是每个银行具体业务不一样,如果用以往的面向接口的方式开发业务层,我们每个银行不但要开发各自的业务逻辑层代码,还要修改Action层的代码,这样的维护量是非常大的,但是如果用工厂方式来创建所有的对象,每个银行只需要开发自己的业务层代码即可,然后修改配置文件配置各层之间的依赖关系即可。这样是工厂模式的好处。

3、责任链设计模式

4、代理设计模式

5、装饰设计模式

6、模版方法设计模式

解决问题:提高功能的扩展性。

什么时候用模板方法设计模式:

当定义功能时,功能中一部分可以确定,一部分不确定的时候。就使用模板方法设计模式。

可抽象可不抽象,因为可以有默认的实现。

abstract class Template

{

void template()

{

code...;

method();

code...;

}

abstract void methdo();

}

示例:

abstract class GetTimeTamplate

{

public final void getTime()

{

long start = System.currentTimeMillis();

code();

long end = System.currentTimeMillis();

System.out.println(end-start);

}

abstract void code();

}

第十五章、面试经验总结

1、jdk中的享元设计模式

Long a = 5;

Long b = 5;

System.out.println(a==b);//结果是啥?结果是true

Long a = 200;

Long b = 200;

System.out.println(a==b);//结果是啥?结果是false

为啥呢?因为在jdk1.5以后,对于基本类型的包装类型使用了享元模式,对于-128到127之间的数据,jdk只会创建一次,不会创建多个对象,因为这个区间的数据是经常用的。

注意:这种享元设计模式只对Byte、Short、Integer、Long、Character有效,对于浮点类型的包装类型是无效的,Double a = 5; Double b = 5; System.out.println(a==b);结果是false

2、十万条数据从一端传送到另一端,有什么方式减少带宽、提升传输速度?

答:采用json数据格式传输

3、Struts2 2.3.15版本中有两个漏洞,是利用的ognl验证的漏洞跳过了ognl的验证来攻击服务器的,通过升级版本我们可以解决问题,如果不升级我们还想解决这个问题怎么办?

答:写一个过滤器,过滤掉request对象中所有接收到的参数中的非法字符。

4、svn中分支、合并的用法

svn中,我们一般都分三个文件夹:branches、trunk、tags,

branches存放需要修改的版本

trunk存放正在开发的版本

tags存放稳定的版本

当一个项目,开发成功后,我们从trunk下进行分支,发布一个版本V1.0到tags中

如果这时候用户说需要开发一个V2.0的版本,我们需要在trunk下进行V2.0的开发

如果这时候用户用的V1.0出问题了,我们需要从tags下V1.0的版本进行分支,移动到branches下,命名为V1.0_fixup,然后切换版本库的路径到V1.0_fixup,进行bug修复,修复后提交,然后做分支标记,发布新的版本V1.1到tags下。

svn的作用是什么?

以往不用svn时,会遇到以下一些问题:

1、项目代码混乱

2、每次都备份多个版本的项目,占用磁盘空间大

3、解决代码冲突困难

4、容易引发bug

5、难于追溯问题代码的修改人和修改时间

6、难于恢复到以前正确的版本

7、无法进行权限控制

5、Maven是什么?它和svn有什么区别

Maven是一个项目管理工具,它负责管理这个项目的生命周期,包括清理、编译、测试和打包、部署等,它可以通过pom.xml文件中一小段描述信息(jar包坐标)来管理项目的构建、依赖。

6、线程间是怎么通信的?

多线程之间是怎么通信的呢?比如说一个线程做完了一件事情之后要告诉另外一个线程继续干活,这个怎么做呢?

1>、通过标识符来处理,如果多个线程都能够访问一个标识符,我们可以通过更改标识符的值来控制线程的运行,比如A线程计算完了,我让A线程将标识符的值进行更改,B线程不停的判断这个标识符,一旦是某个值时就执行某段代码。

2>、通过notify()方法唤醒线程池中的一个线程

7、你们用的Lucene中,分词器的词库是怎么做的?

这个我们是用的第三方的IKAnalyzer,这个框架是Lucene框架中Analyzer接口的一个实现,Lucene中的Analyzer是一个分词器接口,IKAnalyzer对其进行了实现,并通过一个配置文件存储了27万常用汉语词典,每个汉语单词以换行符分隔,在客户端调用该分词器的分词方法时,该方法内部会去读取该词典文件,并根据该文件进行分词,另外该分词器的分词方法还会去读取用户自定义的词语文件,并据此进行单词分割。

8>、在Lucene中,关键词高亮显示是怎么做的?

这个就是把关键词找出来,然后给关键词加一个html标签,在页面上显示的时候,这个关键字的样式就改变了。

9>、编写一个程序,判断字符串是否为回文?比如(“121”,”abcdcba”)

public static void main(String[] args) {

String s = "";

System.out.println(isPalindrooms(s));

}

private static boolean isPalindrooms(String s) {

if(s==null || s.equals("")){

throw new RuntimeException("需要判断的字符串不能为空!");

}

char[] chs = s.toCharArray();

int halfIndex = chs.length/2;

for(int i=0,j=chs.length-1; i

if(chs[i] != chs[j]){

return false;

}

}

return true;

}

10、


分享到:


相關文章: