1.对于子类的构造函数说明,下列叙述中错误的是( )。
解析:
A.java继承中对构造函数是不继承的,只是显式或者隐式调用,所以A选项不对
正确答案:A
2.有以下一个对象:
public class DataObject implements Serializable{
private static int i=0;
private String word=" ";
public void setWord(String word){
this.word=word;
}
public void setI(int i){
Data0bject. i=I;
}
}
创建一个如下方式的DataObject:
DataObject object=``new` `Data0bject ( );
object. setWord(``"123"``);
object. setI(2);
将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:
解析:序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的
正确答案:D
3.对于JVM内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和Survivor区总大小分别是()
解析:
-Xmx:最大堆大小
-Xms:初始堆大小
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值
年轻代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。
-Xms初始堆大小即最小内存值为10240m
正确答案 D
4.What results from the following code fragment?
int` `i = ``5``;
int` `j = ``10``;
System.out.println(i + ~j);
解析:
1.10原码:0000000000000000,0000000000001010;
~10: 1111111111111111,1111111111110101
变为负数,计算机用补码存储
~10反码:10000000000000000,0000000000001010
~10补码:10000000000000000,0000000000001011,等于 -11
2.公式-n=n+1可推出n=-n-1,所以~10=-11再加5结果为-6
5.对于以下代码段,4个输出语句中输出true的个数是( )
class A{}
class B extends A{}
class C extends A{}
class D extends B{}
A obj = new D();
System.out.println(obj instanceof B);
System.out.println(obj instanceof C);
System.out.println(obj instanceof D);
System.out.println(obj instanceof A);
解析:instanceof是判断前者是否可以类型可以转化为后者,可以转化即为true,分为向上转型和向下转型B D都是A的子类向下转型,
6.what is the result of the following code?
enum AccountType
{
SAVING, FIXED, CURRENT;
private AccountType()
{
System.out.println(“It is a account type”);
}
}
class EnumOne
{
public static void main(String[]args)
{
System.out.println(AccountType.FIXED);
}
}
解析:枚举类有三个实例,故调用三次构造方法,打印三次It is a account type
正确答案 C
7.Hashtable 和 HashMap 的区别是:
解析:
Hashtable:
(1)Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
(2)Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
(3)HashTable直接使用对象的hashCode。
HashMap:
(1)由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
(2)不是线程安全的,HashMap可以接受为null的键(key)和值(value)。
(3)HashMap重新计算hash值
正确答案 B C D E
8.有一个源代码,只包含import java.util.* ; 这一个import语句,下面叙述正确的是? ( )
解析:java.util.*,只能读取其目录下的类,不能读取其子目录下的类。因为其根目录和子目录下可能有同名类,若都能读取,则会混淆。
正确答案:C
9.下面这条语句一共创建了多少个对象:String s=“welcome”+“to”+360;
解析:字面量的创建是发生在编译期,类似于上述面试题,答案只创建一个对象。
正确答案:A
10.下列哪些操作会使线程释放锁资源?
解析:
1.sleep()方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
2.wait()方法
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
3.yield方法
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
4.join方法
等待该线程终止。
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
正确答案 BC
11.java语言的下面几种数组复制方法中,哪个效率最高?
解析:System.arraycopy>clone>Arrays.copyOf>
for循环,这个有兴趣自己测试一下就知道了。
这里面在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。
而Arrays.copyOf(注意是Arrays类,不是Array)的实现,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。
正确答案 B
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
解析:
字符串 S 中的每一个位置都有一个“深度”,即该位置外侧嵌套的括号数目。例如,字符串 (()(.())) 中的 . 的深度为 2,因为它外侧嵌套了 2 层括号:((.))。
我们用一个栈来维护当前所在的深度,以及每一层深度的得分。当我们遇到一个左括号 ( 时,我们将深度加一,并且新的深度的得分置为 0。当我们遇到一个右括号 ) 时,我们将当前深度的得分乘二并加到上一层的深度。这里有一种例外情况,如果遇到的是 (),那么只将得分加一。
下面给出了字符串 (()(())) 每次对应的栈的情况:
[0, 0] (
[0, 0, 0] ((
[0, 1] (()
[0, 1, 0] (()(
[0, 1, 0, 0] (()((
0, 1, 1] (()(()
[0, 3] (()(())
[6] (()(()))
public int scoreOfParentheses(String S) {
Stack stack = new Stack();
stack.push(0); // The score of the current frame
for (char c: S.toCharArray()) {
if (c == '(')
stack.push(0);
else {
int v = stack.pop();
int w = stack.pop();
stack.push(w + Math.max(2 * v, 1));
}
}
return stack.pop();
}