【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(三)

【前言】别人都在你看不到的地方暗自努力,在你看获得的地方,他们也和你同样显得不务正业,和你同样会抱怨,而只有你本身相信这些都是真的,最后,也只有你一我的继续不思进取 ……  java

【下载】本人刚学习Java时总结的一些JavaSE常见面试题,偶尔在电脑中翻出,从新整理一下分享给须要的人,主要针对初级程序员想要PDF完整版下载的,评论里留言留下你的邮箱!程序员

41..比较一下Java和JavaSciprt?面试

答:其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言:算法

(1)基于对象和面向对象:Java是一种真正的面向对象的语言,即便是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它能够用来制做与网络无关的,与用户交互做用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,于是它自己提供了很是丰富的内部对象供设计人员使用。数据库

(2)解释和编译:Java的源代码在执行以前,必须通过编译。JavaScript是一种解释性编程语言,其源代码不需通过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提高JavaScript的运行效率)编程

(3)强类型变量和类型弱变量:Java采用强类型变量检查,即全部变量在编译以前必须做声明;JavaScript中变量是弱类型的,甚至在使用变量前能够不做声明,JavaScript的解释器在运行时检查推断其数据类型。数组

(4)代码格式不同。浏览器

42.Error和Exception有什么区别?安全

答:①Error表示系统级的错误和程序没必要处理的异常,是恢复不是不可能但很困难的状况下的一种严重问题;好比内存溢出,不可能期望程序能处理这样的状况;网络

②Exception表示须要捕捉或者须要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示若是程序运行正常,从不会发生的状况。

43.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,何时被执行,在return前仍是后?

答:会执行,在方法返回调用者前执行。

44.throw和throws的区别、及处理方式?

答:(1)throw:用于抛出异常对象,后面跟的是异常对象;throw用在方法体内;

   (2)throws:用于抛出异常类,后面跟的是异常类名,能够跟多个,用逗号隔开。throws用在方法上

   (3)异常处理方式:抛出throws、捕捉try - catch - finally。

   (4)何时定义try,何时定义throws?

        ①功能内部若是出现异常,若是能够处理,就用try;

        ②若是内部处理不了,就必须声明出来,让调用者处理。

45.编译时异常和运行时异常的区别?

答:(1)编译时异常在函数内被抛出,函数必须声明,不然编译失败。

    声明的缘由:是须要调用者对该异常进行处理。必须进行处理,不然没法编译经过;(throws)

   (2)运行时异常若是在函数内被抛出,在函数上不须要声明。

    不声明的缘由:不须要调用者处理,运行时异常发生,已经没法再让程序继续运行,因此,不让调用处理的,直接让程序中止,由调用者对代码进行修正。(throw)

46.List、Set、Map是否继承自Collection接口?

答:List、Set是,Map不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不容许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

47.阐述ArrayList、Vector、LinkedList的存储性能和特性?

答:(1)ArrayList:

①ArrayList底层是经过数组实现的,与LinkedList相比,查询快,增删慢;

②ArrayList的起始容量是10.当数组须要增加时,新的容量按以下公式得到:新容量=(旧容量*3)/2+1,也就是说每一次容量大概会增加50%。

(2)Vector:

①Vector:底层也是经过数组实现的,与ArrayList相比,它是同步的,线程安全的;通常状况下:ArrayList适用于单线程,Vector适用于多线程。

②Vector的容量增加与“增加系数有关”,若指定了“增加系数”,且“增加系数有效(即,大于0)”;那么,每次容量不足时,“新的容量”=“原始容量+增加系数”。若增加系数无效(即,小于/等于0),则“新的容量”=“原始容量x 2”。

(3)LinkedList:

①LinkedList底层是经过链表实现的,与ArrayList相比,查询慢,增删快;

②LinkedList在添加新元素时,先是在双向链表中找到要插入节点的位置index;找到以后,再插入一个新节点。同时,双向链表查找index位置的节点时,有一个加速动做:若index < 双向链表长度的1/2,则从前向后查找;不然,从后向前查找。

48.简述集合架构体系?

 

49.Collection和Collections的区别? 

答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操做,这些方法包括对容器的搜索、排序、线程安全化等等。

50.List、Map、Set三个接口存取元素时,各有什么特色? 

答:(1)List以特定索引来存取元素,能够有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。

   (2)Map保存键值对(key-value pair)映射,映射关系能够是一对一或多对一。

   (3)Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实如今插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。

51.TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素? 

答:(1)TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。

   (2)TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。

   (3)Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,可是要求传入第二个参数,参数是Comparator接口的子类型(须要重写compare方法实现元素的比较),至关于一个临时定义的排序规则,其实就是经过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。

