java笔试题目(2018)

java笔试题目(持续更新)

最近实在不知道写什么内容,靠回忆写下一些点笔试题目,也方便以后回来看。

1.collection 有哪些接口?collection和collections的区别?

  Collection是集合类的上级接口,继承与他有关的接口主要有List和Set
  Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作

2.用最有效率的方法计算出2乘以8

采用位运算最快 2<<3;

3.递归和循环,所有的递归都能用循环的方式实现吗?递归和循环各有什么特点?

理论上所有的递归都可以改造成循环,所有的的递归都能以非递归的方式实现。
递归算法: 
优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕) 

缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。 

循环算法:  

优点:速度快,结构简单。

缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

4.有N个台阶,一次只能上一个台阶或者两个台阶,共有几种方法?

 思路: 
如果只有一级台阶,n=1,很明显只有一种跳法 
如果有两级台阶,n=2,则有两种跳法,一种是跳两下1级,一种是直接跳两级 
那么我们来看看如果有n层台阶,可以怎么跳: 
n层台阶可以是这么够成的 
1.第n层台阶是从第n-1层跳1级上来的 
2.第n层台阶是从第n-2层直接跳2级上来的 
所以可以得到n层的跳法总数是F(n)=F(n-1)+F(n-2) 
    public class Count {
	 static int compute(int stair){
	        if ( stair < 1){
	            return 0;
	        }
	        if (stair == 1){
	            return 1;
	        }
	        if (stair == 2){
	            return 2;
	        }
	        return compute(stair-1) + compute(stair-2);
	    }

	    public static void main(String args[]) {
	    	System.out.println("输入台阶个数:");
	    	Scanner scan =new Scanner(System.in);
	    	int stair = scan.nextInt();
	    	System.out.println("ap");
	        System.out.println("共有" + compute(stair) + "种走法");
	        System.out.println();
	    }
	
}

5.以下代码的输出是什么

public class Test {
public static void main(String[] args) {
	    b b1 =new b();
	}

}
 class  a {
    public a() {
        System.out.println("父构造方法");
    }
     static {
        System.out.println("父类静态代码");
    }
     {
         System.out.println("父类普通");
     }
}
class b extends a{
    public b() {
        System.out.println("子类构造方法");
    }
    {
        System.out.println("子类普通");
    }
    static {
        System.out.println("子类静态代码");
    }
}
父类静态代码
子类静态代码
父类普通
父构造方法
子类普通
子类构造方法

6.synchronized 和 lock 的区别

     synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
     synchronized:
     在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好,不管用没用过5.0多线程包的程序员都能理解。

     ReentrantLock:
     ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。

详细可参考:http://www.cnblogs.com/nsw2018/p/5821738.html

7.char[] 和 String 哪个适合用来存储密码?为什么?

   简单说:String是常量(即创建之后就无法更改),会保存到常量池中,如果有其他进程可以dump这个进程的内存,那么密码就会随着常量池被dump出去从而泄露,而char[]可以写入其他的信息从而改变,即是被dump了也会减少泄露密码的风险。完毕。

8.sleep() 和 wait() 的区别?

共同点 : 
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。 
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出 InterruptedException。 
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。 
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。 

不同点 : 
1.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。 
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 
2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 
4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 

9.-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
链接:https://www.nowcoder.com/questionTerminal/970cdaaa4a114cbf9fef82213a7dabca
来源:牛客网

-Xmx10240m:代表最大堆
-Xms10240m:代表最小堆
-Xmn5120m:代表新生代
-XXSurvivorRatio=3:代表Eden:Survivor = 3 根据Generation-Collection算法(目前大部分JVM采用的算法),一般根据对象的生存周期将堆内存分为若干不同的区域,一般情况将新生代分为Eden ,两块Survivor; 计算Survivor大小, Eden:Survivor = 3,总大小为5120,3x+x+x=5120 x=1024

10.什么是红黑树?

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

11.下面代码输出的结果是?

public class NULL {

public static void print(){
System.out.println(“MTDP”);
}
public static void main(String[] args) {
try{
((NULL)null).print();
}catch(NullPointerException e){
System.out.println("NullPointerException");
}
}
}
MTDP

这题应该有2个考察点:1、静态方法的调用,2、null关键字
如果去掉print()方法的static关键字就会报空指针异常

如果觉得有帮助的话,请点个顶支持一下,谢谢啦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值