面试题

一: 选择题

1. 下列关于for循环和while循环的说法中哪个是正确的?(  B  )

A.while循环能实现的操作,for循环也都能实现

B.while循环判断条件一般是程序结果,for循环判断条件一般是非程序结果

C.两种循环任何时候都可替换

D.两种循环结构中都必须有循环体,循环体不能为空

二 : 简述题

1、描述一下 JVM 加载 class 文件的原理机制?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负载在运行时查找和装入类文件的类。

Java中的所有类,都是由类加载器加载到JVM中才能运行。类加载器本身也是一个类,而他的工作就是把class文件从硬盘中读取到内存中。在写程序的时候,我们几乎不关心类的加载,因为这些都是隐式加载的,除非我们有特殊的用法,比如反射,就需要显式的加载所需要的类。

类的装载方式,有两种:

1、隐式装载:程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

2、显式装载:通过class.forname()等方法,显式加载需要的类 

Java类的加载时动态的,它并不是一次性的将所有的类全部加载然后运行,而是保证程序运行的基础类完全加载到JVM中,至于其他类,则是在需要的时候才会加载。这当然是为了节省内存开销。

Java的类加载器有:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(ExtClassLoader)、系统类加载器(AppClassLoader)、用户自定义类加载器(java.lang.ClassLoader的子类)。

启动类加载器:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);

扩展类加载器:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;

系统类加载器:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

 三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了父亲委托机制

父亲委托机制工作原理:当类加载器需要加载类的时候,先让父类加载器加载,如果父类加载器也无法加载,才会在自己的类加载器中加载。其实就是自上而下的加载。之所以采用这种方式是因为必须保证基础类的加载。同时也是安全上的考虑:如果某人将一个恶意的基础类加载的JVM中,委托模型机制会让父类加载器去加载,显然父类加载器是无法加载的,自然就不会将该类加载进来。

 我们可以通过这样的代码来获取类加载器:

ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();

注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。

前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:

1.加载:把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段。

2.连接:

      (1)检查:检查载入的class文件数据的正确性;

      (2)准备:为静态变量分配内存并设置默认的初始值

      (3)解析:将符号引用转换成直接引用(这一步是可选的)

3.初始化:初始化静态变量,静态代码块。包括:

    1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;

    2)如果类中存在初始化语句,就依次执行这些初始化语句。 

2heap  stack 别。

java 存主要类是存。一个 会为块私储这方法 结束的栈变量放。

栈是,堆是被所有线程所共享的一块内存区域,在虚拟机启动时创建,主要用于存放对象实例。几乎所有的对象实例都在这里分配内存。所以束而方法中的局变量使用 final 修饰后,放在堆中是栈中。

3、GC 是什么?为什么要有 GC?

GC 思(Gabage Collection,处理问题 忘记会导定甚Java  GC 可以自动用域达到自动回收存的的,Java 提供 配内法。

4.了解一下垃圾回收算法

https://mp.csdn.net/console/editor/html/104402351

 5、阿里的面试官问了两个问题,可以不可以自己写个String类

答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了;

6、能否在加载类的时候,对类的字节码进行修改

答案:可以,使用Java探针技术,可以参考:Java探针-Java Agent技术-阿里面试题

4、列举出一些常用的类,包,接口,请各举 5 个????????

要让 java ee 仅仅 core java 的那些东西要多 列你 ssh 涉及的那西写的些类。

java:

spring:

mybatis:

redis:

这几个举例子,并能解释明白。。。

常用BufferedReader BufferedWriter FileReader FileWirter StringInteger java.util.DateSystemClassList,HashMap

常用java.lang java.io java.util java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate 常用口:Remote List Map Document

NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)

 

Session(Hibernate),HttpSession

 

5  java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承, 请说出他们分别是哪些类?

按照数据流方向分类:输入流和输出流

按照处理的数据类型分类:字节流和字符流

字节流
对于字节流,它是用来操作我们的二进制文件的,为什么呢?因为字节流可以操作的数据是8位,也就是一字节,我们知道1 byte = 8bit,而像一些数字和字母等都是占一个字节,这就可以使用字节流来操作,但是对于中文的话就不能使用字节流了

FileInputStream和FileOutputStrem

 

字符流
因为一个汉字是占两个字节,那么就是16位,字节流是操作不了的,而字符流则可以操作16位,所以对于文本文件则常用字符流操作了
 

不清晰???

字节 InputStream OutputStream承于 InputStream Reader

OutputStreamWriter java.io 包中主要 高性使便。

 

6、多线程有几种实现方法?同步有几种实现方法?

多线分别是继 Thread 与实 Runnable 接口 

