2021年09月04日 java

考点1:访问控制权限修饰符

下列修饰符中与访问控制权限无关的是?( )

  • A private
  • B public
  • C protected
  • D final

解析

显示答案/隐藏答案正确答案: D

java常见修饰符

权限修饰符

private: 修饰私有变量
默认修饰符default(不用把default写出来): 比private限制更少,但比protected限制更多
protected: 修饰受保护变量
public: 修饰公有变量

状态修饰符

final 最终变量(final修饰类,该类不能被继承,final修饰方法,该方法不能被重写,final修饰变量,该变量不能被重新赋值(相当于常量))
static 静态变量(随着类的加载而加载,优先于对象存在,被所有对象所共享,可以通过类名调用)

抽象修饰符

abstract 抽象类&抽象方法(抽象类不能被实例化,抽象类中不一定有抽象方法,但有抽象方法的类必须定义为抽象类)

考点2:main方法

Java Application 中的主类需包含main方法,以下哪项是main方法的正确形参?( )

  • A String args
  • B String[] args
  • C Char arg
  • D StringBuffer[] args

解析

显示答案/隐藏答案正确答案: B

考点3:重载

类 ABC 定义如下:

1
2
3
4
public class ABC{
public double max(double a,double b) {}

}

将以下哪个方法插入行 3 是不合法的。()

  • A public float max(float a, float b, float c){ }
  • B public double max (double c, double d){ }
  • C public float max(float a, float b){ }
  • D private int max(int a, int b, int c){ }

解析

显示答案/隐藏答案正确答案: B

重载要求:两同一不同

重载要求方法的参数列表需要不一样(个数,或者参数类型),修改参数名或者修改返回值以及访问权限并没有用

考点4:异常try-catch-finally执行流程

AccessViolationException异常触发后,下列程序的输出结果为( )

1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)  
{
try
{
throw new AccessViolationException();
Console.WriteLine("error1");
}
catch (Exception e)
{
Console.WriteLine("error2");
}
Console.WriteLine("error3");
}
  • A
    1
    2
    error2
    error3
  • B error3
  • C error2
  • D error1

解析

显示答案/隐藏答案正确答案: A

考点5:集合HashMap的key和value可以为null,放入时如果key相同,则新value覆盖旧的value

以下java程序代码,执行后的结果是()

1
2
3
4
java.util.HashMap map=new java.util.HashMap();
map.put("name",null);
map.put("name","Jack");
System.out.println(map.size());
  • A 0
  • B null
  • C 1
  • D 2

解析

显示答案/隐藏答案正确答案: C
  • HashMap可以插入null的key或value。
  • 插入的时候,检查是否已经存在相同的key,
    • 如果不存在,则直接插入,
    • 如果存在,则用新的value替换旧的value。
      在本题中,第一条put语句,会将key/value对插入HashMap,而第二条put,因为已经存在一个key为name的项,所以会用新的value替换旧的value,
      因此,两条put之后,HashMap中只有一个key/value键值对。那就是(name,jack)。所以,size为1.

考点6:boolean变量只能和boolean变量比较

已知boolean result = false,则下面哪个选项是合法的:

  • A result=1
  • B result=true;
  • C if(result!=0) {//so something…}
  • D if(result) {//do something…}

解析

显示答案/隐藏答案正确答案: BD

1、boolean类型只有两个直接量值:true和false.
2、除成员变量会有默认初始值外,其他变量必须在第一次使用之前初始化

boolean类型的默认值是false;

基本数据类型的默认值(成员变量)

其余的7种基本类型默认值:
byte是 (byte)0;
short是 (short)0;
int是 0;
long是 0L;
float 是0.0f;
double 是0.0d;
char是 \u0000.
String是null.

考点7:java关键字和常量

下列不是 Java 关键字的是 ( )

  • A abstract
  • B false
  • C native
  • D sizeof

解析

显示答案/隐藏答案正确答案: BD

Java中的关键字有哪些

答:1)48个关键字:abstractassertbooleanbreakbytecasecatchcharclasscontinuedefaultdodoubleelseenumextendsfinalfinallyfloatforifimplementsimportintinterfaceinstanceoflongnativenewpackageprivateprotectedpublicreturnshortstaticstrictfpsuperswitchsynchronizedthisthrowthrowstransienttryvoidvolatilewhile

Java保留字

2)2个保留字(现在没用以后可能用到作为关键字):gotoconst

