1.对于子类的构造函数说明,下列叙述中错误的是( )。

  • 子类可以继承父类的构造函数。
  • 子类中调用父类构造函数不可以直接书写父类构造函数,而应该用super();。
  • 用new创建子类的对象时,若子类没有带参构造函数,将先执行父类的无参构造函数,然后再执行自己的构造函数。
  • 子类的构造函数中可以调用其他函数。

解析:

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的值分别为:

  • “”, 0
  • “”, 2
  • “123”, 2
  • “123”, 0

解析:序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的

正确答案:D

3.对于JVM内存配置参数:

-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

,其最小内存值和Survivor区总大小分别是()

  • 5120m,1024m
  • 5120m,2048m
  • 10240m,1024m
  • 10240m,2048m

解析:

-Xmx:最大堆大小

-Xms:初始堆大小

  1. -Xmn:年轻代大小

-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);
  • Compilation error because”~”doesn’t operate on integers
  • -5
  • -6
  • 15

解析:

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);
  • 1
  • 2
  • 3
  • 4

解析: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);
    }
}
  • Compiles fine and output is prints”It is a account type”once followed by”FIXED”
  • Compiles fine and output is prints”It is a account type”twice followed by”FIXED”
  • Compiles fine and output is prints”It is a account type”thrice followed by”FIXED”
  • Compiles fine and output is prints”It is a account type”four times followed by”FIXED”
  • Compilation fails

解析:枚举类有三个实例,故调用三次构造方法,打印三次It is a account type

正确答案 C

7.Hashtable 和 HashMap 的区别是:

  • Hashtable 是一个哈希表,该类继承了 AbstractMap,实现了 Map 接口
  • HashMap 是内部基于哈希表实现,该类继承AbstractMap,实现Map接口
  • Hashtable 线程安全的,而 HashMap 是线程不安全的
  • Properties 类 继承了 Hashtable 类,而 Hashtable 类则继承Dictionary 类
  • HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。

解析:

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目录下及其子目录下的所有类
  • 能访问java/util目录下的所有类,不能访问java/util子目录下的所有类
  • 编译错误

解析:java.util.*,只能读取其目录下的类,不能读取其子目录下的类。因为其根目录和子目录下可能有同名类,若都能读取,则会混淆。

正确答案:C

9.下面这条语句一共创建了多少个对象:String s=“welcome”+“to”+360;

  • 1
  • 2
  • 3
  • 4

解析:字面量的创建是发生在编译期,类似于上述面试题,答案只创建一个对象。

正确答案:A

10.下列哪些操作会使线程释放锁资源?

  • sleep()
  • wait()
  • join()
  • yield()

解析:

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语言的下面几种数组复制方法中,哪个效率最高?

  • for 循环逐一复制
  • System.arraycopy
  • Array.copyOf
  • 使用clone方法

解析: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<Integer> 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();
}