面试题目分析

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升,水无限多,如何得到四升的水

解析:

  1. 从5升杯子往3升杯子里倒:将5升水的杯子加满,将3升水杯倒满,然后倒掉,再将5升水杯中的2升倒入3升水杯,然后将5升水杯装满,再将已有2升水的3升水杯装满,那么5升水杯里就只有4升水了
  2. 从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的初始容量进行赋值。

更多关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值