2021年11月03日 java1

考点1:GUI

在委托事件模型中,源生成事件并把它发送给一个或多个监听器,每个监听器必须向事件源注册。

  • A T
  • B F
显示答案/隐藏答案正确答案: A

考点2:快速排序

下面程序的输出结果是什么。

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
public class A2{ 
public static void main(String[] args){
int[] a={2,4,6,8,3,6,9,12};
doSomething(a,0,a.length-1);
for(int i=0;i<=a.length-1;i++)
System.out.print(a[i]+" ");
}
private static void doSomething(int[] a,int start,int end){
if(start<end){
int p=core(a,start,end);
doSomething(a,start,p-1);
doSomething(a,p+1,end);
}
}
private static int core(int[] a,int start,int end)
{
int x=a[end];
int i=start;
for(int j=start;j<=end-1;j++){
if(a[j]>=x){
swap(a,i,j);
i++;
}
}
swap(a,i,end);
return i;
}

private static void swap(int[] a,int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
  • A 找到最大值
  • B 找到最小值
  • C 从大到小的排序
  • D 从小到大的排序
显示答案/隐藏答案正确答案: C

这道题目的核心思想是:根据交换的次数,决定存储的位置,交换0次,存在第一位,代表最大,交换1次,存在第二位,代表次大,以此类推…..结果可以拿一个有序的递增序列进行验证,这样比较直观,而且简单粗暴

快速排序,比较经常使用的方式可以参照下面两个网址。
介绍:http://blog.csdn.net/morewindows/article/details/6684558
演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/quick_sort.asp

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
//看我的注释这种快排的思路就很清晰了,这是只从一个方向遍历的快排
public class A2 {
public static void main(String[] args) {
int[] a = { 2, 4, 6, 8, 3, 6, 9, 12 };
quickSort(a, 0, a.length - 1);
for (int i = 0; i <= a.length - 1; i++)
System.out.print(a[i] + " ");
}
private static void quickSort(int[] a, int start, int end) {
if (start < end) {
int p = core(a, start, end);
quickSort(a, start, p - 1);
quickSort(a, p + 1, end);
}
}
private static int core(int[] a, int start, int end) {
int x = a[end];
//记录遍历完后最后一个数应该放在的位置,初始就是start,因为如果前面没有数比最后一个数大,那么下面遍历完后最后一个数就应该放在start的位置
int i = start;
//遍历的目的是把参与排序的这轮数中比最后一个数大的数都放到最后一个数前面
for (int j = start; j <= end - 1; j++) {
if (a[j] &gt;= x) {
swap(a, i, j);
//每遇到一个比最后一个数大的数,最后一个数应该放的位置就+1
i++;
}
}
//这里一交换后就把最后一个数放在了正确的位置,这样左边的数都比最后一个数大,右边的数都比最后一个数小
swap(a, i, end);
return i;
}
private static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}

是快速排序的另一种实现。严蔚敏的教材上是选择第一个元素作为中枢,从两侧向中间扫描逼近,最后确定枢轴应该在的位置;而上面这种解法则是算法导论上的,选择最后一个元素作为枢轴,然后单侧扫描逼近,最后确定枢轴应该在的位置(根据用变量i记录的交换的次数决定最后一个元素是第i大,然后把它放在第i个位置)。每次确定枢轴应该在的位置这一点是相同的,不同的是确定枢轴位置的过程。

考点3:JVM参数配置

假如某个JAVA进程的JVM参数配置如下:

1
-Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3,

请问eden区最终分配的大小是多少?

  • A 64M
  • B 500M
  • C 300M
  • D 100M
显示答案/隐藏答案正确答案: C

这是网易2016年在线笔试题中的一道选择题。
先分析一下里面各个参数的含义:
-Xms:1G , 就是说初始堆大小为1G
-Xmx:2G , 就是说最大堆大小为2G
-Xmn:500M ,就是说年轻代大小是500M(包括一个Eden和两个Survivor)
-XX:MaxPermSize:64M , 就是说设置持久代最大值为64M
-XX:+UseConcMarkSweepGC , 就是说使用使用CMS内存收集算法
-XX:SurvivorRatio=3 , 就是说Eden区与Survivor区的大小比值为3:1:1
题目中所问的Eden区的大小是指年轻代的大小,直接根据-Xmn:500M和-XX:SurvivorRatio=3可以直接计算得出
500M*(3/(3+1+1))
=500M(3/5)
=500M
0.6
=300M
所以Eden区域的大小为300M。

Xms 起始内存
Xmx 最大内存
Xmn 新生代内存
Xss 栈大小。 就是创建线程后,分配给每一个线程的内存大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

考点4:泛型无法提升性能

在开发中使用泛型取代非泛型的数据类型(比如用ArrayList取代ArrayList),程序的运行时性能会变得更好。()

  • A 正确
  • B 错误
显示答案/隐藏答案正确答案: B

使用泛型的好处

1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

所以泛型只是提高了数据传输安全性,并没有改变程序运行的性能

考点5:正则表达式

以下代码将打印出

1
2
3
4
public static void main (String[] args) { 
String classFile = "com.jd.".replaceAll(".", "/") + "MyClass.class";
System.out.println(classFile);
}
  • A com. jd
  • B com/jd/MyClass.class
  • C ///////MyClass.class
  • D com.jd.MyClass
显示答案/隐藏答案正确答案: C

C。由于replaceAll方法的第一个参数是一个正则表达式,而”.“在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成”/“。如果想替换的只是”.“,那么久要写成”\\.“。

考点6:自动类型提升

代码片段:

1
2
3
4
5
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 运行期抛出异常
显示答案/隐藏答案正确答案: C

byte,short,char计算时自动提升为int

被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10

而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。

Java中的byte,short,char进行计算时都会提升为int类型。
这里有一张图片

考点7:排序算法对比

在各自最优条件下,对N个数进行排序,哪个算法复杂度最低的是? ()

  • A 插入排序
  • B 快速排序
  • C 堆排序
  • D 归并排序
显示答案/隐藏答案正确答案: A

img

img

考点8:反射机制能实现的功能

JAVA反射机制主要提供了以下哪些功能?

  • A 在运行时判断一个对象所属的类
  • B 在运行时构造一个类的对象
  • C 在运行时判断一个类所具有的成员变量和方法
  • D 在运行时调用一个对象的方法
显示答案/隐藏答案正确答案: ABCD

考点9:会话跟踪实现技术

下面哪项技术可以用在WEB开发中实现会话跟踪实现?

  • A session
  • B Cookie
  • C 地址重写
  • D 隐藏域
显示答案/隐藏答案正确答案: ABCD

考点10:

character流和byte流的区别不包括()

  • A 每次读入的字节数不同
  • B 前者带有缓冲,后者没有。
  • C 前者是字符读入,后者是字节读入。
  • D 二者没有区别,可以互换。
显示答案/隐藏答案正确答案: ABD