java知识点回顾(二)

以下文字站在面试官的视角,描述了java程序员面试的过程:(原文地址:http://www.mianwww.com/html/2013/05/18392.html )


        今天面试了一个开发人员,86年的,4年工作经验。职位是高级软件工程师。首先介绍了一下公司情况,知道他比较紧张,缓和一下气氛,然后就开始问技术问题。

首先看到简历上写的项目经验,发现有Linux和Unix经验,我就问,你对VI熟吗,他说熟,然后我就问了一些VI操作,答的一知半解。本来想问问操作系统启动过程的,

想想他作为Java程序员有点难,就没问。接着突然想到吕永生老师说过的经验,问问对方什么最熟,然后就问什么,于是我问你在Java里面什么最熟悉,他想了一会,

我给了他一些提示,例如Java基础,JDBC,SQL等,然后他说Java基础,于是我问了以下问题,Java的Class Loader机制,TreeMap和HashMap的区别,Map和Set

和List区别。答的不流利,且错误百出。接着,我问对JDBC熟吗?他说熟,我给他一张纸,“写一下Java建立数据库连接的语句”,他是一点都不会。这时候我给他提示:

1.加载驱动,2.建立连接,3.执行sql,4.操作结果。他还是不会。于是我给他写出来,然后指着Class.forName(), 问里面到底执行了什么呢?他茫然。接着又让他写了一个

单例程序。接着又问了框架的东西,Struts,Spring,JPA,几乎一点都不会。接着我说,你等等,我叫另一个同事看看,于是他在会议室里等待,这时候我看到他站起来

小踱,有点着急。现在经济不景气,工作不好找,还是安心学点英语,技术吧。程序员太浮躁了,我有时候也是,所谓不学习就要落后,要时刻保持清醒的学习态度。谦虚

谨慎,不骄不躁。


在上面的场景中面试官问到的问题

1.vi操作:

vi的三种模式:命令行模式、插入模式、末行模式;
   编辑: i   
   退出: :q   强制退出: :q!
   保存: :w   保存并退出: wq!    或者 :x = :wq

   方向键: 左:h     右:l        上:k    下:j
   光标向前跳过一个单词:w     光标向后跳过一个单词:b

   删除:  整行删除:dd     

   向下寻找名为word的字符串: /word
   向上寻找名为word的字符串: ?word


2.linux操作系统启动过程(来自LinuxCast.net)

1).BIOS
2).MBR(512字节,前446字节为引导代码)
3).GRUB(Linux的主流引导程序,配置文件:/boot/grub/grub.conf)
4).加载内核
5).init(初始化)
6).runlevel


3.Java的Class Loader机制,TreeMap和HashMap的区别,Map、Set、List的区别:

1)Class Loader机制:

        从JDK1.2开始,类的加载过程采用父类委托机制,这种机制能更好的保证java平台的安全。在此委托机制中,除了JVM自带的根类加载器以外,其余的加载器

都有且只有一个父加载器。当java程序请求加载器A加载类coo时,A先委托自己的父加载器去加载coo类,若父加载器能加载,则由父加载器完成加载任务。否则,

才由加载器A本身去加载coo类。在类加载中的父亲委托机制中,各加载器按照父子关系形成树结构。


          根类加载器

                    |

          扩展类加载器

                    |

          系统类加载器

                    |

          loader1(用户自定义类加载器)

                    |

          loader2(用户自定义类加载器)

Class Sample =  loader2.loadClass("Sample");

类加载的流程:

       loader2先从自己的命名空间查找Sample类是否已被加载。若已加载,就直接返回已加载类对象的引用。若未被加载,loader2会请求loader1代为加载,若loader1依然

在命名空间中找不到Sample。则loader1将向系统类加载器发出请求,让系统类加载器来加载Sample类。以此类推(loader2及其父类加载器的关系是包装的关系)。

若loader2及其父类加载器都不能加载类到虚拟机,则抛出ClassNotFoundException异常。


父类委托机制的优点:

       提高了软件系统的安全性。在此机制下,用户自定义的类加载器不可能加载应该由父加载器加载的可靠类。并且可以防止不可靠的甚至是恶意的代码,代替由父类加载器

加载的可靠代码。


2)TreeMap、HashMap的区别:

TreeMap:实现map接口,把元素存储在树中。比HashMap慢;

                基于红黑树实现。适合于 按自然顺序、自定义顺序遍历键。

HashMap:是键(k)值(v)对的形式,key不能重复,但是value可以重复;

                 基于哈希表实现。适合于 在Map中插入、删除、定位元素。


3) Map、Set、List的区别:

Map:Map接口为我们提供完成map改变、map查询、map视图的功能的方法;

Set:无序集合,不可重复元素;

List:一个有序可重复的集合。


4. JDBC--Java建立数据库连接的语句,Class.forName()里面到底执行了什么?

jdbc建立数据库连接的过程:

0).参数化;

1).加载和注册数据库驱动;

2).连接数据库;

3).创建Statement对象;

4).操作数据库,执行SQL语句;

5).处理数据;

6).释放资源,断开与数据库的连接;


        Class.forName(" ") : Class实例是JVM在加载一个类时自动创建的,程序无法用new语句创建java.lang.Class类的实例,因为Class类没有提供public类型的构造方法。

为了使程序能获得代表某个类的class实例,在Class类中提供了静态工厂方法 forName(String classname)。forName("foo")方法对foo类主动初始化,细节的东西、实现还要

看Class.forName()方法的源代码。口说无凭,代码为证。 


例如:

Class c = Class.forName("java.util.Date");
//返回java.util.Date类的实例;
Object obj = c.newInstance();   //在jdk中,newInstance()方法常是静态工厂方法


5. 单例程序

public class SingleT {  
    private  static SingleT st;     //唯一对象的指针或称为引用;  
    private  SingleT(){             //私有构造;  
    }  
      
    public static SingleT getNewInstance(){   //静态方法返回对象;                 
               if(st == null){                //多线程情况,可能会有多个实例,加synchronized保证线程安全;  
                  st = new SingleT();  
               }          
        return st;  
    }             
}  


6. 框架的东西 Struts,Spring,Hibernate 及Servlet、JPA

1).Struts2 工作流程:

1.访问JSP页面(loo.jsp);

2.提交表单后,数据提交给(/struts2/loo.action);

3.struts2截获所有请求,包括loo.action的请求;

4.查找struts.xml,loo.action对应的looAction;

5.生成一个looAction实例将提交的数据设置进去,调用实例的execute()主方法;

6.跳转到JSP中显示结果,丢弃looAction实例。


2).Spring 的IOC 、AOP 、 MVC:

IOC(控制反转):也叫DI(依赖注入)。指对象之间的依赖由外部(Spring容器)在运行时给定。

AOP(面向切面编程):可以将遍布应用各处的功能分离出来形成可重用的组件。

MVC:SpringMVC 基于Model-View-Controller->MVC(模型-视图-控制器)模式实现。


3).Hibernate:

    一个对象关系映射框架。对JDBC进行轻量级对象封装,可用面向对象的思想来操纵数据库。


4).JPA (Java Persistence API ):

    Java持久化的规范。是对开源ORM的更高层次的抽象。


5).Servlet:

    Servlet是一个能够处理请求并输出html的.java文件。


Servlet的基本生命周期:

    a. 当Web客户请求Servlet服务器或当Web服务启动时,容器环境加载一个Servlet类;

    b. 容器环境根据客户请求创建一个或多个Servlet对象实例,并把这些实例加入到Servlet实例池中;

    c. 容器环境调用Servlet的init()方法进行Servlet初始化。在调用初始化时,要给init()方法传入一个ServletConfig对象,ServletConfig对象包含初始化参数和容器环境信息;

    d. 容器环境利用HttpServletRequest和HttpServletResponse对象,封装从Web客户接收到的HTTP请求和由Servlet生成的响应;

    e. 容器环境把HttpServletRequest和HttpServletResponse对象传递给HttpServlet的service()方法;

    f. Servlet从HttpServletRequest对象读取HTTP请求数据,访问来自HttpSession或Cookie对象的状态信息,进行特定应用的处理,并且用HttpServletResponse对象

       生成响应数据;

    g. 当web服务器和容器关闭时,调用HttpServlet.destory()方法关闭任何打开的资源。


注:


你可能感兴趣的:(JavaSE)