厦门金智软件科技公司面试题

  今天去陪同学去厦门金智软件科技公司面试,小可有幸拿到一份面试题,并尝试做了一下,感觉题目并不太难,但也有些是自己不了解的,于是回来后把答案补充完整!

面试题目如下:
1.谈谈您对面向对象的理解。
2.HashMap和Hashtable的区别。
3.写个冒泡排序的算法(java或其他语言)。
4.写出n!的函数(java或其他语言)。
5.什么是MVC模式?
6.碰到问题时你要怎么解决》?
7.数据库索引有哪些优缺点?

以下是我的现场答案和回家后写的答案:
1.谈谈您对面向对象的理解。
  现场答案:面向对象有三个基本特征:封装、继承和多态;面向对象可以分为OOA、OOD、OOP三个不同过程。
  补充答案:http://www.cnitblog.com/Lily/archive/2006/02/23/6860.aspx

2.HashMap和Hashtable的区别。
  现场答案:本人对这两个类型都不了解,故没做现场答案。
  补充答案:
   1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

    2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

    3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

    4.HashTable使用Enumeration,HashMap使用Iterator。

    以上只是表面的不同,它们的实现也有很大的不同。

    5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

    6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    而HashMap重新计算hash值,而且用与代替求模:
    int hash = hash(k);
    int i = indexFor(hash, table.length);

    static int hash(Object x) {
      int h = x.hashCode();

      h += ~(h << 9);
      h ^= (h >>> 14);
      h += (h << 4);
      h ^= (h >>> 10);
      return h;
    }
    static int indexFor(int h, int length) {
      return h & (length-1);
    }
    以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
    HashMap对null的操作。


3.写个冒泡排序的算法(java或其他语言)。
  现场答案:

import java.util.*;
public class Main {
    
public static void main(String[] args) {
        
int[] intNums = new int[10000];
        
        
//对数组intNums赋值,现场答案不包话以下部分
        Random r = new Random();
        
for (int i = 0;i < intNums.length;i ++)
        
{
            intNums[i] 
= r.nextInt(10000);
            System.out.print(intNums[i]);
            System.out.print(
" ");
        }

        
//赋值结束
        
        
for (int i = 0;i < intNums.length;i ++)
        
{
            
for (int j = i;j < intNums.length;j ++)
            
{
                
if (intNums[j] < intNums[i])
                
{
                    
int intTemp = intNums[j];
                    intNums[j] 
= intNums[i];
                    intNums[i] 
= intTemp;
                }

            }

        }

        
        
//显示排序后的数组在现场答案中也未出现
        System.out.println();
        
for (int i = 0;i < intNums.length;i ++)
        
{
            System.out.print(intNums[i]);
            System.out.print(
" ");
        }

    }
 
}
  补充答案:
import java.util.*;
public class Main {
    
public static void main(String[] args) {
        
int[] intNums = new int[10000];
        
        
//对数组intNums赋值,现场答案不包话以下部分
        Random r = new Random();
        
for (int i = 0;i < intNums.length;i ++)
        
{
            intNums[i] 
= r.nextInt(10000);
            System.out.print(intNums[i]);
            System.out.print(
" ");
        }

        
//赋值结束
        
        
long start = System.currentTimeMillis();
        
int temp = 0;
        
boolean hasChange = true;
        
for (int i = intNums.length - 1;i > 0;i --)
        
{
            
if (hasChange)
            
{
                hasChange 
= false;
                
for (int j = 1;j >= i;j ++)
                
{
                    
if (intNums[j - 1]< (intNums[j]))
                    
{
                        hasChange 
= true;
                        temp 
= intNums[j];
                        intNums[j] 
= intNums[j - 1];
                        intNums[j 
- 1= temp;
                    }

                }

            }

            
else
            
{
                
break;
            }

        }

        
        
//显示排序后的数组在现场答案中也未出现
        System.out.println();
        
for (int i = 0;i < intNums.length;i ++)
        
{
            System.out.print(intNums[i]);
            System.out.print(
" ");
        }

        
        System.out.println(System.currentTimeMillis() 
- start);
    }
 
}
  两段代码的性能比较:现场答案运行耗时250ms,补充答案运行耗时0ms。

4.写出n!的函数(java或其它语言)。
  现场答案:
import java.util.*;
public class Main {
    
public static void main(String[] args) {
        Scanner cin 
= new Scanner(System.in);
        
        System.out.println(Fun(cin.nextInt()));
    }
 
    
    
private static long Fun(int N)
    
{
        
if (N == 0 || N == 1)
        
{
            
return 1;
        }

        
else
        
{
            
return Fun(N - 1* N;
        }

    }

}
  补充答案:无。

5.什么是MVC模式?
  现场答案:M--model、V--view、C--controller
  补充答案:MVC(Model/View/Controller)模式是国外用得比较多的一种设计模式,好象最早是在Smaltalk中出现。MVC包括三类对象。Model是应用对象,View是它在屏幕上的表示,Controller定义用户界面对用户输入的响应方式。
模型-视图-控制器(MVC)是80年代Smalltalk-80出现的一种软件设计模式,现在已经被广泛的使用。
    1、模型(Model):模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑.
    2、视图(View):视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。
    3、控制器(controller):控制器工作就是根据用户的输入,控制用户界面数据显示和更新model对象状态。
    MVC 式的出现不仅实现了功能模块和显示模块的分离,同时它还提高了应用系统的可维护性、可扩展性、可移植性和组件的可复用性。
    早期的程序中,如果不注意对数功能和显示的解耦合,常常会导致程序的复杂及难以维护。很多VB,Delphi等RAD程序都有这种问题。甚至现在的C#,Java有时候也会出现把业务逻辑写在显示模块中的现象
    尽管MVC设计模式很早就提出,但在Web项目的开发中引入MVC却是步履维艰。主要原因:一是在早期的Web项目的开发中,程序语言和HTML的分离一直难以实现。CGI程序以字符串输出的形式动态地生成HTML内容。后来随着脚本语言的出现,前面的方式又被倒了过来,改成将脚本语言书写的程序嵌入在HTML内容中。这两种方式有一个相同的不足之处即它们总是无法将程序语言和HTML分离。二是脚本语言的功能相对较弱,缺乏支持MVC设计模式的一些必要的技术基础。直到基于J2EE的JSP Model 2问世时才得以改观。它用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean技术实现模型的功能

    JSP Model 1 与 JSP Model 2
    SUN在JSP出现早期制定了两种规范,称为Model1和Model2。虽然Model2在一定程度上实现了MVC,但是它的应用用并不尽如人意

    JSP Model 1
    JSP Model 2
      model2 容易使系统出现多个Controller,并且对页面导航的处理比较复杂
      有些人觉得model2仍不够好,于是Craig R. McClanahan 2000年5月提交了一个WEB framework给Java Community.这就是后来的Struts.2001年7月,Struts1.0,正式发布。该项目也成为了Apache Jakarta的子项目之一。

6.碰到问题时你要怎么解决?
  现场答案:1.查看帮助文档或SDK;2.上CSDN社区寻求帮助;3.在网上搜索答案。
  补充答案:无。

7.数据库索引有哪些优缺点?
  现场答案:优点:检索数据速度快;缺点:胡乱使用,会带来性能问题
  补充答案:http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx

posted @ 2006-09-26 03:15  Jailu  阅读(1234)  评论(1编辑  收藏  举报