Friday, March 1, 2013

华为面试题


第一题

[java] view plaincopy
  1. package com.zzk.test;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         String str="1234";  
  6.         changeStr(str);  
  7.         System.out.println(str);  
  8.     }  
  9.       
  10.     public static void changeStr(String str) {  
  11.         str="change yes or not?";  
  12.     }  
  13. }  
1234
不会改变
分析:
这个主要涉及到String类型变量的不变性,private final char value[];String类中保存值得成员是这样定义的,所以在类存堆中new出一个String对象后该对象不能再改变。
  主函数中的str与changestr(String str)中的str是两个不同的引用,当调用函数时,把主函数中str引用指向的对象赋值给changestr(String str)中的str,即是changestr(String str)中str与主函数中的str指向同一个String对象,当函数中给str赋值是,由于String类型变量的不变性所以不是去改变"1234" (String str = "1234";)这个对象而是去创建另一个新的对象“welcome”(str = "welcome";),而changestr(String str)中的str这个引用指向它,而不是主函数中的str指向它,所以会出现这样的情况。
  对于String类型变量的赋值,遵循下面的规则,java中有String pool(我估计是由于String对象的不变性,所以java中有String pool)。
  java中有两种赋值方式,一种采用字面值方式的赋值,String s = "aaa"; 查找String pool中是否存在“aaa”这个对象,如果不存在,则在String pool 中创建一个"aaa"对象,然后将String pool中这个对象的地址返回给s这个引用,这样s会指向String pool 中"aaa"这个对象。如果String pool中已经有这个“aaa”对象时java虚拟机不会创建新的对象,而是将这个对象的地址直接返回。
  另一种方式是String s = new String("aaa"); 首先在String pool 中查找有没有这个对象,如果已经有了,则不再String pool中创建了,而是在堆中创建该对象,然后返回堆中该对象的地址。如果没有,则在String pool中创建该对象,并且在堆中也创建该对象,最后返回堆中该对象的地址给s。

改变可以这样改
[java] view plaincopy
  1. package com.zzk.test;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         String str="1234";  
  6.         str=changeStr(str);  
  7.         System.out.println(str);  
  8.     }  
  9.       
  10.     public static String changeStr(String str) {  
  11.         str="change?";  
  12.         return str;  
  13.           
  14.     }  
  15. }  

输出:
change?

 第二题

[java] view plaincopy
  1. package com.zzk.test;  
  2.   
  3. public class Test {  
  4.     static boolean foo(char c) {  
  5.         System.out.print(c);  
  6.         return true;  
  7.     }  
  8.       
  9.     public static void main(String[] args) {  
  10.         int i=0;  
  11.           
  12.         for(foo('A');foo('B')&&(i<2);foo('C')) {  
  13.             i++;  
  14.             foo('D');  
  15.         }  
  16.     }  
  17. }  

输出:
猜测:ABDCBDCB
 对了

分析:
FOR循环里面讲究的条件要为真,与你的判断式是什么没有关系
就像这里,虽然是打印的字母,但是却不是false,所以可以执行
第一次进行循环:
foo('A')打印字母A,(注:这里不是false条件就默认为true条件)
foo('B')打印字母Bi=0,比较(i < 2),条件为true,进行循环体,foo('D')打印D
foo('C')打印字母C
第二次循环:
foo('B')打印Bi=1,比较(i < 2)true,进行循环体,foo('D')打印D
foo('C')打印字母C
第三次循环:
foo('B')打印字母Bi=2,比较(i < 2)false,退出循环,得结果

第三题
[java] view plaincopy
  1. 1class A {  
  2. 2protected int method1(int a, int b) { return 0; }  
  3. 3. }  
  4. Which two are valid in a class that extends class A? (Choose two)  
  5. A. public int method1(int a, int b) { return 0; }  
  6. B. private int method1(int a, int b) { return 0; }  
  7. C. private int method1(int a, long b) { return 0; }  
  8. D. public short method1(int a, int b) { return 0; }  
  9. E. static protected int method1(int a, int b) { return 0; }  
[java] view plaincopy
  1. 答案A C  

此题考查的是继承重写问题.
当一个子类重写父类的方法时,重写的方法的访问权限
必须大于等于父类的访问权限.
在此题中父类中的方法访问权限为protected,子类只能是
protected或public.这时A是符合题意的.
由于选项C的形参和父类的不一样,没有重写的效果,所以
在子类出现也是没问题的.

第四题

[java] view plaincopy
  1. 1public class Outer{  
  2. 2public void someOuterMethod() {  
  3. 3// Line 3  
  4. 4. }  
  5. 5public class Inner{}  
  6. 6public static void main( String[]argv ) {  
  7. 7. Outer o = new Outer();  
  8. 8// Line 8  
  9. 9. }  
  10. 10. }  
  11. Which instantiates an instance of Inner?  
  12. A. new Inner(); // At line 3  
  13. B. new Inner(); // At line 8  
  14. C. new o.Inner(); // At line 8  
  15. D. new Outer.Inner(); // At line 8//new Outer().new Inner()  

选A
内部类的实例化可以在普通方法里,也可以在static方法里实例化.
package com.test.a;

public class Outer
{
    Inner i 
= new Outer.Inner();
    
    
public void method()
    
{
        
new Inner();
    }

    
    
public class Inner{
    }

    
public static void main(String[] args)
    
{
        Outer o 
= new Outer();
        Inner i 
=  o.new Inner();
    }

    
    
static void a()
    
{
        Outer o 
= new Outer();
        Inner i 
= o.new Inner();
    }


}



