笔试题集锦(三)

  1. 下列标识符不合法的是 ( CD )。
    只能是下划线、$符、字母开头,另外C选项还有空格
    A._sun
    B.$abc
    C.2Java Program
    D.@java
  2. 关于接口的定义和实现,以下描述正确的是( A )。
    A.接口定义的方法只有定义没有实现
    B.接口定义的变量都必须写明final和static
    C.如果一个接口有多个类来实现,则这些类在实现接口中的方法时采用统一的代码
    D.如果一个类实现接口,则必须实现该接口中的所有方法,但方法未必申明为public
    子类必须声明public
  3. 判断
    (1) 线程从阻塞状态结束后会进入就绪状态阶段等待CPU调度(✖)
    分两种情况,sleep、join是这样,但如果是wait阻塞,则必须获取锁后才能进入就绪状态(七状态) 如果是按照(五状态),则是对的
    (2) 当一个线程结束之后,重新调用start方法会再次被CPU调度(✖)
    不能,会报出IllegalThreadStateException异常
    (3) final修饰的变量和方法不能被修改和重写,但是可以被继承(✔)
  4. 阅读下面代码,请分别写出a的结果:
//函数式接口Sum
public interface Sum {
    int sum();
}

//方式一:
int a = 10;
Sum sum = () -> {
	return a + 1;
};

//方式二:
int a = 10;
Sum sum = () -> {
	return a++;
};

//方式三:
int a = 10;
Sum sum = () -> {
	return a + 1;
};
a++;

答案:方式一的a是10,后两种方式均报错。
原因:

lambda存在闭包问题,在闭包中引用的变量,编译器会自动加上final关键字,使之不可以被修改。这里需要将a看做一个常量,所以第一种方式结果为10。
第二种方式,a++其实是 a = a + 1,存在赋值操作,而a是常量,不能被赋值,所以报错。
第三种方式,也是因为常量,导致报错。

==5~8题是字符串题目,详细原理查看《String类型内存原理》
5. String str = new String(“abc”);创建出了几个字符串对象?
答案:2个。堆中一个,常量池一个。
6. 阅读下面代码,请问b1和b2的值分别为多少?

String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
boolean b1 = s1==s4;
boolean b2 = s1.equals(s4);

答案:
b1是false ;b2是true

  1. 阅读下面代码,请问输出结果是多少?
String s1 = new String("1") + new String("2");
String s2 = "12";
System.out.println(s1 == s2);
System.out.println(s1.intern() == s2);
System.out.println(s1 == s1.intern());

答案:false true false
原因:

只要有双引号,就会将实例内容放到常量池,并返回其地址引用,所以在常量池中有了“1”、“2”和“12”
s1指向的是经过StringBuilder的append方法和toString()方法后的String堆内对象,并且保存有“12”这个实例
对象,但是并没有放到常量池,地址不同,第一个必然false
s1调用intern()方法,该方法将堆内s2指向String类对象的“12”的引用放到常量池,但
是常量池已经有了“12”的实例化,所以将常量池中的“12”的引用地址返回,此时s1.intern()与s2必然是相同的地址
而s1与s1.intern()必然不同,intern()方法返回new String对象,与s1不同,是单独在堆创建新对象返回
String s = s1.intern() 道理一样

  1. 阅读下面代码,请问输出结果是多少?
String s1 = new String("1") + new String("2");
System.out.println(s1 == s1.intern());

答案:true
原因:

s1指向了堆中String类对象地址,该对象包含有字符串“12”,当使用intern()方法后,Jvm会在常量池
查找是否有相同字符串“12”,如果没有,则在常量池新建String对象中的“12”的引用地址(而非实例)
所以,结果就是新的String类对象s1.intern()指向的常量池中的地址,与s1指向的堆中地址一样

  1. 阅读以下代码,输出结果是什么?
Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));

Integer i3 = new Integer(197);
Integer i4 = new Integer(197);
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));

Integer i5 = 97;
Integer i6 = 97;
System.out.println(i5 == i6);
System.out.println(i5.equals(i6));

Integer i7 = 197;
Integer i8 = 197;
System.out.println(i7 == i8);
System.out.println(i7.equals(i8));

答案:
false true;false true;true true;false true
详情见《基本类型包装类》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值