面试题记录

----classloader工作原理,class加载层次。

JVM---------------Java Virtual Machine,Java虚拟机,是运行Java程序的平台,不同的操作系统有不同的实现。

classloader---类加载器,完成将编译后的class文件加载到JVM中,是JVM的一个重要组件。

Class — Java类型定义文件,定义的数据与相应操作方法,可被classloader加载到JVM上根据它产生相应的运行实例,并可以调用相应的方法。

首先大家要知道为什么要有classloader,它是做什么的?

而在Java这个平台要运行什么本身是动态未知的,我们写的Java程序都是在需要的时候被动态的加载上去的。Java本身提供了一套类加载机器。总的来说,所有装在Java虚拟机上运行的类都是由classloader这个东西来完成的。

子类加载器需要加载某个类时,并不是直接加载,而是首先查看cache(cache可以理解为对已经在此加载过的类的记录),如果没有,则向parent提出请求,查看是否存在于parent的cache中。如此往上,直到根部的bootstrap classloader.  如果bootstrapclass loader的cache没有这个类,那么他开始尝试加载它,若成功加载,则传递这个成功加载的类到最底层的user-defined class loader(表现形式为一个对应的Class类的instance实例),若无法加载这个类,那么它又会委派他的child加载器去尝试加载。

Java使用classloader原因,除了可以达到动态性之外,其实最重要的原因还有安全性,体现在下面两点:

    1.核心的类不可能被仿照(这主要是因为先parent委托机制的作用),比如我们不可能加载一个自己写的放在classpath下的java.lang.String类,因为Java总是parent优先,在系统目录下面的String类总是被优先加载。

    2.我们可以指定,控制到特定的载入点,不会误用,比如我只要加载目录的ABC下面的类。----map安全实现:
synchronized修饰。
concurrent.locks.Lock:lock.lock();lock.unlock();
concurrentHashMap。

----ejb的entityBean为什么可以实现与数据库的映射,交付?

----spring3.0的新特性:例如 注解;

-----数据库存储过程和存储方法的不同?

区别是写法和调用上。

写法上:存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数;

            函数的参数列表只有输入参数,并且有return <返回值类型,无长度说明>。

返回值上:

    存储过程的返回值,可以有多个值,

           函数的返回值,只有一个值。

调用方式上:

    存储过程的调用方式有:

1)、exec <过程名>;

2)、execute <过程名>;

3)、在PL/SQL语句块中直接调用。

            函数的调用方式有:

      在PL/SQL语句块中直接调用。

                          sql调用表示法

----apache:


----get和post方法,为什么get的参数比post的少。


----localThread的使用场景。

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal并不是一个Thread,而是Thread的局部变量.

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中定义了一个ThreadLocalMap

(Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);)

,每一个线程都可以获取相应的ThreadLocalMap,通过该Map,可以设置或者获取响应ThreadLocal的值。这样可以保证每个线程都有自己的Map存放变量避免共享。

ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。

同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

----utp和tcp的不同。


----get方法里,处理一个请求10s,在这10s内另一个请求到达,get方法会怎样处理?


----SSH基本原理,springMVC的实现。


----了解nosql。


----实现线程同步的方法

同步有两种方法实现,一种是利用synchronized标示,另外一种是加锁。生成锁的对象的方法是:privatestatic Lock lock = newReentrantLock();Lock是一个接口,而Reentrantlock是一个实现的类。构造方法有:ReentrantLock()和ReentrantLock(fair:boolean)两种。其中第二种传递的是一个boolean值的参数,当设置为true时系统会按照等待的先后时间让线程活得锁,但是效率和性能不如默认值的好,但是同时也可以避免资源匮乏。synchronized可以声明方法,也可以用来标记某段代码。用来标记某段代码时的用法是:synchronized(){}。

----用什么关键字修饰同步方法 ? synchronized关键字修饰同步方法

----同步有几种实现方法,都是什么?分别是synchronized,waitnotify

----同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。

----Servlet生命周期

Servlet生命周期分为三个阶段:

  1,初始化阶段  调用init()方法

  2,响应客户请求阶段  调用service()方法

  3,终止阶段  调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:

<loadon-startup>1</loadon-startup>

    2,在Servlet容器启动后,客户首次向Servlet发送请求

    3,Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

----基本类型及其包装类(Integer之类)和String作为参数都是属于值传递,不会改变其值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章