努力经营当下,直至未来明朗!
普通小孩也要热爱生活!
一、选择
- 下列Java代码中的变量a、b、c分别在内存的____存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
A 堆区、堆区、堆区
B 堆区、栈区、堆区
C 堆区、栈区、栈区
D 堆区、堆区、栈区
E 静态区、栈区、堆区
F 静态区、栈区、栈区
- 以下声明合法的是()
A default String s
B public final static native int w( )
C abstract double d
D abstract final double hyperbolicCosine( )
- 下面代码的输出结果是什么?
public class ZeroTest {
public static void main(String[] args) {
try{
int i = 100 / 0;
System.out.print(i);
}catch(Exception e){
System.out.print(1);
throw new RuntimeException();
}finally{
System.out.print(2);
}
System.out.print(3);
}
}
A 3
B 123
C 1
D 12
- 有代码片段如下:
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
关于上面代码片段叙述正确的是()
A 输出结果:13
B 语句:b6=b4+b5编译出错
C 语句:b3=b1+b2编译出错
D 运行期抛出异常
二、编程
1. 井字棋
井字棋
给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。
2. 密码强度等级
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
答案
1. 选择
- 注意区分:final是表示是常量不可变的,static才是静态的。
① 栈:局部变量 + 对象引用
② 堆:成员变量 + 对象本身
③ 方法区:静态变量、类对象
注意:即使被final修饰也只是表明是不可变的而已,依旧还是局部变量;static修饰的才是静态变量。
故:选C
- ① 访问控制符:public、protected、default、private,如果啥也没写就是default/friendly,但是不能手动写上,写上就报错。
② 被native修饰的是本地方法,底层是C++,表明这个方法采用的是JNI技术(Java Native Interface)完成想要的功能,JNI技术上层规范是JNA(Java Native Access),JNI技术其实也是实现了Java语言与其他语言的通信,比如这次就是C++,很多的方法采用的都是native修饰符,比如Object中hashCode()、clone()、notify()、wait()、以及System中的arraycopy()。
③ 属性的非可访问控制符可以是static和final,没有abstract。abstract修饰的是方法和类。
④ 方法的非可访问控制符可以是abstract、static、final,但是abstract不可以和static以及final连用,毕竟abstract是虚拟的动态的,但是static和final都是静态的,不过static和final可以连用,毕竟两个都是静态的。
故:选B
- ① 分母为0会抛出异常,所以在执行到
int i = 100/0;
的时候就会捕捉到异常直接往后执行catch语句块,输出1;
② 然后再catch中遇到了throw new RuntimeException();
,无论如何都是会执行finally语句块的,所以就只是执行finally中的代码块,其他代码都不会执行!
故:选D
- 本题主要考查的是整型提升
① final修饰的是常量,b6=b4+b5; 可以直接看作是b6=10,其在编译的时候就已经变成b6=10了,不会发生任何错误。
② 而b1和b2是byte类型的,在进行算术运算时会进行整型提升,变为int类型,计算结果是int类型,最后在赋值时类型不匹配,编译失败,需要强制类型转换。
故:选C
- this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
2. 编程
- 井字棋
1)思路:
① 井字棋是N*N的二维数组,获胜条件是横竖斜任意连成一条直线(N个)。
② 获胜的条件是行全为1 or 列全为1 or 主副对角线全为1,也就是最后和为N.
2)代码:
import java.util.*;
public class Board {
public boolean checkWon(int[][] board) {
// write code here
// 1.首先检查每一行
int len = board.length;
int sum = 0;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
sum += board[i][j];
}
// 一行结束,判断是否获胜
if(sum == len) {
return true;
}
}
// 2.然后检查每一列
sum = 0;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
sum += board[j][i];
}
if (sum == len) {
return true;
}
}
// 3.检查主对角线
sum = 0;
for (int i = 0; i < len; i++) {
sum += board[i][i];
}
if (sum == len) {
return true;
}
// 4. 检查副对角线
sum = 0;
for (int i = 0; i < len; i++) {
sum += board[i][len-i-1];
}
if(sum == len) {
return true;
}
return false;
}
}
- 密码强度等级
1)思路:
对于每一个维度要进行单独判断(ASCII码值),然后最后将各单项分值相加,对照判断等级。
2)代码:
// 密码强度等级判定
// 维度:长度、字母、数字、符号、奖励
// 单项值相加进行等级判断
import java.util.Scanner;
public class Main {
// 等级判断
private static void getRank(int sumScore) {
if (sumScore >= 90) {
System.out.println("VERY_SECURE");
} else if(sumScore >=80) {
System.out.println("SECURE");
} else if(sumScore >= 70) {
System.out.println("VERY_STRONG");
} else if(sumScore >= 60) {
System.out.println("STRONG");
} else if(sumScore >= 50) {
System.out.println("AVERAGE");
} else if(sumScore >= 25) {
System.out.println("WEAK");
} else {
System.out.println("VERY_WEAK");
}
}
// 长度分值
private static int getLen(String password) {
if(password.length() <= 4) {
return 5;
} else if (password.length()>=5 && password.length()<=7) {
return 10;
} else {
return 25;
}
}
// 字母分值:
// 看是否为大小写字母,并且要看是否全为大/小,或者是混合
// 此时就需要统计个数
private static int getChar(String password) {
int big = 0;
int small = 0;
// 遍历看每一个字符是否为字母:使用ASCII码值
for (int i = 0; i < password.length(); i++) {
if(password.charAt(i)>='a'&& password.charAt(i)<='z') {
small++;
} else if (password.charAt(i)>='A'&& password.charAt(i)<='Z') {
big++;
}
}
// 遍历完成后判断,然后进行统分
if(small>0 && big>0) {
return 20;
} else if (small>0 || big>0) {
return 10;
} else {
return 0;
}
}
// 数字分值
// 方法跟字母判断类似,同样要统计个数
private static int getNum(String password) {
int num = 0;
for (int i = 0; i < password.length(); i++) {
if(password.charAt(i)>='0' && password.charAt(i)<='9') {
num++;
}
}
if (num == 0) {
return 0;
} else if (num == 1) {
return 10;
} else {
return 20;
}
}
// 符号分值
// 数字分值类似
private static int getSymbol(String password) {
int sym = 0;
for (int i = 0; i < password.length(); i++) {
char ch = password.charAt(i);
if((ch>=33 && ch<=47) || (ch>=58 && ch<=64) ||
(ch>=91 && ch<=96) || (ch>=123 && ch<=126)) {
sym++;
}
}
if(sym == 0) {
return 0;
} else if(sym == 1) {
return 10;
} else {
return 25;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String password = in.next();
// 进行奖励以及总分计算
int charScore = getChar(password);
int numScore = getNum(password);
int symScore = getSymbol(password);
int sumScore = getLen(password);
if (symScore==0 && charScore!=0 && numScore!=0) { // 只有字母和数字
sumScore += charScore + numScore + 2;
} else if(charScore==20 && symScore!=0 && numScore!=0) { // 大小写字母、数字、符号
sumScore += charScore + numScore + symScore + 5;
} else if (charScore==10 && symScore!=0 && numScore!=0) {
sumScore += charScore + numScore + symScore + 3;
} else {
sumScore += charScore + numScore + symScore;
}
// 进行等级判断
getRank(sumScore);
}
}
}