1、下面程序的输出结果
public class A {
static {
System.out.println(1);
}
public A(){
System.out.println(2);
}
}
class B extends A{
static {
System.out.println("a");
}
public B(){
System.out.println("b");
}
}
class C{
public static void main(String[] args) {
A a=new B();
a=new B();
}
}
输出结果为:1a2b2b
解析:static代码块是随着类的加载而加载的,因此先输出1,new B时输出a。B类继承A类,B类的构造方法中默认存在super(),因此会先输出2,再输出b。因为static代码块只被加载一次,因此后一个new B()会直接执行构造方法,先执行父类的构造方法,输出2,再是B类的构造方法,输出b,因而答案为1a2b2b
2、有8个球,形状不一,其中7个球重量相同,1个较重,问用几次天平秤可以找出重的
答案:2次
解析:先拿出六个,天平秤每边三个,若平衡,则比较剩下的两个;若不平衡,将重的那边拿出两个进行比较,若平衡,剩下的那个就是较重的
3、有两个杯子,一个5升,一个3升,水无限多,如何得到四升的水
解析:
- 从5升杯子往3升杯子里倒:将5升水的杯子加满,将3升水杯倒满,然后倒掉,再将5升水杯中的2升倒入3升水杯,然后将5升水杯装满,再将已有2升水的3升水杯装满,那么5升水杯里就只有4升水了
- 从3升杯子往5升杯子里倒:将3升水杯装满,倒入5升水杯中,再将3升水杯装满,再往5升水杯里倒两升,然后将5升水杯里的水倒掉,将3升水杯里剩下的1升水倒入5升水杯,再将3升水杯装满,倒入5升水杯,那么5升水杯里就有4升水
4、final与abstract能同时使用吗?
答案:不能
解析:abstract修饰的抽象类是由子类继承后去实现的,而final修饰的类是不能被继承的,当final与abstract同时使用时,那么抽象类就没有存在的必要了
5、static与abstract能同时使用吗?
答案:不能
解析:static是随着类的加载而加载的,可以直接被类调用,而由abstract修饰的方法是没有方法体的方法,是不能被类直接调用的,因此它俩是不能同时存在的
6、hashmap是怎么通过链表与数组实现的
解析:hashmap默认初始长度capacity 为16,加载因子loadFactor为0.75,hashmap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,它还具有next指针,可以连接下一个Entry实体。首先hashmap通过key的hash值来计算(key.hashCode()%Array[].length)Entry在hashmap中存储的位置,若hash值相同,而key不同,就通过链表来解决这种hash冲突,首先检查这个位置上有没有元素,如果已经有了元素,那么就把这个新插入的Entry的next指向本来这个位置上的元素的地址,然后再插入这个位置;若key相同,新的value就覆盖掉原有的value。
实例:
依次加入如下三个元素:(Aa与BBhashcode值相同)它们在数组中存储的位置都是4
最后的结果是Entry数组中元素为
具体的过程如下:
第一次放入Aa=1111,在Entry数组下标下标为4的地方放入,之后在放入BB=2222时,由于Aa与BB的hashcode相同,得到Entry数组下标也为4,就会在该位置插入BB=2222,并将BB=2222的next指向Aa=1111,最后再放入Aa=2222,又是数组下标为4,取该位置的Entry链表,取next,发现为Aa=1111,于是将Aa=1111更新为2222
解析:当数组的长度达到阙值时即++size > loadFactor * capacity 时,会进行扩容,扩容成2倍,之后会将元素重新进行与运算放到新的数组中,扩容操作会影响到性能,想提高性能,就需要在最开始考虑我们存储的元素大概有多少,然后对hashmap的初始容量进行赋值。
7、下面两种情况下,k输出的值是多少
int k=0;
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
k++;
if(i%2==0){
1. break;
2. continue;
}
}
}
答案: 1. 55
2. 100
解析: 1. break 终止当前循环,也就是终止了j循环
2. continue 跳出当前循环,继续下一循环
8、下面两种情况,k为多少,哪种方法性能更好
int k=0,i=10000,j=100;
1. for(int i=10000;i>0;i--){
for (int j = 100; j > 0; j--) {
k++;
}
}
2. for(int i=100;i>0;i--){
for (int j = 10000; j > 0; j--) {
k++;
}
}
答案:k=1000000