目录
一、单选题
二、多选题
三、编程题
3.1统计回文
3.2连续最大和
一、单选题
1.下面的程序 编译运行后,在屏幕上显示的结果是()
public class Test {
public static void main(String args[]) {
int x, y;
x = 5 >> 2;
y = x >>> 2;
System.out.println(y);
}
}
A 0
B 2
C 5
D 80
>>表示有符号右移,5 >> 2 相当于 5除于2两次,等于1 ,>>> 表示无符号右移,高位用0 填充,0001右移两位 0000。
所以正确答案是 A
2.以下代码结果是什么?
public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+"."+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}
A 代码可以编译运行,输出“AB.AB”。
B 代码可以编译运行,输出“A.A”。
C 代码可以编译运行,输出“AB.B”。
D 代码可以编译运行,输出“A.B”。
作对这道题的关键是要理解Java的值传递,关于值传递和引用传递的解释如下:
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
这道题中a、b(是引用的副本,Java中没有引用传递)传入operate()函数中,但最后a指向的对象的值发生了变化,而b指向的对象的值没有发生变化,这是因为x.append(y),直接将b加入了a中,改变了a指向的对象的值,而y=x;并没有改变b指向对象的值,指向将y指向了x所指向的对象(之前y和b指向同一个对象)。
所以正确答案是 C
3. 在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()
A this.A(x)
B this(x)
C super(x)
D A(x)
在类的其他构造方法中调用该构造方法的语句格式是this(变量)。在子类中调用父类的有参构造是super(变量)。
所以正确答案是 B
4.下面代码的运行结果是()
public static void main(String[] args){
String s;
System.out.println("s="+s);
}
A 代码编程成功,并输出”s=”
B 代码编译成功,并输出”s=null”
C 由于String s没有初始化,代码不能编译通过。
D 代码编译成功,但捕获到NullPointException异常
在main函数中的s变量属于局部变量必须初始化才能使用,否则编译会不通过。
所以正确答案是 C
5. 装箱、拆箱操作发生在: ()
A 类与对象之间
B 对象与对象之间
C 引用类型与值类型之间
D 引用类型与引用类型之间
装箱是将值类型装换成引用类型的过程;拆箱就是将引用类型转换成值类型的过程。
所以正确答案是 C
6.一个以”.java”为后缀的源文件
A 只能包含一个类,类名必须与文件名相同
B 只能包含与文件名相同的类以及其中的内部类
C 只能有一个与文件名相同的public类,可以包含其他类
D 可以包含任意类
一个以”.java”为后缀的源文件只能有一个与文件名相同的public类,可以包含其他类 。
所以正确答案是 C
7.下列哪个说法是正确的()
A ConcurrentHashMap使用synchronized关键字保证线程安全
B HashMap实现了Collction接口
C Array.asList方法返回java.util.ArrayList对象
D SimpleDateFormat是线程不安全的
ConcurrentHashMap在JDK1.7的时候,使用Segment这个数据结构,利用锁分段技术保证了线程安全,JDK1.8的时候,Segment这个数据结构就废了,开始使用Synchronized+CAS保证线程安全。但是内部类中并没有重写涉及结构性变化的方法,所以一旦调用结构性变换的函数,例如add,会出现运行时异常UnsupportedOperationException。
HashMap没有实现Collection,Map和Collection是集合框架中独立的两大接口。
Arrays.asList返回的也是ArrayList,不过这是个Arrays中的内部类,实现了List接口,继承了AbstractList。
DateFormat这个接口的实现类都是不安全的。
所以正确答案是 D
8.以下说法错误的是()
A 虚拟机中没有泛型,只有普通类和普通方法
B 所有泛型类的类型参数在编译时都会被擦除
C 创建泛型对象时请指明类型,让编译器尽早的做参数检查
D 泛型的类型擦除机制意味着不能在运行时动态获取List中T的实际类型
虚拟机中没有泛型,只有普通类和普通方法。有泛型类的类型参数在编译时都会被擦除。创建泛型对象时请指明类型,让编译器尽早的做参数检查。
Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。因此List和List在运行时实际上是相同的类型。这两种类型都被擦除成它们的“原生”类型,即List。
所以正确答案是 D
9.指出以下程序运行的结果是
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
//引用类型变量,传递的是地址,属于引用传递。
str="test ok";
ch[0]='g';
}
}
A good and abc
B good and gbc
C test ok and abc
D test ok and gbc
这道题和第二题是一样的,ch指向的对象的值发生了变化,而str指向的对象的值没有发生变化。
所以正确答案是 B
二、多选题
10.下列有关JAVA异常处理的叙述中正确的是()
A finally是为确保一段代码不管是否捕获异常都会被执行的一段代码
B throws是用来声明一个成员方法可能抛出的各种非运行异常情况
C final用于可以声明属性和方法,分别表示属性的不可变及方法的不可继承
D throw是用来明确地抛出一个异常情况
finally块在异常中是为确保一段代码不管是否捕获异常都会被执行的一段代码。throws是用来声明一个成员方法可能抛出的各种非运行异常情况。 throw是用来明确地抛出一个异常情况。
final用于类意味着说明该类无法被继承,用于方法则说明该方法无法被覆盖,用于变量则说明属性不可变(可用于静态和非静态属性),但多和staic连用,表示常量。
所以正确答案是 A、B、D
三、编程题
3.1统计回文
例如: A = “aba”,B = “b”。这里有4种把B插入A的办法: * 在A的第一个字母之前: "baba" 不是回文 * 在第一个字母‘a’之后: "abba" 是回文 * 在字母‘b’之后: "abba" 是回文 * 在第二个字母'a'之后 "abab" 不是回文 所以满足条件的答案为2
在本题中创建了一个S_true方法,用于判断在某位置加入了一个字符后这个字符串是否是回文的,即判断sb.charAt(j)==sb.charAt(sb.length()-1-j)即可,若有一个不是那么返回false,证明在这个位置不能放。在每一个位置都试一次,统计true的个数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
int count = 0;
for (int i = 0; i <= s1.length(); i++) {
Boolean a = S_true(i,s1,s2);
if(a){
count++;
}
}
System.out.println(count);
}
public static Boolean S_true(int i,String s,String s2){
StringBuilder sb = new StringBuilder(s);
sb.insert(i,s2);
for (int j = 0; j < sb.length(); j++) {
if(sb.charAt(j)==sb.charAt(sb.length()-1-j)){
continue;
}else{
return false;
}
}
return true;
}
}
3.2连续最大和
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
在本题中创建两个变量sum和max使他们都等于num[0],然后进入循环从数组下标为1的数开始遍历,然后比较sum+num[1]和num[1],那么新的sum就等于大的那一个,如果sum比max还那么就将max置换为sum。一直循环直到数组结束。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] num = new int[n];
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
int max = num[0];
int sum = num[0];
for(int i = 1;i<n;i++){
sum = Math.max(sum+num[i],num[i]);
if(sum>=max){
max = sum;
}
}
System.out.println(max);
}
}