Java应届生岗位面试题记录(附答案及解析)

仅为记录面试所遇到的题目,不论难易。

目录

单选

多选题

简答题

编程题


 

单选

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 ,export

1. 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嵌套语句查询选修全部课程的学员姓名和所属单位

解析:

  1. 什么是嵌套查询?

嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。

  1. SQL嵌套语句

详见https://blog.csdn.net/clear_moo/article/details/80162164

答案:

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();
	}
}

 

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值