一些Java就业面试题总结


一些Java就业面试题总结
2011年04月15日
   基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法, io 的语法,虚拟机方面的语法
   1 、一个 ".java" 源文件中是否可以包括多个类(不是内部类)?有什么限制?
   可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。
   2. Java 有没有 goto?
   java 中的保留字,现在没有在 java 中使用。
   3 、说说 & && 的区别。
   & && 都可以用作逻辑与的运算符,表示逻辑与( and ),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true ,否则,只要有一方为 false ,则结果为 false
   && 还具有短路的功能,即如果第一个表达式为 false ,则不再计算第二个表达式,例如,对于 if(str != null && !str.equals("")) 表达式,当 str null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将 && 改为 & ,则会抛出 NullPointerException 异常。 If(x==33 & ++y>0) y 会增长, If(x==33 && ++y>0) 不会增长
   & 还可以用作位运算符,当 & 操作符两边的表达式不是 boolean 类型时, & 表示按位与操作,我们通常使用 0x0f 来与一个整数进行 & 运算,来获取该整数的最低 4 bit 位,例如, 0x31 & 0x0f 的结果为 0x01
     备注:这道题先说两者的共同点,再说出 && & 的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。
   4. 用最有效率的方法算出 2 乘以 8 等于几 ? 2 内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用 == 操作符。
   如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如 Objet obj = new Object(); 变量 obj 是一个内存, new Object() 是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用 == 操作符进行比较。
   equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
   String a=new String("foo");
   String b=new String("foo");
   两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即 a b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false ,而这两个对象中的内容是相同的,所以,表达式 a.equals(b) 将返回 true
   在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如, String input = …;input.equals("quit") ,许多人稍不注意就使用 == 进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用 equals 方法。
   如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法, Object 类的 equals 方法的实现代码如下:
   boolean equals(Object o){
   return this==o;
   }
   这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承的)就是使用 == 操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用 equals 和使用 == 会得到同样的结果,如果比较的是两个独立的对象则总返回 false 。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals 方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
   6. BS CS 的联系与区别。
   C/S Client/Server 的缩写。服务器通常采用高性能的 PC 、工作站或小型机,并采用大型数据库系统,如 Oracle Sybase InFORMix SQL Server 。客户端需要安装专用的客户端软件。
   B/ S是 Brower/Server 的缩写,客户机上只要安装一个浏览器( Browser ),如 Netscape Navigator Internet Explorer ,服务器安装 Oracle Sybase InFORMix SQL Server 等数据库。在这种结构下,用户界面完全通过 WWW 浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过W eb Server 同数据库进行数据交互。
   C/S B/S 区别:
   1.硬件环境不同
   C/S 一般建立在专用的网络上 , 小范围里的网络环境 , 局域网之间再通过专门服务器提供连接和数据交换服务
   B/S 建立在广域网之上的 , 不必是专门的网络硬件环境 , 例与电话上网 , 租用设备 . 信息自己管理 . 有比 C/S 更强的适应范围 , 一般只要有操作系统和浏览器就行
   2.对安全要求不同
   C/S 一般面向相对固定的用户群 , 对信息安全的控制能力很强 . 一般高度机密的信息系统采用 C/S 结构适宜 . 可以通过 B/S 发布部分可公开信息
   B/S 建立在广域网之上 , 对安全的控制能力相对弱 , 可能面向不可知的用户。
   3.对程序架构不同
   C/S 程序可以更加注重流程 , 可以对权限多层次校验 , 对系统运行速度可以较少考虑
   B/S 对安全以及访问速度的多重的考虑 , 建立在需要更加优化的基础之上 . C/S 有更高的要求 B/S 结构的程序架构是发展的趋势 , MS .Net 系列的 BizTalk 2000 Exchange 2000 , 全面支持网络的构件搭建的系统 . SUN IBM 推的 JavaBean 构件技术等 , 使 B/S 更加成熟
   4.软件重用不同
   C/S 程序可以不可避免的整体性考虑 , 构件的重用性不如在 B/S 要求下的构件的重用性好
   B/S 对的多重结构 , 要求构件相对独立的功能 . 能够相对较好的重用 . 就入买来的餐桌可以再利用 , 而不是做在墙上的石头桌子
   5.系统维护不同    
   C/S 程序由于整体性 , 必须整体考察 , 处理出现的问题以及系统升级 . 升级难 . 可能是再做一个全新的系统
   B/S 构件组成 , 方面构件个别的更换 , 实现系统的无缝升级 . 系统维护开销减到最小 . 用户从网上自己下载安装就可以实现升级
   6.处理问题不同
   C/S 程序可以处理用户面固定 , 并且在相同区域 , 安全要求高需求 , 与操作系统相关 . 应该都是相同的系统
   B/S 建立在广域网上 , 面向不同的用户群 , 分散地域 , 这是 C/S 无法作到的 . 与操作系统平台关系最小
   7.用户接口不同
   C/S 多是建立的 Window 平台上 , 表现方法有限 , 对程序员普遍要求较高
   B/S 建立在浏览器上 , 有更加丰富和生动的表现方式与用户交流 . 并且大部分难度减低 , 减低开发成本
   8.信息流不同
   C/S 程序一般是典型的中央集权的机械式处理 , 交互性相对低
   B/S 信息流向可变化 , B-B B-C B-G 等信息、流向的变化 , 更像交易中心。
       7. Integer int 的区别
   int java 提供的 8 种原始数据类型之一。 Java 为每个原始类型提供了封装类, Integer java int 提供的封装类。 int 的默认值为 0 ,而 Integer 的默认值为 null ,即 Integer 可以区分出未赋值和值为 0 的区别, int 则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为 0 的区别,则只能使用 Integer 。在 JSP 开发中, Integer 的默认为 null ,所以用 el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为 0 ,所以用 el 表达式在文本框中显示时,结果为 0 ,所以, int 不适合作为 web 层的表单数据的类型。
   Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为 null 而判断一个对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文件中设置其 unsaved-value 属性为 0
   另外, Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数, Integer 中还定义了表示整数的最大值和最小值的常量。
   8.
   作用域 public,private,protected, 以及不写时的区别。 作用域
   当前类
   同一 package
   子孙类
   其他 package public private protected 不写(默认)
  
  
  
     注:具有访问权限的写"是",不具有访问权限的写"否"。
   9.
     Overload Override 的区别。 Overloaded 的方法是否可以改变返回值的类型
   Overload 是重载的意思, Override 是覆盖的意思,也就是重写。
   重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
   重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是 private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
   至于 Overloaded 的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个 Overloaded 的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载 Overload 。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用 map.remove(key) 方法时,虽然 remove 方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同, java 就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。
     override 可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
   1 、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
   2 、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
   3 、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
   4 、被覆盖的方法不能为 private ,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
   overload 对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时, VM 就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
   1 、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float) ,但是不能为 fun(int,int) );
   2 、不能通过访问权限、返回类型、抛出的异常进行重载;
   3 、方法的异常类型和数目不会对重载造成影响;
   4 、对于继承来说,如果某一方法在父类中是访问权限是 priavte ,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
     10. TCP UDP 的区别。
   TCP :传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据之前,必须现在双方之间建立一个 TCP 链接,之后才能传输数据。 TCP 提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 UDP 是用户数据协议,是一个简单的面向数据报的运输层协议。 UDP 不提供可靠性,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。用于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快, UDP TCP 的主要区别在于 UDP 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误的到达目的地。 UDP 在许多方面非常有效。当某个程序的目标是尽快的传输尽可能多的信息是(其中任意给定数据的重要性相对较低),可使用 UDP.ICQ 短消息使用 UDP 协议发送消息。许多程序将使用单独的 TCP 链接和单独的 UDP 链接。重要的状态信息随可靠的 TCP 链接发送,而主要数据通过 UDP 发送。 1 、环境变量 path classpath 的作用是什么?( 5 分)
     : . PATH 变量用于列出可执行文件的搜索路径 . 因为要通过命令行的命令启 JAVA,JAVAC 等编译工具和解释工具 , 系统必须要知道他们所在位置 , PATH 则指明了其位置 . CLASSPATH 变量用于 JAVA 加载类的路径 . 只有在 classpath 设置的路径中的类才能被加载 .
     2 、编写程序计算 1+2+3+....+100 的和。( 10 分)
     答: Num.java public class Num{ public static void main(String[] args){     int sum = 0;     for(int i=1;i [/b][b]HTML 注册表单 [/b][b] [/b][b] 用户名:
密码  
确认密码:
性别: [/b][b]男 [/b][b]女
城市 : [/b][b]郑州 [/b][b] 上海 [/b][b] 天津 [/b][b] 深圳 [/b][b]
兴趣爱好 : 阅读         [/b][b]旅游         [/b][b]上网 个人简介
      [/b][b]       [/b][b]
   使用 JavaScript 验证第 9 题的 HTML 表单 . 用户名 : 必须是字母数字或下划线 , 不能以数字开头 . 密码 : 6-16 位字母数字下划线 . 确认密码 : 和密码一致 . 其他项为必填。 ( 选做题 20 )
     答:
   function sub (){    
   if(!(/^[a-zA-Z_]{1}[a-zA-Z_0-9]*$/.test(form.usern ame.value))){    
     alert(" 用户名必须是字母数字或下划线 , 不能以数字开头! ");    
     return false;    
   }else if(!(/[a-zA-Z_0-9]{6,16}/.test(form.password.value ))){    
   alert(" 密码 6-16 位字母数字下划线! ");    
     return false;    
   }else if(form.repassword.value != form.password.value){    
   alert(" 两次输入密码应一致! ");    
   return false;    
   }else if(form.sex[0].checked==false && form.sex[1].checked==false){    
     alert(" 性别不能为空! ");   
     return false;     
   }else if(form.city. checked == false){    
     alert(" 城市不能为空! ");    
     return false;    
   }    
   else if(form.read.checked == false && form.travel.checked == false && form.Internet.checked == false){    
     alert(" 兴趣爱好不能为空! ");    
     return false;    
   }    
   else if(form. readme. checked == false){    
     alert(" 个人简介不能为空! ");     
     return false;    
   }     
   else{     
     return true;      
   }    
   }      
    
       . 阐述一下你对 MVC 的理解。
   M model 也就是模型
   V:   view 也就是视图
   C control 也就是控制 JAVA 中如何跳出当前的多重嵌套循环?
   可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的 break 语句,即可跳出外层循环。例如,
   ok: for(int i=0;i循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
   int arr[][] = {{1,2,3},{4,5,6,7},{9}};
   boolean found = false;
   for(int i=0;i<arr.length && !found;i++)
   {
              for(int j=0;j<arr[i].length;j++)
              {
                       System.out.println("i=" + i + ",j=" + j);
                       if(arr[i][j] == 5) 
                       {
                                found = true;
                                break;
                       }
              }
      

猜你喜欢

转载自kumkl74x.iteye.com/blog/1362599
今日推荐