面试的一家Java公司的笔试

最近去了家公司面试了一下,可以在表现上不好,就被刷掉了,很可惜的一次机会。[题目答案仅参考]

前三道sql选择题

4.Java是怎样传参数的?

有两种:

第一种方法是按值传递(call-by-value )。这种方法将一个参数值(value )复制成为子程序的正式参数。这样,对子程序的参数的改变不影响调用它的参数。

第二种传递参数的方法是引用调用(call-by-reference )。在这种方法中,参数的引用(而不是参数值)被传递给子程序参数。在子程序中,该引用用来访问调用中指定的实际参数。这样,对子程序参数的改变将会影响调用子程序的参数。

5.GC是什么?为什么要有GC

String s = new String("xyz");创建了几个String Object?

GC是垃圾收集的意思(Gabage Collection,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,

Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

创建两个对象:

第一个对象:字符串常量 "xyz " 存在于常量内存区
第二个对象:new String( "xyz ")的时候产生的变量,存在于堆栈中  

 

6.说说数据连接池的工作机制?

数据连接池的工作机制

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

 

连接池的基本原理:

数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池。由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应在请求队列中排列等待,并且应用程序可根据池中连接的使用率,动态增加或减少池中的连接数。

连接池的概念是:连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接。一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程。当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连接池而不是直接释放。

连接池的工作机制

连接池是众多连接对象的“缓冲存储池”,连接池提供一种管理机制来控制连接池内部连接对象的个数,提供应用程序使用的获取、释放连接接口。连接池主要由3部分组成:连接池的建立、连接池中连接使用与释放。下面就着重讨论这3部分及连接池的配置问题

建立连接池

首先要建立一个静态的连接池,在系统初始化时就分配好池中的连接,并且不能够随意关闭。使用Java中的容器类可以很好地构建连接池,:Vector,Stack等。在系统初始化时,根据

配置创建连接并放置在连接池中,以后所使用的连接都是从该连接池中获取。这样就可以避免由于频繁的连接和断开所造成的开销。通过使用连接池将大大提高程序效率,同时,可以通过

其自身的管理机制来监视数据库连接的数量,使用情况等。

连接池内连接的使用与释放

建立好连接池后,还需要提供一套相应的分配、释放等策略来保证数据库的有效复用。当客户请求数据库连接时,首先看连接池中是否有匹配的空闲连接。如果有,则把该连接分配给客户。此时该连接就在多个客户间复用。当客户释放数据库连接时,可以根据该连接是否被复用进行不同的处理。如果连接没有使用者,就放入连接池中,而不是被关闭。

配置连接池

对于数据库连接,一般的配置策略是根据具体的应用需求,给出一个初始的连接池中连接的数目,以及一个连接池可以扩张到的最大连接数目。当连接数目不够用时,连接池将逐个添加数据库连接,直到最大连接数。此后的连接请求被加入请求队列,即如果请求了更多的连接,那么调用者被挂起,直到有一个连接放回连接池。

 

7.PreparedStatementStatement有区别吗?请具体说明

1 我们先从这两个单词进行初步的讲解,Prepared(准备好的, 精制的),从这里可以知道PreparedStatement是预先编译的语句,而Statement则不是预先编译的,在DBMS中处理管理中Statement是要进行语法、语义的,而PreparedStatement则不要。

2 PrepareStatement中执行的SQL语句中是可以带参数的,而Statement则不可以。

比如:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES

SET SALARY = ? WHERE ID = ?");

pstmt.setBigDecimal(1, 153833.00);

pstmt.setInt(2, 110592);

pstmt. executeUpdate();

 

3 当处理批量SQL语句时,这个时候就可以体现PrepareStatement的优势,由于采用Cache机制,则预先编译的语句,就会放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来。

 

8.谈谈你对ActionServlet的认识

ActionServlet类对应的类名为org.apche.struts.action.ActionServlet,它是struts框架的核心控制器组件,所有用户的请求都先由ActionServlet来处理,然后再由ActionServlet把请求转发给其他组件。Struts只允许一个应用中配置一个ActionServlet,但是可以将ActionServlet扩展。

 

Struts提供了一个缺省版本的ActionServlet类,你可以继承这个类,覆盖其中的一些方法来达到你的特殊处理的需要。ActionServlet继承与javax.servlet.http.HttpServlet,所以在本质上它和一个普通的servlet没有区别,你完全可以把它当做一个servlet来看待,只是在其中完成的功能不同罢了。ActionServlet主要完成如下功能:

 

将一个来自客户端的URI映射到一个相应的Action

 

1、如果是这个Action类是第一次被调用,那么实例化一个并放入缓存

2、如果在配置文件(struts-config.xml)中指定了相应的ActionForm,那么从Request中抓取数据填充FormBean

3、调用这个Action类的perform()方法,传入ActionMapping的一个引用,对应的ActionForm、以及由容器传给ActionServletHttpServletRequestHttpServletResponse对象。

actionservlet中应用了命令设计模式。

一个servlet在由容器生成时,首先会调用init()方法进行初始化,在接到一个http请求时,调用相应的方法进行处理;比如get请求调用doget()方法,post请求调用dopost()方法。所以首先看看actionservletinit()方法,你就会很清楚为什么actionservlet可以完成这些功能了。

9.说说DispatcherRedirect的区别

Dispatcher:转发

   使用方式: Request.getRequestDispatcher(url).forward(request,response);

   可以以Request作用域进行数据的传递。以前的request中存放的变量不会失效。

Redirect:重定向

   使用方式:response.sendRedirect(url);

   将会丢失request作用域内的数据,并进入一个新的request作用域。

  

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,

后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。

 

所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。

 

10.写一个类,接受一个参数,如“a1b2c3d4,判断其中是否有字符,如果字符数大于等于4个返回true;否则返回false

 

 

    public boolean CheckString(String str)

    {

       String regex = "//d";

       Pattern pattern = Pattern.compile(regex);

       Matcher matcher = pattern.matcher(str);

       String strAll = matcher.replaceAll("").trim();

       if(strAll.length()>=4)

       {

           return true;

       }else{

           return false;

       }

    }

 

 

11.写一个类,接受两个参数(String name1,String name2,判断其中是否有特殊字符,如“&^,$

 

    public boolean StringFind(String str) throws PatternSyntaxException {

       String regEx = "[&^$]";

       Pattern p = Pattern.compile(regEx);

       Matcher m = p.matcher(str);

       return m.find();

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值