第五题

Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?

(译:那个方法是servlet用于将其session ID入在一个URL中,该URL写入servlet的响应输出流)

A. The encodeURL method of the HttpServletRequest 
interface.

B. The encodeURL method of the HttpServletResponse 
interface.

C. The rewriteURL method of the HttpServletRequest 
interface.

D. The rewriteURL method of the HttpServletResponse 
interface.

答案:B

请看J2EE API关于此方法的说明:
Encodes the specified URL for use in the sendRedirect method or, if encoding is not needed, returns the URL unchanged. The implementation of this method includes the logic to determine whether the session ID needs to be encoded in the URL. Because the rules for making this determination can differ from those used to decide whether to encode a normal link, this method is separated from the encodeURL method. 
All URLs sent to the HttpServletResponse.sendRedirect method should be run through 
this method. Otherwise, URL rewriting cannot be used with browsers which do not support cookies. 

第六题
Which two are equivalent? (Choose two)
A. 
<%= YoshiBean.size%>
B. 
<%= YoshiBean.getSize()%>
C. 
<%= YoshiBean.getProperty("size")%>
D. 
<jsp:getProperty id="YoshiBean" param="size"/>
E. 
<jsp:getProperty name="YoshiBean" param="size"/>
F. 
<jsp:getProperty id="YoshiBean" property="size"/>
G. 
<jsp:getProperty name="YoshiBean" property="size"/>
此题考查的是JavaBean在jsp中的取值方式.
其中C和G效果是一样的.


 概念题
1.               描述Struts体系结构?对应各个部分的开发工作主要包括哪些?
Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的体系结构与工作原理如下图2所示:
  
  1)模型(Model)  
  在Struts的体系结构中,模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。内部状态通常由一组Actinform Bean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。  
  2)视图(View)  
  视图主要由JSP建立,struts包含扩展自定义标签库(TagLib),可以简化创建完全国际化用户界面的过程。目前的标签库包括:Bean TagsHTML tagsLogic TagsNested Tags 以及Template Tags等。
  
  3)控制器(Controller)  
  在struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。对于业务逻辑的操作则主要由ActionActionMappingActionForward这几个组件协调完成的,其中Action扮演了真正的业务逻辑的实现者,ActionMappingActionForward则指定了不同业务逻辑或流程的运行方向。struts-config.xml 文件配置控制器。

2.    XML包括哪些解释技术,区别是什么?包括:DOM(Document Object Modal)文档对象模型,SAX(Simple API for XML)。DOM是一次性将整个文档读入内存操作,如果是文档比较小,读入内存,可以极大提高操作的速度,但如果文档比较大,那么这个就吃力了。所以此时SAX应用而生,它不是一次性的将整个文档读入内存,这对于处理大型文档就比较就力了


 3.    JSP有哪些内置对象和动作?它们的作用分别是什么?


JSP共有以下9种基本内置组件:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
常用的组件:request、response、out、session、application、exception


[java] view plaincopy
  1. 表结构:   
  2.   
  3. 1、    表名:g_cardapply   
  4. 字段(字段名/类型/长度):   
  5. g_applyno        varchar   8//申请单号(关键字)   
  6. g_applydate     bigint     8//申请日期   
  7. g_state        varchar     2//申请状态   
  8.   
  9. 2、    表名:g_cardapplydetail   
  10. 字段(字段名/类型/长度):   
  11. g_applyno        varchar     8//申请单号(关键字)   
  12. g_name        varchar     30//申请人姓名   
  13. g_idcard        varchar     18//申请人身份证号   
  14. g_state        varchar     2//申请状态   
  15. 其中,两个表的关联字段为申请单号。   
  16.   
  17. 题目:   
  18. 1、    查询身份证号码为440401430103082的申请日期   
  19. Select g_cardapply.g_ applydate from g_cardapply, g_cardapplydetail where g_cardapplydetail.g_idcard=’’ and g_cardapply.g_applyno=g_cardapplydetail.g_applyno   
  20. 2、    查询同一个身份证号码有两条以上记录的身份证号码及记录个数   
  21.   
  22. 3、    将身份证号码为440401430103082的记录在两个表中的申请状态均改为07   
  23. Update g_cardapply. g_state=’07’, g_cardapplydetail .g_state   
  24. 4、    删除g_cardapplydetail表中所有姓李的记录   

 
[java] view plaincopy
  1.    
  2.  create database mianshi  
  3.    
  4. use mianshi;  
  5.    
  6. create table g_cardapply(  
  7.  g_applyno varchar(8),  
  8.  g_applydate bigint,  
  9.  g_state varchar(20)  
  10. )  
  11. go  
  12. create table g_cardapplydetail(  
  13.  g_applyno varchar(8),  
  14.  g_name varchar(30),  
  15.  g_idcard varchar(18),  
  16.  g_state varchar(20)  
  17. )  
  18.    
  19. 1、select a1.g_applydate from g_cardapply as a1 inner join g_cardapplydetail a2 on  
  20. a1.g_applyno=a2.g_applyno where a2.g_idcard="123" ;  
  21.    
  22. 2、select g_idcard,count(g_idcard) from g_cardapplydetail  
  23.  group by g_idcard having count(g_idcard)>=2;  
  24.    
  25. 3、update g_cardapply set g_state=603 from g_cardapply as g_d inner join g_cardapplydetail as g_c on  
  26. g_d.g_applyno=g_c.g_applyno and g_idcard='123';更新第一个表的g_state     
  27.    
  28. update g_cardapplydetail set g_state=603 where g_idcard='123';  

No comments:

Post a Comment