java笔试题_java易错笔试题整理

本文涵盖了Java编程的多个核心知识点,包括数据类型、对象赋值、类变量初始化、String对象的操作、内存管理、抽象类与最终类的区别、接口字段、JVM内存配置、并发特性以及算法应用。讨论了如String的拼接优化、变量初始化的重要性、构造方法的使用场景,以及斐波那契数列的应用。此外,还涉及到了内存空间分配、volatile关键字的作用以及代码执行的细节。
摘要由CSDN通过智能技术生成

(1)可以把任何一种数据类型的变量赋给Object类型的变量。

A.对

B.错

选A。对象类型的不必多说可以赋值;而八大基础数据类型会自动装箱后赋值给Object,所以编译运行都不会报错

(2)关于下列程序段的输出结果,说法正确的是:( )
public class MyClass{

static int i;
public static void main(String argv[]){
System.out.println(i);
}
}

A.有错误,变量i没有初始化。

B.null.

C.0

D.1

选C。类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量则必须进行初始化,他不会进行默认值赋值。

(3)检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。

package algorithms.com.guan.javajicu;

public class Inc {

public static void main(String[] args) {

Inc inc = new Inc();

int i = 0;

inc.fermin(i);

i= i ++;

System.out.println(i);

}

void fermin(int i){

i++;

}

}

A.0

B.1

C.2

D.3

选A. int i = 0; i = i ++; // 左边这个i其实是障眼法,就是一个中间变量
System.out.println(i); 这三行等价于:int i = 0; System.out.println(i++);

所以输出为0.

(4)有如下一段代码,请选择其运行结果()

public class StringDemo{

private static final String MESSAGE="taobao";

public static void main(String [] args) {

String a ="tao"+"bao";

String b="tao";

String c="bao";

System.out.println(a==MESSAGE);

System.out.println((b+c)==MESSAGE);

}

}

A.true true

B.false false

C.true false

D.false true

选C.这题是在考编译器的优化,hotspot中 编译时"tao"+"bao"将直接变成"taobao",b+c则不会优化,因为不知道在之前的步骤中bc会不会发生改变,而针对b+c则是用语法糖,新建一个StringBuilder来处理。java对于String类型的相加是通过StringBuffer实现的,先构造一个StringBuffer对象来存放tao,然后通过append方法追加上bao。StringBuffer对象的分配是在堆上的。如果在b和c前面加上final修饰符,则hotspot也会将其优化,输出为true。

(5)下面代码的运行结果为:()

import java.io.*;

import java.util.*;

public class foo{

public static void main (String[] args){

String s;

System.out.println("s=" + s);

}

}

A.代码得到编译,并输出“s=”

B.代码得到编译,并输出“s=null”

C.由于String s没有初始化,代码不能编译通过

D.代码得到编译,但捕获到 NullPointException异常

选C.局部变量,没有像成员变量那样类加载时会有初始化赋值,所以要使用局部变量时,一定要显式地给它赋值,也就是定义时就给它数值。

(6)关于抽象类与最终类,下列说法错误的是?

A.抽象类能被继承,最终类只能被实例化。

B.抽象类和最终类都可以被声明使用

C.抽象类中可以没有抽象方法,最终类中可以没有最终方法

D.抽象类和最终类被继承时,方法可以被子类覆盖

选D.对于选项B. 抽象类和最终类都可以被声明使用。
这里只是说“声明”,并没有说“实例化”;如果只是声明是可以的,最常见的使用方式就是:
1、父类类型的引用指向子类的对象;
2、 接口类型的引用指向该接口的实现类的对象;
以上两种使用方式也就是所谓的“向上转型”。

(7)下面字段声明中哪一个在interface主体内是合法的? ()

A.private final static int answer = 42;

B.public static int answer = 42;

C.final static answer = 42;

D.int answer;

选B。在接口中,属性都是默认public static final修饰的,所以:

A(错误):不能用private修饰;

B(正确):在接口中,属性默认public static final,这三个关键字可以省略;

C(错误):没写属性的类型;

D(错误):final修饰的属性必须赋值;

(8) 对于JVM内存配置参数:

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 ,其最小内存值和Survivor区总大小分别是()

A.5120m,1024m

B.5120m,2048m

C.10240m,1024m

D.10240m,2048m

选D.-Xmx10240m:代表最大堆 -Xms10240m:代表最小堆 -Xmn5120m:代表新生代 -XXSurvivorRatio=3:代表Eden:Survivor = 3 根据Generation-Collection算法(目前大部分JVM采用的算法),一般根据对象的生存周期将堆内存分为若干不同的区域,一般情况将新生代分为Eden ,两块Survivor; 计算Survivor大小, Eden:Survivor = 3,总大小为5120,3x+x+x=5120 x=1024 新生代大部分要回收,采用Copying算法,快!老年代 大部分不需要回收,采用Mark-Compact算法

(9)用户不能调用构造方法,只能通过new关键字自动调用。()

A.正确

B.错误

选B。

在类内部可以用户可以使用关键字this.构造方法名()调用(参数决定调用的是本类对应的构造方法)

在子类中用户可以通过关键字super.父类构造方法名()调用(参数决定调用的是父类对应的构造方法。)

反射机制对于任意一个类,都能够知道这个类的所有属性和方法,包括类的构造方法。

(10)static String str0="0123456789";

static String str1="0123456789";

String str2=str1.substring(5);

String str3=new String(str2);

String str4=new String(str3.toCharArray());

str0=null;

假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()

A.5

B.10

C.15

D.20

选C。substring实际是new,5字符。str3和4也都是new,每个5字符。分别都会创建新的对象。常量池是PermGen的。因此应该是一共15字符。str1在常量池里,常量池是在PermGen中,不属于Heap空间。str1.substring(5)截取的字符串要重新放到一个字符串,在这个过程重新new了一个String的对象存放字符串,所以str2是在堆区间的。

(11)下面关于volatile的功能说法正确的是哪个

A.原子性

B.有序性

C.可见性

D.持久性

选B,C。synchronized保证三大性,原子性,有序性,可见性,volatile保证有序性,可见性,不能保证原子性

(12)在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();

考察的斐波那契数列。你需要爬11楼的时候,你倒回去一步只能待在第10楼或者第9楼。换句话说就是到达第9楼的方法次数加上第10楼的方法次数。

如果你待在第10楼,就得待在第9楼或者第8楼

如果你待在第9楼,就得待在第8楼或者第7楼

......

如果你待在第3楼,就得待在第1楼或者第2楼

爬1楼一种方法,

爬2楼两种方法。

爬3楼就是爬1楼方法次数加2楼的方法次数。

用数学表达就是:

a(11)=a(10)+a(9)=144

a(10)=a(9)+a(8)=89

a(9)=a(8)+a(7)=55

a(8)=a(7)+a(6)=34

a(7)=a(6)+a(5)=21

a(6)=a(5)+a(4)=13

a(5)=a(4)+a(3)=8

a(4)=a(3)+a(2)=5

a(3)=a(2)+a(1)=3

a(2)=2

a(1)=1

(13)以下代码段执行后的输出结果为

public class Test {

public static void main(String args[]) {

int x = -5;

int y = -12;

System.out.println(y % x);

}

}

正确答案:-2。 取模运算,结果的符号和被除数符号一致,切记切记

eec5c6ce5ab4146f5b8e11755870c395.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值