同步 synchronized,wait  notify wait():使一线于等待状的对 lock 

sleep():使线程个静要捕捉

InterruptedException(异常)常。

 

notify():唤醒一状态线调用能确 某一线 JVM 哪个线程级。 Allnotity():唤醒所有待状线是给线象的

让它

 

7、说一说 Servlet 的生命周期?

答:servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。 这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。

Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例 销毁的时候调用其 destroy 方法。

web 容器加载 servlet,生命周期开始。通过调用 servlet 的 init()方法进行 servlet 的初始化。 通过调用 service()方法实现,根据请求的不同调用不同的 do***()方法。结束服务,web 容 器调用 servlet 的 destroy()方法。

 

 

8、说出数据连接池的工作机制是什么?

J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端 程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空 闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池 连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

实现方式,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法 不是真正关连接,而是把它代理的 Connection 对象还回到连接池中。

 

9、这段代码有什么不足之处?

try {

 

Connection conn = ...; Statement stmt = ...;

ResultSet rs =stmt.executeQuery("select * from table1");

 

while(rs.next()) {

 

}

 

} catch(Exception ex) {

 

}

 

答:没有 finally 语句来关闭各个对象,另外,使用 finally 之后,要把变量的定义放在 try 语 句块的外面,以便在 try 语句块之外的 finally 块中仍可以访问这些变量。

 

10、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。

 

select count(*) as num,tb.id from

tb,

 

(select role from tbwhere id=xxx) as t1 where

tb.role = t1.role  and  tb.id != t1.id

 

group by tb.id having

num = select count(role)from tb where id=xxx;

 

 

11、一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在 每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?

alter table drop column score;

 

alter table add colunm score int; 可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意, 这样的操作时无法回滚的,在我的印象中,只有 inert update delete 等 DML 语句才能回滚, 对于 create table,drop table ,alter table 等 DDL 语句是不能回滚。

 

 

 

 

 

解决方案一,update user set score=0; 解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就 alter table user drop columnscore;alter table user add column score int。

 

 

 

下面代码实现每年的那个凌晨时刻进行清零。

 

Runnable runnable =

 

new Runnable(){

 

public voidrun(){

 

clearDb();

 

schedule(this,newDate(new Date().getYear()+1,0,0));

 

}

 

};

 

 

 

schedule(runnable,

 

new Date(newDate().getYear()+1,0,1));

 

 

 

12、你对 Spring 的理解, 什么是 spring  IOC AOP

1.Spring 实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为 BeanFactory(实际上是一个接口),在程序中通常 BeanFactory 的子类 ApplicationContext。 Spring 相当于一个大的工厂类,在其配置文件中通过<bean>元素配置用于创建实例对象的 类名和实例对象的属性。

2. Spring 提供了对 IOC 良好支持,IOC 是一种编程思想,是一种架构艺术,利用这种思想

 

可以很好地实现模块之间的解耦。IOC 也称为 D(I

Depency Injection),什么叫依赖注入呢?

 

 

譬如,Class Programmer

 

{

 

Computer computer =null;

 

public void code()

 

{

 

//Computercomputer = new IBMComputer();

 

//Computercomputer = beanfacotry.getComputer();

 

computer.write();

 

}

 

public voidsetComputer(Computer computer)

 

{

 

this.computer= computer;

 

}

 

} 另外两种方式都由依赖,第一个直接依赖于目标类,第二个把依赖转移到工厂上,第三个彻 底与目标和工厂解耦了。在 spring 的配置文件中配置片段如下:

 

<bean id=”computer” class=”cn.itcast.interview.Computer”>

</bean>

 

<bean id=”programmer” class=”cn.itcast.interview.Programmer”>

<property name=”computer” ref=”computer”></property>

</bean>

 

3. Spring 提供了对 AOP 技术的良好封装, AOP 称为面向切面编程,就是系统中有很多各 不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入 权限判断,加入异常处理,这种应用称为 AOP。实现 AOP 功能采用的是代理技术,客户端 程序不再调用目标,而调用代理类,代理类与目标类对外具有相同的方法声明,有两种方式 可以实现相同的方法声明,一是实现相同的接口,二是作为目标的子类在,JDK 中采用 Proxy 类产生动态代理的方式为某个接口生成实现类,如果要为某个类生成子类,则可以用 CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以 Advice 对象进行提供,显然要创建出代理对象,至少需要目标类和 Advice 类。spring 提供 了这种支持,只需要在 spring 配置文件中配置这两个元素即可实现代理和 aop 功能,例如,

 

<bean id=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>

 

<property name=”target”ref=””></property>

 

<property name=”advisor”ref=””></property>

</bean>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值