仅为记录面试所遇到的题目,不论难易。
目录
单选
1、关于java的异常处理机制,以下说法正确的是:()
A) 当某个线程抛出OutOfMemoryError时,其他线程有可能不受影响
B) 当大量抛出RuntimeException时,不会影响系统的吞吐量
C) java.lang.Exception是java.lang.Error的父类
D) finally块代码一定会被执行
答案:A
解析:
A.当一个线程抛出OOM异常后,它所占据的内存资源会被快速地释放掉,从而不会影响其它线程的运行.
B.当大量抛出运行时异常时,系统肯定存在问题,会影响系统吞吐量。
C.Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型
D.执行完try…catch之后,一定会执行finally里的代码… 除了个别情况不会执行finally,如:(1)try中有死循环 (2)try-catch异常退出:System.exit(0) (3)线程被杀死,执行try,finally的线程被杀死时.
2. java程序的执行过程中用到一套jdk工具,其中java.exe是指()编译器
A. 文档生成器
B. 解释器
C. 编译器
D. 分解器
答案:B
解析:
javadoc.exe:制作源文件类结构的html格式文档。
java.exe:java解析器,直接从类文件执行Java应用程序字节代码。
javac.exe:java编译器,将Java源代码转换成字节码
javap.exe:Java类分解器,对.class文件提供字节代码的反汇编。
3.在几进制下,123*234=28560是成立的?
A)6
B)10
C)12
D)14
答案:C
解析:个位数3*4得到的个位数是0,那便是逢12进10
4. 下列语句哪一个正确()
A. Java程序经编译后会产生machine code
B. Java程序经编译后会产生byte code
C. Java程序经编译会产生dll
D. 以上都不正确
答案:B
解析:byte code,即字节码,“java程序经编译后”,可理解为使用javac 指令编译后,程序会生成.class文件,即字节码文件,故b正确。machine code是机器码,DLL(Dynamic Link Library)文件为动态链接库文件,均不是Java程序经编译后产出的文件。
5.关于sleep()和wait(),以下描述错误的一项是( )
A)sleep是线程类(Thread)的方法,wait是Object类的方法;
B)sleep不释放对象锁,wait释放对象锁;
C)sleep暂停线程、但监控状态仍然保持,结束后会自动恢复;
D)wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态。
答案:D
解析:
(发出-->调用)
Sleep 暂停当前线程,但是不释放锁
Sleep是在Thread
可以在任何场景使用
只有睡够时间才能醒Wait 暂停当前线程。但是释放资源锁
Object对象的
wait方法只能在同步模块使用
可以随时唤醒
首先,多线程中会使用到两个延迟的函数,wait和sleep。
wait是Object类中的方法,而sleep是Thread类中的方法。
sleep是Thread类中的静态方法。无论是在a线程中调用b的sleep方法,还是b线程中调用a的sleep方法,谁调用,谁睡觉。
最主要的是sleep方法调用之后,并没有释放锁。使得线程仍然可以同步控制。sleep不会让出系统资源;
而wait是进入线程等待池中等待,让出系统资源。
调用wait方法的线程,不会自己唤醒,需要线程调用 notify / notifyAll 方法唤醒等待池中的所有线程,才会进入就绪队列中等待系统分配资源。sleep方法会自动唤醒,如果时间不到,想要唤醒,可以使用interrupt方法强行打断Thread.sleep(0) // 触发操作系统立刻重新进行一次CPU竞争。
6.下列关于进程和线程的叙述中,正确的是()
A)不管系统是否支持线程,进程都是资源分配的基本单位
B)线程是资源分配的基本单位,进程是调度的基本单位
C)系统级线程和用户级线程的切换都需要内核的支持
D)同一进程中的各个线程拥有各自不同的地址空间
答案:A
解析:在系统中,进程是最小的资源分配的基本单位,不管系统是否支持线程。在支持线程的系统中,线程是调度的基本单位。同一进程中的各个线程拥有共同的共享地址空间。
7.下列说法正确的有()
A. class中的constructor不可省略
B. constructor必须于class同名,但方法不能与class同名
C. constructor在一个对象被new时执行
D. 一个class只能定义一个constructor
答案:C
解析:这里可能会有误区,其实普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。构造方法可重载(constructor:构造函数)
8.提供Java存取数据库能力的包是()
A. Java.sql
B. java.awt
C. java.lang
D. java.swing
答案:A
解析:
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。
java.awt包提供了基本的java程序的GUI设计工具。
java.lang提供利用 Java 编程语言进行程序设计的基础类
Java SWing提供许多比AWT更好的屏幕显示元素。
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
9.给定以下JAVA代码,这段代码运行后输出的结果是()
public class Test{
public static int aMethod(int i)throws Exception{
try{
return i / 10;
}catch (Exception ex){
throw new Exception("exception in a Method");
} finally{
System.out.printf("finally");
}
}
public static void main(String [] args) {
try {
aMethod(0);
} catch (Exception ex) {
System.out.printf("exception in main");
}
System.out.printf("finished");
}
}
A)exception in main finished
B)finally finished
C)exception in main finally
D)finally exception in main finished
答案:B
解析:略
10.下面有关SPRING的事务传播特性,说法错误的是?
A)PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
B)PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
C)PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
D)PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚
答案:B
解析:Spring的API设计很不错,基本上根据英文翻译就能知道作用:Required:必须的。说明必须要有事物,没有就新建事物。supports:支持。说明仅仅是支持事务,没有事务就非事务方式执行。mandatory:强制的。说明一定要有事务,没有事务就抛出异常。required_new:必须新建事物。如果当前存在事物就挂起。not_supported:不支持事物,如果存在事物就挂起。never:绝不有事务。如果存在事物就抛出异常
11.下列运算符合法的是()
A.&&
B.<>
C.if
D.:=
答案:A
解析:
12.下列哪一种叙述是正确的()
A. abstract修辞符可修饰字段,方法,类
B. 抽象方法的body部分必须用一对大括号{}包住
C. 声明抽象方法,大括号可有可无
D. 声明抽象方法不可写出大括号
答案:D
解析:abstract不能修饰字段。抽象方法没有实现的方法,所以没有body部分。
13.下列语句正确的是()
A. 形式参数可被视为local variable
B. 形式参数可被字段修饰符修饰
C. 形式参数为方法被调用时,真正被传递的参数
D. 形式参数不可以是对象
答案:A
解析:
A.local variable:局部变量。形参和局部变量一样都不能离开方法。都只有在方法内才会发生作用,也只有在方法中使用,不会在方法外可见。
B.形式参数只能用final修饰符,其它任何修饰符都会引起编译器错误。
C. 传递的是对象的引用
D. 形参可以是对象,如果形参是对象,那么形参里面存储的就是对象的引用
14.下列哪种说法是正确的()
A. 实列方法可直接调用超类的实列方法
B. 实例方法可直接调用超类的类方法
C. 实例方法可直接调用其他类的实例方法
D. 实例方法可直接调用本类的类方法
答案:D
解析:实例方法不能调用被private修饰的方法,所以ABC错误
15.jsp指令中isELIgnored=“boolean”的意思是()
A. 决定是否实现Servlet的单线程模式
B. 决定改页面是否是一个错误处理页面
C. 决定是否支持EL表示
D. 没有具体的含义
答案:C
解析:略
16.按照MVC设计模式,jsp用于实现()
A. Model
B. View
C. Controller
D. 容器
答案:B
解析:模型(Model):程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能);
控制器(Controller):负责转发请求,对请求进行处理;
视图(View):界面设计人员进行图形界面设计
17.下面哪个不是表单标记()
A. INPUT
B. RADIO
C. CHECKBOX
D. TR
答案:D
解析:
表单标记:<FORM>
<INPUT><SELECT><OPTION><TEXTAREA>
INPUT的种类:Text、Radio、Checkbox、Password、Submit/Reset、Image、File、Hidden、Button。
表格标记:<TABLE>
<tr><td><th>
18.修改表test_tbl字段i的缺省值为1000,可以使用SQL语句 ()
A)ALTER TABLE test_tbl ALTER i SET DEFAULT 1000;
B)ALTER TABLE test_tbl i SET DEFAULT 1000;
C)ALTER TABLE test_tbl MODIFY i SET DEFAULT 1000;
D)ALTER TABLE test_tbl CHANGE i SET DEFAULT 1000;
答案:A
解析:略
多选题
1.下列说法错误的有()
A. 在类方法中可以this来调用本类的类方法
B. 在类方法中调用本类的类方法时可直接调用
C. 在类方法中只能调用本类中的类方法
D. 在类方法中绝对不能调用实例方法
答案:ACD
解析:成员方法又称为实例方法,静态方法又称为类方法
A.静态方法中可以不用实例化该类的实例,所以会不存在相应的实例,而this是对于当前对象的引用,不能用来调用类方法。(但jdk5之后好像又可以,只是编译会警告,所以A存在争议性)
C.类方法可以调用外部其他类的方法。
D.只要实力化对象,也是可以调用实例方法的。
2.下列标识符不合法的有()
A. new
B. $Ysfafeq
C. 1234
D. car.texi
答案:ACD
解析:参见Java命名规则
3.下列正确的有()
A. call by value 不会改变实际参数的数值
B. call by reference能改变实际参数的参数地址
C. call by reference不能改变实际参数的参数地址
D. call by reference能改变实际参数的内容
答案:ACD
解析:数值拷贝不会改变实参内容,引用拷贝可以改变实参内容,但不会改变实参的引用地址。(call by value:数值拷贝,call by referenc:引用拷贝)
4.下列说法错误的有()
A. Java面向对象语言容许单独的过程与函数存在
B. Java面向对象语言容许单独的方法存在
C. Java语言中的方法属于类中的成员
D. Java语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同
答案:ABC
解析:方法与函数:这两个概念不严格区分,就是一个东西,通过对象调用的,就是方法,直接调用,就是函数;
在java中,everything is object 所以,方法,函数,必须隶属于某一个类或对象, java中没有过程。(类中的代码块不知道算不算,就算代码块是过程,也是必须在类中才有的)
对于C选项,方法分为静态方法和非静态方法,静态方法属于类成员,非静态方法属于实例成员
5.下列说法正确的有()
A. 环境变量可在编译source code时指定
B. 在编译程序时,所能指定的环境变量不包括class path
C. Java从一次能同时编译数个Java源文件
D. javac.exe能指定编译结果要置于哪个目录
答案:BCD
解析:写Java代码前记得先把环境配好,不然怎么编译?
简答题
1.在构造方法中使用new当前对象会有什么异常发生?
递归回调,会栈溢出
2.MYSQL中的存储日期类型有哪些,各自的区别是什么。
date 只存年月日 “YYYY-MM-dd”
time 只存时分秒 “hh-mm-ss”
datetime 存储年月日时分秒 “YYYY-MM-dd hh:mm:ss”
year 自存年份 “XXXX”
timesttamp 时间戳
3.spring 有哪些主要模块?
1. Spring AOP 面相bai切面编程
2. Spring ORM Hibernate|mybatis|JDO
3. Spring Core 提供dubean工厂 IOC
4. Spring Dao JDBC支持
5. Spring Context 提供了关于zhiUI支持,邮件支持等dao
6. Spring Web 提供了web的一些工具类的支持
7. Spring MVC 提供了web mvc , webviews , jsp ,pdf ,export1. Spring Core
框架的最基础部分,提供 IoC 容器,对 bean 进行管理。
2.Spring Context
基于 bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
3.Spring DAO
提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法。
4.Spring ORM
提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate、MyBatis 等。
5.Spring AOP
提供了符合AOP Alliance规范的面向方面的编程实现。
6.Spring Web
提供了基础的 Web 开发的上下文信息,可与其他 web 进行集成。
7.Spring Web MVC
提供了 Web 应用的 Model-View-Controller 全功能实现。
4.简述一下HashMap的存放过程。
jdk1.7 数组+链表
(1)在put的时候,构造一个默认的初始化容量的空HashMap(16)和默认的加载因子(12长度数组)
(2)当键值对放在同一数组空间时,就会形成hash冲突,就会形成链表(O(1)>O(n))
(3)当数组容量超过16*0.75=12时,就会进行扩容,减少hash冲突,提高查询效率jdk1.8 数组+链表 + 红黑树
把值插进去的时候判断
判断key是否相同,相同则将上一个值覆盖
()数组长度大于64将链表转化为红黑树
(1)根据key计算一个hash值
(2)在put的时候判断数组是否存在,如果不存在调用resize方法创建容量为16的数组
(3)确定node在数组中的位置,根据hash值与数组最大索引值 进行与运算,得到位置
(4)获取该位置是否有元素,如果没有元素,直接记心间一个node放在该位置
(5)如果有元素,判断key是否完全相同,如果相同,吧原来的node赋值给一个变量
(6)此时再去判断 该位置是红黑树还是链表
(7)如果是红黑树 以红黑树的方式将node放在红黑树
(8)如果是链表,此时遍历链表,然后将node放在最后一位
放完以后需要判断链表的长度是否超过8 如果超过需要判断链表是否转为红黑树(当数组容量小于64的时候,只会进行数组扩容,如果超过64才会进行链表装维红黑树)
(9)返回被覆盖的值
(10)判断整个数组是否需要扩容
代码阅读
import java.util.ArrayList;
import java.util.List;
public class Test3{
public static void generate(int n){
int slice_index=1;
int count=1;
while(count<=n){
List<Integer> target=range(slice_index,slice_index+5);
if(target.get(2)<count&&slice_index+5<=6){
slice_index+=1;
continue;
}
StringBuilder sb=new StringBuilder();
for(Integer i:target){
if(i==count){
sb.append(String.format("'%d%s',",i,"*"));
}else{
sb.append(String.format("'%d%s',",i,""));
}
}
System.out.println(String.format("%d: [%s]",count,sb.substring(0,sb.length()-1)));
count+=1;
}
}
private static List<Integer> range(int start,int end){
List<Integer> l = new ArrayList<Integer>();
for(int i = start;i<end;i++){
l.add(i);
}
return l;
}
public static void main(String[] args){
generate(6);
}
}
解析:
import java.util.ArrayList;
import java.util.List;
public class Test3{
public static void generate(int n){
int slice_index=1;
int count=1;
while(count<=n){
List<Integer> target=range(slice_index,slice_index+5);
/*当生成的list中索引为2的值小于count且slice_index+5<=6时,不执行后面的循环体并进入下一轮循环。
*当此条件为false时,每一次循环,target.get(2)和slice_index+5不变,count的值+1
*首先我们知道slice_index的初始值为1,并且只有当if语句为true时才会改变,
*因为slice_index+5=6<=6成立,所以只有当count大于等于3时,if语句才为true
*由此可知,程序会执行3次range(1,6) list={1,2,3,4,5}
*又因为if语句成立并执行后,slice_index的值会变为2,这样slice_index+5<=6就永远为false,if语句恒不成立,
*所以直到while循环结束,slice_index的值都不会再改变改变,即后面都执行range(2,7) list={2,3,4,5,6}
*/
if(target.get(2)<count&&slice_index+5<=6){
slice_index+=1;
continue;
}
StringBuilder sb=new StringBuilder();
for(Integer i:target){
if(i==count){
sb.append(String.format("'%d%s',",i,"*"));
}else{
sb.append(String.format("'%d%s',",i,""));
}
}
System.out.println(String.format("%d: [%s]",count,sb.substring(0,sb.length()-1)));
count+=1;
}
}
//此方法是为了构建并返回一个list,例如range(1,6),实际就是生成一个list={1,2,3,4,5}
private static List<Integer> range(int start,int end){
List<Integer> l = new ArrayList<Integer>();
for(int i = start;i<end;i++){
l.add(i);
}
return l;
}
public static void main(String[] args){
generate(6);
}
}
答案:
编程题
1.为管理岗位业务培训信息,建立三个表:
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号、学员姓名、所属单位、学员年龄
C(C#,CN)C#,CN分别代表课程编号、课程名称
SC(S#,C#,G)S#、C#、G分别代表学号、所选修的课程编号、学习成绩
请写出如下SQL语句
1. 使用标准SQL嵌套语句查询选修课程名称为“税收基础”的学员和姓名。
2. 使用标准的SQL嵌套语句查询所选修课程编号为“C2”的学员姓名和所属单位
3. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
解析:
- 什么是嵌套查询?
嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。
- SQL嵌套语句
答案:
1,使用标准SQL嵌套语句查询选修课程名称为“税收基础”的学员和姓名。
select s# 学员学号,sn 姓名 from s where s# = (select s# from sc where sc.c# = (select c# from c where cn = '税收基础'))
2,使用标准的SQL嵌套语句查询所选修课程编号为“C2”的学员姓名和所属单位
select sn 学员姓名 ,sd 所属单位 from s where s# = ( select s# from sc where sc.c# in( select c# from c where c# = 'c2'))
3,使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
SELECT SN,SD FROM S WHERE [S#] IN(SELECT [S#] FROM SC RIGHT JOIN C ON SC.[C#]=C.[C#] GROUP BY [S#] HAVING COUNT(*)=COUNT([S#]))
2.实现一个方法,能够生成一个随机字符串数组。这些字符串必须是不一样的,每个字符串由字母和数字组成。方法输入参数有两个:
-Count:字符串数目(无默认值)
-Str_length:字符串长度,默认值为10
答案:
/*Set集合:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素 *使用set集合存储元素,可以保证我们的字符串数组和组成字符串的元素不重复。 */ class RDStr{ public List<String> rd(int Count,int Str_length){ List<String> l=new ArrayList<String>(); ArrayList a = new ArrayList(); HashSet h1 = new HashSet(); HashSet h2 = new HashSet(); charAll(a); while(true) { //每次循环都清空集合h1的值 h1.clear(); while(true) { int a1 = (int)(Math.random() * a.size()); //随机获得元素并存储到集合h1中,如果h1内有同样的元素是不会存储这个字符的。 h1.add(a.get(a1)); //如果h1的长度达到要求的字符串长度,则将h1的全部值拼接成一个字符串存储在h2中 if(h1.size() == Str_length) { StringBuilder sb=new StringBuilder(); for(Object obj:h1){ sb.append(obj.toString()); } h2.add(sb); break; } } //如果h2的长度达到要求的目数,则结束循环 if (h2.size() == Count) { break; } } for(Object str:h2){ l.add(str.toString()); } return l; } //把(a-z A-Z 0-9)放进列表中 public void charAll(ArrayList a){ for (char i = 'a';i <= 'z';i++) { a.add(i); } for(char i ='A';i<='J';i++) { a.add(i); } for(char i = '0';i<='9';i++) { a.add(i); } } }
3.实现一个方法,给定一个输入字符串,能够删除所有连续同样字母(大小写不敏感)。例如,输入为ABBCCCCCBBAB,输出就是ABCBAB:又如,输入为aAC,输出则是aC。
答案:
class SubStr{ public String t(String str){ //因为题目要求大小写不敏感,即a和A也算重复元素,那么就将所有元素转换为大写 String s=str.toUpperCase(); StringBuilder sb=new StringBuilder(); List<Integer> list=new ArrayList<Integer>(); //第一个元素是必定输出的,不用删除的 list.add(0); for(int i=1;i<s.length();i++){ //每一个索引对应的元素都与前一个索引对应的元素比较,如果相同,则跳过,不同,则记录索引 if(s.charAt(i)!=s.charAt(i-1)){ list.add(i); } } //将list记录的索引所对应原字符串的元素添加到StringBuilder中,组成新的字符串 for(Integer n:list){ sb.append(str.charAt(n)); } return sb.toString(); } }