Java特殊直接量 Java常量

3)3个特殊直接量:truefalsenull

考点8:暂时不懂:Jvm垃圾回收

以下哪些jvm的垃圾回收方式采用的是复制算法回收

  • A 新生代串行收集器
  • B 老年代串行收集器
  • C 并行收集器
  • D 新生代并行回收收集器
  • E 老年代并行回收收集器
  • F cms收集器

解析

显示答案/隐藏答案正确答案: AD

答案AD
新生代串行收集/并行回收器:复制算法;
老年代串行收集/并行回收器:标记-压缩算法;
并行收集器:将串行收集器多线程化,回收策略和串行收集器一致,因此该收集器是新生代为复制算法,老年代为标记-压缩算法。
CMS收集器:Concurrent Mark Sweep,从名字就能知道使用的是多线程的标记-清除算法。

在垃圾的分代回收机制中
新生代一般采用“复制”算法:因为新生代每次都有大批量对象死去,就以少量对象的复制成本完成收集
老年代一般采用“标记-整理/清除”算法:因为对象存活率高,且没有额外内存,故采用“标记-整理”或者“标记-清除”

两个最基本的java回收算法:复制算法和标记清理算法

复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象

两个概念:新生代和年老代

新生代:初始对象,生命周期短的
永久代:长时间存在的对象

整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收
P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理 CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制

综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理

考点9:int赋值给Integer时自动装箱 Integer自动装箱时-128~+127范围内使用缓存数组中的值 Integer和int比较时自动拆箱然后比较值

1
2
3
4
5
6
Integer a1=17,b2=17;
Integer b1=2017,b2=2017;
Integer c1=new Integer(17);
Integer c2=new Integer(17);
Integer d1=new Integer(2017);
int d2=2017;

以下语句返回值为 true 的2是()

  • A a1==a2
  • B d1==d2
  • C b1==b2
  • D c1==c2

解析

显示答案/隐藏答案正确答案: AB

Integer缓存-128到+127

A,B. Integer a1 = 17; 语句执行的是valueOf()方法

G:\java\java8\jdk-8u221\src.zip!\java\lang\Integer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
......
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];

static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}
......
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
......

对于-128到127之间的数, Integer直接从数组中取, 故a1, a2指向的是同一个对象, A正确.

其余都是new出来的对象, 显然地址都不相同.

int与Integer比较时 只比较值

int类型与Integer类型比较时, 先将Integer拆箱, 再比较值, 故B正确.

考点10:正则表达式身份证号

关于身份证号,以下正确的正则表达式为( )

  • A isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
  • B isIDCard=/^[1-9]\d{7}((9\d)|(1[0-2]))(([0|1|2]\d)|3[9-1])\d{3}$/;
  • C isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
  • D isIDCard=/^[1-9]\d{5}[1-9]\d{3}((9\d)|(1[9-2]))(([0|1|2]\d)|3[9-1])\d{4}$/;

解析

显示答案/隐藏答案正确答案: AC

正确选项
A选项:isIDCard=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/
C选项:isIDCard=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/

常用正则表达式

^:起始符号,^x表示以x开头
$:结束符号,x$表示以x结尾
[n-m]:表示从n到m的数字
\d:表示数字,等同于[0-9]
X{m}:表示由m个X字符构成,\d{4}表示4位数字

身份证构成 15位 18位

15位身份证的构成:六位出生地区码+六位出身日期码+三位顺序码
18位身份证的构成:六位出生地区码+八位出生日期码+三位顺序码+一位校验码

C选项的构成:
[1-9]\d{5}:六位出生地区码,出生地区码没有以0开头,因此第一位为[1-9]
[1-9]\d{3}:八位出生日期码的四位年份,同样年份没有以0开头。
((0\d)|(1[0-2])):八位出生日期码的两位月份,| 表示或者,月份的形式为0\d或者是101112
(([0|1|2]\d)|3[0-1]):八位出生日期码的两位日期,日期由01至31。
\d{4}:三位顺序码+一位校验码,共四位。

A选项的构成:
[1-9]\d{7}:六位出生地区码+两位出生日期码的年份,这里的年份指后两位,因此没有第一位不能为0的限制,所以合并了。
后面的与C选项类似了。
好吧其实我也是第一次知道身份证还有15位的。