,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。守护线程最典型的应用就是GC(垃圾回收器)9.volatile关键字是否能保证线程安全?()答案:不能解析:volatile关键字用在多线程同步中,可保证读取的可见性,JVM只是保证从主内存加载到线程工作内存的值是最新的读取值,而非cache中。但多个线程对volatile的写操作,无法保证线程安全。例如假如线程1,线程2在进行read,load操作中,发现主内存中count的值都是5,那么都会加载这个最新的值,在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6;线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6;导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。10.下列说法正确的是()ALinkedList继承自ListBAbstractSet继承自SetCHashSet继承自AbstractSetDWeakMap继承自HashMap答案:AC解析:下面是一张下载的Java中的集合类型的继承关系图,一目了然。11.存在使i+1i的数吗()答案:存在解析:如果i为int型,那么当i为int能表示的最大整数时,i+1就溢出变成负数了,此时不就i了吗。扩展:存在使ij||i=j不成立的数吗()答案:存在解析:比如Double.NaN或Float.NaN,感谢@BuilderQiu网友指出。12.0.6332的数据类型是()AfloatBdoubleCFloatDDouble答案:B解析:默认为double型,如果为float型需要加上f显示说明,即0.6332f13.下面哪个流类属于面向字符的输入流()ABufferedWriterBFileInputStreamCObjectInputStreamDInputStreamReader答案:D解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式。面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。面向字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类。总结:以InputStream(输入)/OutputStream(输出)为后缀的是字节流;以Reader(输入)/Writer(输出)为后缀的是字符流。扩展:Java流类图结构,一目了然,解决大部分选择题:14.Java接口的修饰符可以为()AprivateBprotectedCfinalDabstract答案:CD解析:接口很重要,为了说明情况,这里稍微啰嗦点:(1)接口用于描述系统对外提供的所有服务,因此接口中的成员常量和方法都必须是公开(public)类型的,确保外部使用者能访问它们;(2)接口仅仅描述系统能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;(3)接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量,只有静态(static)变量;(4)接口的中的变量是所有实现类共有的,既然共有,肯定是不变的东西,因为变化的东西也不能够算共有。所以变量是不可变(final)类型,也就是常量了。(5)接口中不可以定义变量?如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口A中有一个public访问权限的静态变量a。按照Java的语义,我们可以不通过实现接口的对象来访问变量a,通过A.a=xxx;就可以改变接口中的变量a的值了。正如抽象类中是可以这样做的,那么实现接口A的所有对象也都会自动拥有这一改变后的a的值了,也就是说一个地方改变了a,所有这些对象中a的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则的一种体现。所以:接口的方法默认是publicabstract;接口中不可以定义变量即只能定义常量(加上final修饰就会变成常量)。所以接口的属性默认是publicstaticfinal常量,且必须赋初值。注意:final和abstract不能同时出现。15.不通过构造函数也能创建对象吗()A是B否答案:A解析:Java创建对象的几种方式(重要):(1)用new语句创建对象,这是最常见的创建对象的方法。(2)运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。(3)调用对象的clone()方法。(4)运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。(1)和(2)都会明确的显式的调用构造函数;(3)是在内存上对已有对象的影印,所以不会调用构造函数;(4)是从文件中还原类的对象,也不会调用构造函数。16.ArrayListlist=newArrayList(20);中的list扩充几次()A0B1C2D3答案:A解析:这里有点迷惑人,大家都知道默认ArrayList的长度是10个,所以如果你要往list里添加20个元素肯定要扩充一次(扩充为原来的1.5倍),但是这里显示指明了需要多少空间,所以就一次性为你分配这么多空间,也就是不需要扩充了。17.下面哪些是对称加密算法()ADESBAESCDSADRSA答案:AB解析:常用的对称加密算法有:DES、3DES、RC2、RC4、AES常用的非对称加密算法有:RSA、DSA、ECC使用单向散列函数的加密算法:MD5、SHA18.新建一个流对象,下面哪个选项的代码是错误的?()A)newBufferedWriter(newFileWriter(a.txt));B)newBufferedReader(newFileInputStream(a.dat));C)newGZIPOutputStream(newFileOutputStream(a.zip));D)newObjectInputStream(newFileInputStream(a.dat));答案:B解析:请记得13题的那个图吗?Reader只能用FileReader进行实例化。19.下面程序能正常运行吗()[java]viewplaincopy1.publicclassNULL{2.3.publicstaticvoidhaha(){4.System.out.println(haha);5.}6.publicstaticvoidmain(String[]args){7.((NULL)null).haha();8.}9.10.}答案:能正常运行解析:输出为haha,因为null值可以强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static方法的调用是和类名绑定的,不借助对象进行访问所以能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。这里和C++很类似。20.下面程序的运行结果是什么()[java]viewplaincopy1.classHelloA{2.3.publicHelloA(){4.System.out.println(HelloA);5.}6.7.{System.out.println(I'mAclass);}8.9.static{System.out.println(staticA);}10.11.}12.13.publicclassHelloBextendsHelloA{14.publicHelloB(){15.System.out.println(HelloB);16.}17.18.{System.out.println(I'mBclass);}19.20.static{System.out.println(staticB);}21.22.publicstaticvoidmain(String[]args){23.newHelloB();24.}25.26.}答案:staticAstaticBI'mAclassHelloAI'mBclassHelloB解析:说实话我觉得这题很好,考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main方法;(3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。下面稍微修改下上面的代码,以便更清晰的说明情况:[java]viewplaincopy1.classHelloA{2.3.publicHelloA(){4.System.out.println(HelloA);5.}6.7.{System.out.println(I'mAclass);}8.9.static{System.out.println(staticA);}10.11.}12.13.publicclassHelloBextendsHelloA{14.publicHelloB(){15.System.out.println(HelloB);16.}17.18.{System.out.println(I'mBclass);}19.20.static{System.out.println(staticB);}21.22.publicstaticvoidmain(String[]args){23.24.System.out.println(-------mainstart-------);25.newHelloB();26.newHelloB();27.System.out.println(-------mainend-------);28.}29.}此时输出结果为:staticAstaticB-------mainstart-------I'mAclassHelloAI'mBclassHelloBI'mAclassHelloAI'mBclassHelloB-------mainend-------21.getCustomerInfo()方法如下,try中可以捕获三种类型的异常,如果在该方法运行中产生了一个IOException,将会输出什么结果()[java]viewplaincopy1.publicvoidgetCustomerInfo(){2.3.try{4.5.//dosomethingthatmaycauseanException6.7.}catch(java.io.FileNotFoundExceptionex){8.9.System.out.print(FileNotFoundException!);10.11.}catch(java.io.IOExceptionex){12.13.System.out.print(IOException!);14.15.}catch(java.lang.Exceptionex){16.17.System.out.print(Exception