java笔试题.doc_第1页
java笔试题.doc_第2页
java笔试题.doc_第3页
java笔试题.doc_第4页
java笔试题.doc_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序员笔试题Java程序员笔试题说明:该份题目要求在1小时内答完应聘人姓名: 一、 Java基础比较Java 中java.lang.String 类与java.lang.StringBuffer类的比较。Java中java.lang.String类是否可以继承?为什么?答String类是final类故不可以继承String类代表不可变的字符序列(字符串常量) 而StringBuffer类代表可变的字符序列而如果用StringBuffer类的话 则直接加在S1的后面 所以用的时间和空间都比较少String的经常用的方法有 提取字符串char charAt(int index)返回指定索引处的char值;比较字符串、搜索字符串 切割字符串等StringBuffer常用的方法有 append和insert方法可重载这些方法,以接受任意类型的数据String对象传递的时候是值传递,StringBuffer是引用传递.String是一种强不变类型,它的值一旦被赋予之后,在内存中的相应位置上的值就不会变化了.即便你用String的方法:concat(String str)和replace(char oldChar, char newChar)等等,所返回的值都是新创建的一个String类型,而不是在原内存地址上去更改,因此比如这样的一个赋值:String s=Hello Baidu;s=new String(Hello Baidu);这样在内存中其实是开辟了两个内存空间来存放Hello Baidu,前面那个对象依然留在内存当中,而:s=s.concat(!);加上这样一句,s的值变为了Hello Baidu!,在内存中实际上是新创建了一个String对象装Hello Baidu!,而原有的Hello Baidu依然存在StringBuffer就不同了,它是种可变类型,它的值被赋予之后,在运行期同样可以通过它的方法,如append(String str) 操作内存上的值,而不仅仅是它的引用而已,也就是说同样的对s的值进行修改StringBuffer s=Hello Baidu;s.append(!);这样的操作其实只创建了一个StringBuffer的对象,大大节约了内存的开销.从回收的角度上来讲的话,显然StringBuffer对内存的消耗要小的多.Jsp 中Respone.redirect()与Respone.forward()区别?从地址栏显示来说forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.2.从数据共享来说forward:转发页面和转发到的页面可以共享request里面的数据.redirect:不能共享数据.3.从运用地方来说forward:一般用于用户登陆的时候,根据角色转发到相应的模块.redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.4.从效率来说forward:高.redirect:低.forward可以屏蔽掉url,因此比redirect更securityforward传一个Object,redirect只能传String说明Java中接口与抽象类的区别。 接口只能有公有非静态方法的定义,只能有公有最终静态变量。抽象类除了不能实例化(没有构造器),有抽象方法(如同接口的方法),其他跟普通类一样,也因此用于继承,而接口用于实现。获得实现接口或继承抽象类而实现其中的抽象方法的子类实例后的使用就没什么区别啦。尽管抽象类能定义抽象和非抽象的方法,而接口只能有抽象方法。接口与抽象类的另一个不同之处在于接口中定义的方法和变量的声明方式的灵活性很小,规格非常严格:所有接口方法隐含必须都是公共的和抽象的;换句话说,在方法声明中不必实际地输入public 或abstract修饰符,方法总是公共的和抽象的;接口中定义的所有变量必须是公共的、静态的和最终的换句话说,接口只能声明常量,而不能声明实例变量;接口方法一定不能是静态的;因为接口方法是抽象的,所以不能将其标识为final、strictfp或native;接口可以扩展除了其他接口之外的任何内容;接口不能实现另一个接口或类;必须使用关键字interface声明接口;接口类型能够被多态使用。读下面一段程序,写出运行结果-public class BaseClass staticSystem.out.println(aaaaa);BaseClass()System.out.println(11111);public class DerivedClassextends BaseClass static System.out.println(bbbbb);DerivedClass() System.out.println(22222);public class StartRun public static void main(String args) DerivedClass dc1 = new DerivedClass();dc1 = new DerivedClass();aaaaabbbbb11111222221111122222class Stack LinkedList list = new LinkedList(); public synchronized void push(Object x) synchronized(list) list.addLast( x ); notify(); public synchronized Object pop() synchronized(list) if( list.size() = 0 ) wait(); return list.removeLast(); 请问上面这个类中有什么错误?应该怎么解决?谈一下Hashtable、HashMap、HashSet、Vector、ArrayList的区别HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。设计模式中有工厂模式和单例模式,请分别举一个实际应用的例子 简而言之:单例模式是在一个应用中只能有一个该类的实例存在,所以该类的实例中的信息在整个应用中是共享的。工厂模式是为了可以创建多个相似的类的构造类,比如:工厂类:自行车工厂男式自行车类女式自行车类山地车类可以这样得到山地车类的实例:自行车工厂.getIntance(山地); JSP两种包含文件方式的区别:和动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面.请说明在实际应用中,java.sql 包中的Statement 和 PreparedStatement 有何区别.PreparedStatement是预编译的,支持批处理,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,第一: 数据库在执行sql语句的时候如果使用PreparedStatement语句会有一点优势:因为数据库会preparedStatement语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量尽量采用使用?号的方式传递参数),如果sql语句只执行一次,以后不再复用.第二: 在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.基于以下的原因:一.代码的可读性和可维护性.虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:stmt.executeUpdate(insert into tb_name (col1,col2,col2,col4) values (+var1+,+var2+,+var3+,+var4+);perstmt = con.prepareStatement(insert into tb_name (col1,col2,col2,col4) values (?,?,?,?);perstmt.setString(1,var1);perstmt.setString(2,var2);perstmt.setString(3,var3);perstmt.setString(4,var4);perstmt.executeUpdate();二.PreparedStatement尽最大可能提高性能.每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:insert into tb_name (col1,col2) values (11,22);insert into tb_name (col1,col2) values (11,23);即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.三.最重要的一点是极大地提高了安全性.即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.String sql = select * from tb_name where name= +varname+ and passwd=+varpasswd+;如果我们把 or 1 = 1作为varpasswd传入进来.用户名随意,看看会成为什么?select * from tb_name = 随意 and passwd = or 1 = 1;因为1=1肯定成立,所以可以任何通过验证.更有甚者:把;drop table tb_name;作为varpasswd传入进来,则:select * from tb_name = 随意 and passwd = ;drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.概述连接池的原理及优越性数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。数据库连接池的主要操作如下:(1)建立数据库连接池对象(服务器启动)。(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。(4)存取数据库。(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。如何遍历一个集合(collection),并在屏幕上打印出集合中的每个元素public void printStr(Collection cols)for(Iterator it = cols.iterator(); it.hasNext(); )String s = (String)it.next();System.out.println(s);写一个方法,实现字符串的反转,例如:输入abc,输出cbapublic String reverseStr(String str) /代码StringBuilder线程不安全String str = abc; String reStr=new StringBuilder(str).reverse().toString(); System.out.println(reStr);另一方法:static String a(String str)Stack stack=new Stack();char ch=0;String outstr=;for(int i=0;istr.length();i+)ch=str.charAt(i);stack.push(ch);while(!stack.isEmpty()outstr+=stack.pop();return outstr;12、输入为整数数组,请写出如下的排序算法,使得数组data里面存储的数字随数组脚标的增大而依次增大,即越小的数字存储的位置越靠前public void sort(int data) int intLenth = m.length; /*执行intLenth次*/ for (int i = 0; i intLenth; i+) /*每执行一次,将最da的数排在后面*/ for (int j = 0; j b) mj = b; mj + 1 = a; 13、用户在JSP:input.jsp中输入姓名和手机号码,点Done按钮来提交请求到一个servlet: test.java。test.java将输入的姓名和手机号码存储在文件store.txt里。请写出input.jsp,test.java的程序源码,并在input.jsp和test.java中分别通过js和java代码对输入进行校验,如果1)姓名项没有填写或者输入的长度超过了20个字符2)手机号码项没有填写,或者输入了非数字的字符,或者输入的长度不是11位,则返回input.jsp,并给出相应的错误提示Js:function check()var name=document.getElementById(name);var mobile = document.getElementById(mobile);if(name.value.length=0 | name.value.length20)alert(姓名字符数 不对!); .focus();return false; if(checknumber(mobile.value) alert(只允许输入数字!); document.all.mobile.focus();return false; if(mobile.value.length!=11) alert(手机号码为数不够!); document.all.mobile.focus(); return false; var myreg = /(130-91)|1503891)+d8)$/; if(!myreg.test(mobile.value) alert(请输入合法的手机号码!); document.getElementById(mobile).focus(); return false; return true;function checknumber(String) var Letters = 1234567890; var i; var c; for( i = 0; i String.length; i + ) c = String.charAt( i ); if (Letters.indexOf( c ) =-1) return true; return false; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String name=request.getParameter(name);String mobile=request.getParameter(mobile);if(mobile.length()=11 & name.length()0 & name.length()20)FileWriter writer = null;BufferedWriter output = null;File file = new File(c:store.txt);if(file.exists()file.mkdirs();if( file.isDirectory()return ;file.createNewFile();writer = new FileWriter(file,false);output=new BufferedWriter(writer);output.write(name+rn+mobile);output.flush();if(output != null)output.close();elseresponse.sendRedirect(input.jsp);14、有若干条有关城市的信息,每条包括如下属性:ID(唯一递增的序列),CITY(城市名称),DESC(城市说明),要求设计一套数据结构及算法,使得1)所有登陆系统的用户均能使用这些城市信息2)能够根据城市ID号或名称获得城市的其他信息3)如果从该数据结构中找不到合适的城市信息,可以往该数据结构中添加新的城市信息,但相同的城市(号或名称有任意一个相同均认为是同一城市)在数据结构中只能有一条记录)如任一条城市信息,超过两个小时没有被使用(查询)则需自动将其删除public class CityCache二、数据库基础数据库的表中有字段为整型,希望维持自增1的操作。在MS SQL 、ServerMysql和ORACE中分别如何实现?Mysql。它的自增变量个人有认为是最好记的,使用AUTO_INCREMENT关键字,知道英文的就更好记忆了,如下创建一个带有自增变理的表:create table test(id int AUTO_INCREMENT primary key not null,name varchar(50);注:这里的id一定要申明为主键,否则会引来报错。2、Sqlserver使用identity关键字,可以很容易指定从什么数开始,增幅是多少,如下:create table test(id int identity(100,10) primary key not null,name varchar(50);3、Oracle不能够在创建表的时候指定自动关键字,它需要重新创建sequence,然后以创建键.nextval来引用:create table test(id int primary key not null,name varchar(50);create sequence test_id(最好是表名+序列号标记) increment by 1 start with 1 maxvalue 9999;引用的时候就要这样引用了,如下:insert into test(test_id.nextval,www);请写出MS SQL 、ServerMysql和ORACE实现分页算法的sql语句SQL Server从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择:SELECT *FROM ( SELECT Top N *FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2Order by 主键 asc例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT *FROM ( SELECT TOP 20 *FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2Order by sys_id ascOralce数据库从数据库表中第M条记录开始检索N条记录SELECT *FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where row

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论