一、单选题
1.以下关于synchronized描述不正确的是( C )
A. 当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程对该对象的该synchronized方法或者synchronized代码块的访问将被阻塞
B. 当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程仍然可以访问该对象的非同步代码块
C.当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程可以访问该对象的其他的synchronized方法或者synchronized代码块
D. 当在对象上调用其任意synchronized方法的时候,对象都被加锁
2.下面关于wait()和sleep()两个方法描述错误的是( D )
A. wait()方法属于Object的方法,而sleep()方法属于Thread类的方法
B. wait()方法可以有参数,也可以无参数,sleep()方法必须要传入long的参数
C. 两个方法都需要InterruptedException异常处理
D. wait()无参方法调用后,线程阻塞。需要其他线程只能使用notify()方法才能唤醒。而sleep()可以在时间到后醒来继续运行
3.有如下抽象类,则描述正确的是:( D )
public abstract class Animal {
public void move()
{
System.out.println("the animal can move...");
}
abstract void show();
}
A. 该抽象类中不能定义实例方法move.
B. 该抽象类可以被实例化。
C. 该抽象类不能被继承。
D. 该抽象类的子类对象要调用show方法,必须对Animal中的show方法进行重写。
4.假设当前时间是2021-03-03晚上20:20,星期三,则下面代码输出为( B )
public class Test {
public static void main(String[] args) {
Date date=new Date();
System.out.printf("%tD%n",date);
}
}
A. 2021/03/03
B. 03/03/21
C. 2021/03/03 20:20:00
D. 03/03/21 20:20:00
5.方法a定义如下:
int a(int b){
int n=b-1;
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n;
}
调用方法a(10)返回的结果是:( C )
A. 10
B. 9
C. 15
D. 0
6.对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。( B )
A. 正确
B. 错误
7.下面代码运行结果是( C )
public class Test{
public int add(int a,int b){
try {
return a+b;
} catch (Exception e) {
System.out.println("catch语句块");
}finally{
System.out.println("finally语句块");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
A. catch语句块,和是:43
B. 编译异常
C. finally语句块,和是:43
D. 和是:43,finally语句块
8.关于ASCII码和ANSI码,以下说法不正确的是( D )
A. 标准ASCII只使用7个bit
B. 在简体中文的Windows系统中,ANSI就是GB2312
C. ASCII码是ANSI码的子集
D. ASCII码都是可打印字符
9.不通过构造函数也能创建对象吗( A )
A. 是
B. 否
Java创建对象的几种方式(重要):
(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者
java.lang.reflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。
(1)和(2)都会明确的显式的调用构造函数 ;(3)是在内存上对已有对象的影印,所以不会调用构造函数 ;(4)是从文件中还原类的对象,也不会调用构造函数。
10.下面的代码段,当输入为2的时候返回值是( D )
public static int getValue(int i) {
int result = 0;
switch (i) {
case 1:
result = result + i;
case 2:
result = result + i * 2;
case 3:
result = result + i * 3;
}
return result;
}
A. 0
B. 2
C. 4
D. 10
11.以下Java代码段会产生几个对象 (B )
public void test(){
String a="a";
String b="b";
String c="c";
c=a+""+b+""+c;
System.out.print(c);
}
A.0
B.1
C.2
D.3
一个对象,因为编译期进行了优化,3个字符串常量直接折叠为一个
12.下列哪一种叙述是正确的( D )
A. abstract修饰符可修饰字段、方法和类
B. 抽象方法的body部分必须用一对大括号{}包住
C. 声明抽象方法,大括号可有可无
D. 声明抽象方法不可写出大括号
二、简答题
1.short s1 = 1; s1 = s1 + 1;有错吗?
short s1 = 1; s1 += 1;有错吗?
对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。
而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1, 相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
2.&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
3.用最有效率的方法计算2乘以8?
2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
用移位和减法运算来代替乘法,从而得到更好的性能。
4.String和StringBuilder、StringBuffer的区别?
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
5.什么是微服务?
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可 被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任 务。在所有情况下,每个任务代表着一个小的业务能力。 可以在“自己的程序”中运行,并通过“轻量级设备与 HTTP 型 API 进行沟通”。关键在于该服务可 以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个 API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个服务 需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程。
6.Spring MVC的主要组件?
(1)前端控制器 DispatcherServlet(不需要程序员开发);作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发);作用:根据请求的URL来查找Handler。
(3)处理器适配器HandlerAdapter;注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发);
(5)视图解析器 ViewResolver(不需要程序员开发);作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)。
(6)视图View(需要程序员开发jsp);View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)。
7.Spring 有什么好处?
(1) 轻量:Spring 是轻量的,基本的版本⼤约 2MB。
(2) 控制反转:Spring 通过控制反转实现了松散耦合,对象们给它们的依赖,⽽不是创建或查找依 赖的对象们。
(3) ⾯向切⾯编程(AOP):Spring⽀持⾯向切⾯编程,并且把应⽤业务逻辑和系统服务分开。
(4) 容器:Spring 包含并管理应⽤中对象的声明周期和配置。
(5) MVC 框架:Spring 的 WEB 框架是个精⼼设计的框架,是 Web 框架的⼀个很好的替代品
(6) 事务管理:Spring 提供⼀个持续的事务管理接⼝,可以扩展到上⾄本地事务下⾄全局事务 (JTA)。
(7) 异常处理:Spring 提供⽅便的 API 把具体技术相关的异常(⽐如由 JDBC,HibernateorJDO 抛出 的)转化为⼀致的 unchecked 异常。
三、编程题
1.求1+2!+3!+…+20!的和。
public class Test5{
public static void main(String[] args){
long sum = 0;
for(int i=0;i<20;i++)
sum += factorial(i+1);
System.out.println(sum);
}
//阶乘
private static long factorial(int n){
int mult = 1;
for(int i=1;i<n+1;i++)
mult *= i;
return mult;
}
}
2.将一个数组逆序输出。
public class Test6{
public static void main(String[] args){
int[] A = new int[]{1,2,3,4,5,6,7,8,9,};
print(A);
System.out.println();
int[] B = reverse(A);
print(B);
}
private static int[] reverse(int[] A){
for(int i=0;i<A.length/2;i++){
int temp = A[A.length-i-1];
A[A.length-i-1] = A[i];
A[i] = temp;
}
return A;
}
private static void print(int[] A){
for(int i=0;i<A.length;i++)
System.out.print(A[i]+" ");
}
}