5二、Thread类的wait( )和sleep( )的区别?

答:(1)所在类不一样:wait( )是Object类中的方法;sleep( )是Tread类中的方法;

   (2)slepp( )没有释放同步锁,而wait( )释放了同步锁;

   (3)slepp( )必须制定时间,而wait( )不用;

   (4)slepp( )能够在任何地方使用,而wait( )、notify( )、notifyAll( )只能在同步方法或同步代码块中使用;

   (5)slepp( )必须捕获异常,而wait( )、notify( )、notifyAll( )不用;

53.线程的sleep()方法和yield()方法有什么区别? 

答:① sleep()方法给其余线程运行机会时不考虑线程的优先级,所以会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;

④ sleep()方法比yield()方法(跟操做系统CPU调度相关)具备更好的可移植性。

54.当一个线程进入一个对象的synchronized方法A以后,其它线程是否可进入此对象的synchronized方法B? 

答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。由于非静态方法上的synchronized修饰符要求执行方法时要得到对象的锁,若是已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

55.简述线程的五种状态?

答:(1)新建(new):当一个线程处于新建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。Tread t = new Tread(new Runner());

   (2)就绪(Runable):此时线程处在随时能够运行的状态,在随后的任意时刻,均可能进入运行状态。t.star( );

   (3)运行(Running):处于这个状态的线程占用CPU,执行程序代码。

   (4)阻塞(Blocked):阻塞状态是指线程由于某些缘由放弃CPU,暂时中止运行,直到线程从新进入就绪状态。wait、sleep、同步锁被占用;

   (5)死亡(Dead):当线程退出run()方法时,就进入死亡状态,该线程生命周期结束。可能正常执行完run()方法退出,也多是遇到异常。

56.建立多线程的两种方式期区别?

答:(1)第一种方式:继承Thread类,由子类重写run方法。步骤以下:

 ①定义类继承Thread类;

 ②目的是重写run方法,将要执行的代码都存储到run方法中;

 ③经过建立Thread类的子类对象,建立线程对象;

 ④调用线程的start方法,开启线程,并执行run方法。

   (2)第二种方式:实现Runnable接口。步骤以下:

 ①定义类实现Runnable接口。

 ②覆盖接口中的run方法(用于封装线程要运行的代码)。

 ③经过Thread类建立线程对象;

 ④将实现了Runnable接口的子类对象做为实际参数传递给Thread类中的构造函数。

 ⑤调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。

(3)区别:

 ①继承Thread :

   好处:能够直接使用Tread类中的方法,代码简单;

   弊端:若是该类已有父类,就不能用这种方法了;

 ②实现Runnable接口:

   好处:能够避免单继承的局限性,即便本身的线程类有父类也不要紧;

   弊端:不能直接使用Tread类中的方法,要先获取线程对象,代码复杂。

57.synchronized关键字的用法?

答:synchronized关键字能够将对象或者方法标记为同步,以实现对对象和方法的互斥访问,能够用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized做为方法的修饰符。在第60题的例子中已经展现了synchronized关键字的用法。

58.举例说明同步和异步。

答:若是系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据之后可能被另外一个线程读到,或者正在读的数据可能已经被另外一个线程写过了,那么这些数据就必须进行同步存取(数据库操做中的排他锁就是最好的例子)。当应用程序在对象上调用了一个须要花费很长时间来执行的方法,而且不但愿让程序等待方法的返回时,就应该使用异步编程,在不少状况下采用异步途径每每更有效率。事实上,所谓的同步就是指阻塞式操做,而异步就是非阻塞式操做。

59.启动一个线程是调用run()仍是start()方法?

答:启动一个线程是调用start()方法,使线程所表明的虚拟处理机处于可运行状态,这意味着它能够由JVM调度并执行,这并不意味着线程就会当即运行。run()方法是线程启动后要进行回调(callback)的方法。

60.什么是线程池(thread pool)?

答:在面向对象编程中,建立和销毁对象是很费时间的,由于建立一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每个对象,以便可以在对象销毁后进行垃圾回收。因此提升服务程序效率的一个手段就是尽量减小建立和销毁对象的次数,特别是一些很耗资源的对象建立和销毁,这就是”池化资源”技术产生的缘由。线程池顾名思义就是事先建立若干个可执行的线程放入一个池(容器)中,须要的时候从池中获取线程不用自行建立,使用完毕不须要销毁线程而是放回池中,从而减小建立和销毁线程对象的开销。

相关文章
相关标签/搜索