1.静态代码块,类的加载顺序
class Parent {
static {
System.out.println("Parent's 静态代码块");
}
{
System.out.println("Parent's 代码块");
}
public Parent() {
System.out.println("Parent's 构造方法");
}
}
public class Child extends Parent{
static {
System.out.println("Child's 静态代码块");
}
{
System.out.println("Child's 代码块");
}
public Child() {
System.out.println("Child's 构造方法");
}
public static void main(String[] args) {
new Child();
}
}
执行结果
Parent's 静态代码块
Child's 静态代码块
Parent's 代码块
Parent's 构造方法
Child's 代码块
Child's 构造方法
2.在类当中不能直接进行运算
选项中哪一行代码可以替换 //add code here 而不产生编译错误
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
//抽象类可以包含抽象方法,也可以不包含,故可以重载
A. public abstract void method(int a);
//在类当中不能直接进行运算,方法当中才可以
B.consInt=constInt+5;
C.public int method();
D.public abstract void anotherMethod(){}
public class Parent {
int a=10;
//在类当中不能直接运算,只能间接去运算,故报错
a=11;
}
总结:这是因为在java当中对成员变量只能进行申明操作,不能进行逻辑操作,在java当中逻辑操作是放在方法当中执行的。int a=10;是申明操作,a=11;是逻辑操作,所以会报错。
3.null
有关下述Java代码描述正确的选项是__F。
public class TestClass {
private static void testMethod(){
System.out.println("testMethod");
}
public static void main(String[] args) {
((TestClass)null).testMethod();
}
}
编译不通过
编译通过,运行异常,报NullPointerException
编译通过,运行异常,报IllegalArgumentException
编译通过,运行异常,报NoSuchMethodException
编译通过,运行异常,报Exception
运行正常,输出testMethod
解析
在java当中null是一个关键字,表示不确定的对象,null可以被强制类型转换成任意类型的对象,故此处(TestClass)null,表示将null强制转换为TestClass,故选F
4.成员变量与局部变量在未给初值的时候打印的区别
成员变量要打印可以不给初值,局部变量要打印必须要给出初值
这是因为系统会自动为堆当中的成员变量赋值,但是不会为栈当中的局部变量赋初值(栈当中内存小,赋初值开销太大),故成员变量可以直接打印,局部变量要赋初值之后才可以打印。
在使用final修饰成员变量的时候一必须要赋初值,因为如果你为赋初值,说明为null,而且不可以改变,在调用的时候会报空指针异常,故在java设计的时候设计成成员变量在被final修饰的时候必须赋初值,在局部变量当中,因为没有初值,所以在,所以在final修饰之后,可以有一次赋值的机会。
final修饰的成员变量可以在方法块或者构造器/方法块当中赋值。因为在
5.哈希表
Question1:
将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为: H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
(1) 请画出所构造的散列表。
(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。
Ans:
(1).首先明确一个概念装载因子,装载因子是指所有关键子填充哈希表后饱和的程度,它等于 关键字总数/哈希表的长度。 根据题意,我们可以确定哈希表的长度为 L = 7/0.7 = 10;因此此题需要构建的哈希表是下标为0~9的一维数组。根据散列函数可以得到如下散列函数值表。
H(Key) = (keyx3) MOD 7, 例如key=7时, H(7) = (7x3)%7 = 21%7=0,其他关键字同理。
采用线性探测再散列法处理冲突,所构造的散列表为:
下面对散列表的构造方式加以说明,注意表1中的关键字7和14,30和9, 11和18,这三组关键子的H(Key)值相同,这在构建散列表时就会产生冲突,因为他们的地址相同,所以要通过一定的冲突处理方法来解决这个问题。依题,采用线性探测再散列法处理冲突。下面详细介绍如何构建散列表:
第一个key 7,它的地址是0,因此放到散列表的数组下表为0的位置,这个位置上没有关键字,因此没有冲突可以直接填入;
第二个key 8,它的地址是3,因此放到散列表的数组下表为3的位置,这个位置上没有关键字,因此没有冲突可以直接填入;
第三个key 30,它的地址是6,因此放到散列表的数组下表为6的位置,这个位置上没有关键字,因此没有冲突可以直接填入;
第四个key 11,它的地址是5,因此放到散列表的数组下表为5的位置,这个位置上没有关键字,因此没有冲突可以直接填入;
第五个key 18,它的地址是5,因此放到散列表的数组下表为5的位置,但这个位置上已经有关键字11,遇到了冲突,此时我们根据线性探测再散列法来处理这个冲突,探测下一个位置6, 6这个位置上已经存在关键字30则继续增加步长1,因此现在的新地址应为7,位置7上没有关键字,放入即可,到此冲突已经解决;
第六个key 9,它的地址是6,因此放到散列表的数组下表为6的位置,但这个位置上已经有关键字30,遇到了冲突,探测下一个位置7, 7这个位置上已经存在关键字18则继续增加步长1,因此现在的新地址应为8,位置8上没有关键字,放入即可;
第七个key 14,它的地址是0,因此放到散列表的数组下表为0的位置,但这个位置上已经有关键字7,遇到了冲突,探测下一个位置1, 位置1上没有关键字,放入即可;
到这一步所有关键字均已填入,散列表已经构造完成,如表2所示。
(2)等概率情况下查找成功平均查找长度:
这一问可以根据第一问的构造过程求解:
key7一次就填入了表中,因此查找次数为1,同理8, 30, 11查找次数均为1; key18 进行了3次放入操作,探测位置分别是5,6,7 ,因此查找次数为3;key9也是3次;key14 进行了两次探测,因此查找次数为2。次数表如表3所示
所以ASLsuccess= (1+1+1+1+3+3+2)/ 7 = 12/7。
等概率情况下查找不成功的平均查找长度:
接下来讨论不成功的情况, 看表2,计算查找不成功的次数就直接找关键字到第一个地址上关键字为空的距离即可, 但根据哈希函数地址为MOD7,因此初始只可能在0~6的位置。等概率情况下,查找0~6位置查找失败的查找次数为:
看地址0,到第一个关键字为空的地址2的距离为3,因此查找不成功的次数为3.
地址1, 到第一个关键为空的地址2的距离为2,因此查找不成功的次数为2.
地址2, 到第一个关键为空的地址2的距离为1,因此查找不成功的次数为1.
地址3,到第一个关键为空的地址4的距离为2,因此查找不成功的次数为2.
地址4,到第一个关键为空的地址4的距离为1,因此查找不成功的次数为1.
地址5,到第一个关键为空的地址2(注意不是地址9,因为初始只可能在0~6之间,因此循环回去)的距离为5,因此查找不成功的次数为5.
地址6,到第一个关键为空的地址2(注意不是地址9,因为初始只可能在0~6之间,因此循环回去)的距离为4,因此查找不成功的次数为4.
因此查找不成功的次数表如下表所示