《Java就业面试题大全.pdf》由会员分享,可在线阅读,更多相关《Java就业面试题大全.pdf(87页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、说明,为了减轻大家的负担和节省大家的时间,一些过时知识点和被笔试概率极低的题目不再被收录和分析。回答问题的思路:先正面叙述一些基本的核心知识,然后描述一些特殊的东西,最后再来一些锦上添花的东西。要注意有些不是锦上添花,而是画蛇添足的东西,不要随便写上。把答题像写书一样写。我要回答一个新技术的问题大概思路和步骤是:我们想干什么,干这个遇到了什么问题,现在用什么方式来解决。其实我们讲课也是这样一个思路。例如,讲a j a x时,我们希望不改变原来的整个网页,而只是改变网页中的局部内容,例如,用户名校验,级联下拉列表,卜拉树状菜单。用传统方式,就是浏览器自己直接向服务器发请求,服务器返回新页面会盖掉
2、老页面,这样就不流畅了。答题时,先答是什么,再答有什么作用和要注意什么(这部分最重要,展现自己的心得)答案的段落分别,层次分明,条理清楚都非常重要,从这些表面的东西也可以看出一个人的习惯、办事风格、条理等。要讲你做出答案的思路过程,或者说你记住答案的思想都写下来。把答题想着是辩论赛。答题就是给别人讲道理、摆事实。答题不局限于什么格式和形式,就是要将自己的学识展现出来!别因为人家题目木来就模棱两可,你就心里胆怯和没底气了,不敢回答了。你要大胆地指出对方题目很模糊和你的观点,不要把面试官想得有多高,其实他和你就是差不多的,你想想,如果他把你招进去了,你们以后就是同事了,可不是差不多的吗?关于就业薪
3、水,如果你是应届生,那不能要高工资,好比大饼的故事,要拿高工资,就去中关村!少数人基础确实很好,在校期间确实又做过一些项目,那仍然是可以要到相对高的工资的。基础好的冷桂华的故事。初级程序员薪水:2 0 0 0-4 5 0 0中级程序员薪水:4 0 0 0-7 0(X)高级程序员薪水:7 0 0 0以I-.公司招聘程序员更看重的要用到的编码技术、而不是那些业务不太相关的所谓项目经历:1.公司想招什么样的人2.公司面试会问什么,.3.简历怎么写4怎样达到简历上的标准(培训中心教项目的目的)对于一些公司接到了一些项目,想招聘一些初中级的程序员过来帮助写代码,完成这个项目,你更看重的是他的专业技术功底
4、,还是以前做过几个项目的经历呢?我们先排除掉那些编码技术功底好,又正好做过相似项目的情况,实 际I:,这种鱼和熊掌兼得的情况并不常见。其实公司很清楚,只要招聘进来的人技术真的很明白,那他什么项目都可以做出来,公司招人不是让你去重复做你以前的项目,而是做一个新项目,业务方面,你只要进了项目团队,自然就能掌握。所以,大多数招聘单位在招聘那些编码级别的程序员时也没指望能招聘到做过类似项目的人,也不会刻意去找做过类似项目的人,用人单位也不是想把你招进,然后把你以前做过的项目重做遍,所以,用人单位更看重招进来的人对要用到的编码技术的功底到底怎样,技术扎实不扎实,项目则只要跟着开发团队走,自然就没问题。除
5、非是一些非常专业的行业,要招聘特别高级的开发人员和系统分析师,招聘单位才特别注重他的项目经验和行业经验,要去找到行 也高手,公司才关心项目和与你聊项目的细节,这样的人通常都不是通过常规招聘渠道去招聘进来的,而是通过各种手段挖过来的,这情况不再我今天要讨论的范围中。技术学得明白不明白,人家几个问题就把你的深浅问出来了,只要问一些具体的技术点,就很容易看出你是真懂还是假懂,很容看出你的技术深度和实力,所以,技术是来不得半点虚假的,必须扎扎实实。由于项口的种类繁多,涉及到现实生活中的各行各业,什么五花八门的业务都有,例如,酒店房间预定管理,公司车辆调度管理,学校课程教室管理,超市进销存管理,知识内容
6、管理,等等成千上万等等,但是,不管是什么项目,采用的无非都是我们学习的那些目前流行和常用的技术。技术好、经验丰富,则项目做出来的效率高些,程序更稳定和更容易维护些:技术差点,碰碰磕磕最后也能把项目做出来,无非是做的周期长点、返工的次数多点,程序代码写得差些,用的技术笨拙点。如果一个人不是完完全全做过某个项目,他是不太关心该项目的业务的,对其中的一些具体细节更是一窍不知,(如果我招你来做图书管理,你项目经历说你做过汽车调度,那我能问你汽车调度具体怎么回事吗?不会,所以,你很容易蒙混过去的)而一个程序员的整个职业生涯中能实实在在和完完整整做出来的项目没几个,更别说在多个不同行业的项目了,有的程序员
7、更是一辈子都只是在做某一个行业的项目,结果他就成了这个行业的专家(专门干一件事的家伙)。所以,技术面试官通常没正好亲身经历过你简历写的那些项目,他不可能去问你写的那些项目的具体细节,而是只能泛泛地问你这个项目是多少人做的,做了多长时间,开发的过程,你在做项目的过程中有什么心得和收获,用的什么技术等面上的问题,所以,简历上的项目经历可以含有很多水分,很容易作假,技术面试官也无法在项目上甄别你的真伪。简历该怎么写:精通那些技术,有一些什么项目经历教项目是为了巩固和灵活整合运用技术,增强学习的趣味性,熟悉做项目的流程,或得一些专业课程中无法获得的特有项目经验,增强自己面试的信心。讲的项目应该真实可靠
8、才有价值,否则,表面上是项0,实际上还是知识点的整合,对巩固技术点和增强学习的趣味性,但无法获得实际的项目经验。(项目主要是增加你经验的可信度,获得更多面试机会,真正能不能找到工作,找到好工作,主要看你键盘上的功夫了)建议大家尽量开自己的b lo g,坚持每天写技术blog。在简历上写上自己的blog地址,可以多转载一些技术文章。Java就业培训教程就是1.Java基础部分(全文共180道题)基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,i o 的语法,虚拟机方面的语法,其他1、一个”.java”源文件中是否可以包括多个类(不是内部类
9、)?有什么限制?可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。2、&和&的区别。&和&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为tru e,否则,只要有一方为false,则结果为false。&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str!=null&!str.equals()表达式,当 s tr为 null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&改为&,则会抛出 NullPointerExcep
10、tion 异常。If(x=33&+y0)y 会增长,If(x=33&+y0)不会增长&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用OxOf来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0 x31&OxOf的结果为0 x01。备注:这道题先说两者的共同点,再说出&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。3、Java 有没有 goto?java中的保留字,现在没有在java中使用。4、在JAVA中,如何跳出当前的多重嵌套循环?在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然
11、后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,ok:for(int i=0;i10;i+)(for(int j=O;jl 0;j+)(System.out.println(4i=+i+j);if(j=5)break ok;)另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。boolean found=false;for(int i=0;i10&!found;i+)(for(int j=0;j11$1=1;51=$1+1;由于sl+1运算时会自动提升表达式的类型,所以结果是im型,
12、再赋值给short类型s i时,编译器将报告需要强制转换类型的错误。对于$110!1$1=1;$1+=1;由于+=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。7、char型变量中能不能存贮一个中文汉字?为什么?char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。备注:后面一部分回答虽然
13、不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽。8、编程题:用最有效率的方法算出2 乘以8 等於几?2 3,因为将个数左移n位,就相当于乘以了 2的n次方,那么,个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 v boolean 和 shortojava.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类30、String s=Hello”;s=s+world!;这两行代
14、码执行后,原始的String对象中的内容到底变了没有?没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s 原先指向一个String对象,内 容 是 Hello,然后我们对s 进行了+操作,那 么 s 所指向的那个对象是否发生了改变呢?答案是没有。这时,s 不指向原来那个对象了,而指向了另一个String对象,内容为Hello world!,原来那个对象还存在于内存之中,只是s 这个引用变量不再指向它了。通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串
15、的话会引起很大的内存开销。因 为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要 个 String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s 的 String引用变量进行初始化,把它设置为初始值,应当这样做:public class Demo private String s;public Demo s=Initial Value;而非s=new St
16、ringCInitial Value);后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为 String对象不可改变,所以对于内容相同的字符串,只 要-个 String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s 都指向同一个对象。上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多 Java标准类库中的类都是不可变
17、的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能Hl勺问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。31、是否可以继承String类?String类是final类故不可以继承。32、String s=new String(xyz”);创建了几个 String Object?二者之间有什么区别?两个,一个放在常量区,不管写多少遍,都是同一个。New String
18、每写一遍,就创建一个新。33、String 和 StringBuffer 的区别JAVA平台提供了两个类:String和 StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer,典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了 equals方法,newString(ttabc,).equals(new String(“abc”)的结果为 true,而 StringBuf
19、fer 没有实现 equals 方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为 falseo接着要举一个具体的例子来说明,我们要把1 至 IJ 100的所有数字拼起来,组成一个串。StringBuffer sbf=new StringBufferQ;for(int i=0;i100;i+)sbf.append(i);上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了 101个对象。String str=new StringO;for(int i=0;i error和
20、 exception有什么区别?error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。41、Java中的异常处理机制的简单原理和应用。当JAVA程序违反了 JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为-一 个异常。违反语义规则包括2 种情况。一种是JAVA类库内置的语义检查。例如数组下标越 界,会 引 发 IndexOutOfBoundsException;访问n u l l 的 对 象 时 会 引 发NullPointerExcep
21、tiono另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable 的子类。42、给我一个你最常见到的runtime exception。ArithmeticException,ArrayStoreException,BufferOverflowException,BufferUnderflowException,CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcunentModi
22、ficationException,DOMException,EmptyStackException,IllegalArgumentException,IllegalMonitorStateException,11 legal PathStateExcepti on,IllegalStateException,ImagingOpException,IndexOutOfBoundsException,MissingResourceException,NegativeArraySizeException,NoSuchElementException,NullPointerException,Pro
23、fileDataException,ProviderException,RasterFORMatException,SecurityException,SystemException,UndeclaredThrowableException,UnmodifiableSetException,UnsupportedOperationException4 3、JA V A语 言 如 何 进 行 异 常 处 理,关 键 字:throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗?Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,
24、并提供了良好的接口。在 Java中,每个异常都是 个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5 个关键词来实现的:try、catch、throw、throws和 finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)个异常,这时候你可以通过它的类型来捕捉(catch)它,或 最 后(finally)由缺省处理器来处理。用 try来指定一块预防所有“异常”的程序。紧跟在try程序后面,应 包 含 个 catch子句来
25、指定你想要捕捉的 异常 的类型。throw语句用来明确地抛出一个 异常。throws用来标明一个成员函数可能抛出的各种“异常”。Finally为确保一段代码不管发生什么“异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每 当 遇 到 个try语句,”异常”的框架就放到堆栈匕面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的 try语句。44、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop。和 suspend。方法为何不推荐使
26、用?有两种实现方法,分别使用new Thread。和 new Thread(runnable)形式,第一种直接调用thread的 run方法,所以,我们往往使用Thread子类,即 new SubThread。第二种调用 runnable的 run方法。有两种实现方法,分别是继承Thread类与实现Runnable接口用 synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend。方法容易发生死锁。调用suspend。的时候,
27、目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被 挂起 的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspendO,而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notifyO重新启动线程。45、sleep()和 wait()有什么区别?(网上的答案:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持
28、,到时后会自动恢复。调用sleep不会释放对象锁。wait是 Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方 法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。)sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在 sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了 c p u,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让
29、自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了 notify方 法(notify并不释放锁,只是告诉调用过w ait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。对于wait的讲解一定要配合例子代码来说明,才显得自己真明白。package com.huawei.interview;public class
30、MultiThread/*param args*/public static void main(String args)/TODO Auto-generated method stubnew Thread(new Thread1().start();try Thread.sleep(10);catch(InterruptedException e)/TODO Auto-generated catch blocke.printStackTrace();new Thread(new Thread2().start();)private static class Threadl implement
31、s RunnableOverridepublic void run()/TODO Auto-generated method stub/由于这里的Threadl和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在Thread2里面的this和这个Threadl的this不是同一个对象。我们用MultiThread.class这个字节码对象,当前虚拟机里可用这个变量时,指向的都是同一个对象。synchronized(MultiThread.class)System.out.printIn(nenter threadlSystem.out.printIn(th
32、readl is waitingH);try(/释放锁有两种方式,第种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。MultiThread.class.wait();catch(InterruptedException e)/TODO Auto-generated catch blocke,printStackTrace();)System.out.printIn(nthreadl is going on.n);System,out
33、.printin(*threadl is being over!n);)private static class Thread2 implements Runnable(Overridepublic void run()/TODO Auto-generated method stubsynchronized(MultiThread.class)System,out.printin(*enter thread2System.out.printin(nthread2 notify other thread canrelease wait status/由于notify方法并不释放锁,即使threa
34、d2调用下面的sleep方法休息了 10毫秒,但threadl仍然不会执行,因为thread2没有释放锁,所以Threadl无法得不到锁。MultiThread.class.notify();System.out.printIn(nthread2 is sleeping tenmillisecond .”);try Thread.sleep(10);catch(InterruptedException e)/TODO Auto-generated catch blocke.printStackTrace();)System.out.printin(nthread2 is going on.n)
35、;System,out.printIn(nthread2 is being over!*);)4 6、同步和异步有何异同,在什么情况下分别使用他们?举例说明。如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。4 7.下面两个方法同步吗?(自己发明)class Testsynchronized static void sayHello3()syn
36、chronized void getX()4 8、多线程有几种实现方法?同步有几种实现方法?多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait notifywait。:使一个线程处于等待状态,并且释放所持有的对象的lock。sleep。:使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常。notify。:唤醒-个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。All
37、notity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。4 9、启动一个线程是用run()还是start()?.启动一个线程是调用start。方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。50、当一个线程进入一个对象的一 synchronized方法后,其它线程是否可进入此对象的其它方法?分几种情况:1.其他方法前是否加了 synchronized关键字,如果没加,则能。2.如果这个方法内部调用了 w a it,则可以进入其他synchronized方法。3.如果其他个方法
38、都加了 synchronized关键字,并且内部没有调用w a it,则不能。51、线程的基本概念、线程的基本状态以及状态之间的关系一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即 main方法执行的那个线程。如果只是一个c p u,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu 一会执行a 线索,一会执行b 线索,切换时间很快,给人的感觉是a,b 在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为a 传数据,一会为b 传数据,由于切换时
39、间很短暂,所以,大家感觉都在同时上网。状态:就绪,运行,synchronize阻塞,wait和 sleep挂起,结束。wait必须在synchronized内部调用。调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇 到 synchronized语句时,山运行状态转为阻塞,当 synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。52、简述 synchronized 和 java.util.concuirent.locks.Lock 的异 同?主要相同点:Lock能完成sy
40、nchronized所实现的所有功能主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而 Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。举例说明(对下面的题用lock进行了改写):package com.huawei.interview;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class
41、 ThreadTest/*param args*/private int j;private Lock lock=new ReentrantLock();public static void main(String args)/TODO Auto-generated method stubThreadTest tt=new ThreadTest();for(int i=0;i2;i+)(new Thread(tt.new adder().start();new Thread(tt.new subtractor().start();)private class subtractor implem
42、ents RunnableOverridepublic void run()/TODO Auto-generated method stubwhile(true)(/*synchronized(ThreadTest.this)System.out.printIn(H j一 一=+j一 一);/这里抛异常了,锁能释放吗?*/lock.lock();trySystem,out.print In(1 1 j-=n+j-);finally(lock.unlock();)private class adder implements Runnable(Overridepublic void run()/T
43、ODO Auto-generated method stubwhile(true)(/,synchronized(Threadiest.this)System.out.printIn(n j +=n+j +);*/lock.lock();trySystem.out.printIn(n j +=n+j+);finally(lockunlock();)53、设计4 个线程,其中两个线程每次对j 增加1,另外两个线程对j 每次减少1。写出程序。以下程序使用内部类实现线程,对 j 增减的时候没有考虑顺序问题。public class ThreadTest 1(private int j;public
44、static void main(String args)ThreadTest 1 tt=new ThreadTest 1();Inc inc=tt.new Inc();Dec dec=tt.new Dec();for(int i=0;i2;i+)Thread t=new Thread(inc);t.start();t=new Thread(dec);t.start();private synchronized void inc()j+;System.out.println(Thread.currentThread().getName()+,-inc:,+j);)private synchro
45、nized void dec()j-;System.out.println(Thread.currentThread().getName()+-dec:,+j);class Inc implements Runnablepublic void run()for(int i=0;i100;i+)inc();)class Dec implements Runnable public void run()for(int i=0;i 78,def-62,nxyz 65 在 hashSet 中的存储顺序不是 62,65,78,这些问题感谢以前一个叫崔健的学员提出,最后通过查看源代码给他解释清楚,看本次培
46、训学员当中有多少能看懂源码。LinkedHashSet按插入的顺序存储,那被存储对象的hashcode方法还有什么作用呢?学员想想!hashset集合比较两个对象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等。new 两 个 Student插入到HashSet中,看 HashSet的 siz e,实现hashcode和 equals方法后再看size。同一个对象可以在Vector中加入多次。往集合里面加元素,相当于集合里用一根绳子连接到了目标对象。往 HashSet中却加不了多次的。59、说出ArrayList,Vector,LinkedList的存储性能和特性A
47、rrayList和 Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了 synchronized方法(线程安全),通常性能上较ArrayList差,而 LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使 得 LinkedList可以被当作堆栈和队列来使用。60、去掉一个Ve
48、ctor集合中重复的元素Vector newVector=new Vector();For(int i=0;iCollectionHashSet/TreeSetSetPropeties 今 HashTable-MapTreemap/HashMap我记的不是方法名,而是思想,我知道它们都有增删改查的方法,但这些方法的具体名称,我记得不是很清楚,对 于 s e t,大概的方法是add,remove,contains;对 于 m ap,大概的方法就是putjemove,contains等,因为,我只要在eclispe下按点操作符,很自然的这些方法就出来了。我记住的一些思想就是List类会有get(i
49、nt index)这样的方法,因为它可以按顺序取元素,而 set类中没有get(intindex)这样的方法。List和 set都可以迭代出所有元素,迭代时先要得到一个iterator对象,所以,sei和 list类都有一个iterator方法,用于返回那个iterator对象。map可以返回三个集合,一个是返回所有的key的集合,另外一个返回的是所有value的集合,再一个返回的key和 value组合成的EntrySet对象的集合,m叩 也 有 get方法,参数是k e y,返回值是key对应的valueo64、两个对象值相同(x.equals(y)=true),但却可有不同的hash c
50、ode,这句话对不对?对。如果对象要保存在HashSet或 HashM叩 中,它们的equals相等,那么,它们的hashcode值就必须相等。如果不是要保存在HashSet或 HashM ap,则 与 hashcode没有什么关系了,这时候hashcode不等是可以的,例 如 arrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现,通常都会去实现的。65、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?字 节 流,字 符 流。字 节 流 继 承 于 InputStream OutputStream,字 符 流 继 承