搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
Java程序员面试宝典
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787121213137
  • 作      者:
    欧立奇,朱梅,段韬编著
  • 出 版 社 :
    电子工业出版社
  • 出版日期:
    2013
收藏
编辑推荐
  

  《Java程序员面试宝典(第三版)》对于Java笔试面试常会问到的问题进行了很详细的总结,是Java程序员面试必看的经典。

展开
作者简介

  欧立奇,国际商业机器有限公司大中华区高级软件工程师,对程序员笔试、面试、智力测试有着多年深入广泛地研究。除本书外,还著有《程序员面试宝典》,《IT求职宝典》等。

展开
内容介绍

  《Java程序员面试宝典(第三版)》是《Java程序员面试宝典》的第三版。第三版在保留第二版数据结构、字符串处理、Java程序设计等主干内容的基础上,更新了部分程序员面试题目,内容主要取材于2011年至2013年多家大公司的面试题,以反映第二版图书出版后近两年来所发生的变化,目的是帮助求职者在面试过程中更好地处理一些新问题,应对新变化。
  《Java程序员面试宝典(第三版)》最后着力讲述了如何进行英语面试和电话面试,并对求职中签约、毁约的注意事项及群体面试进行了解析。《Java程序员面试宝典(第三版)》的面试题除了有详细的解析外,对相关知识点也有扩展说明。希望这些内容对读者从求职就业到提升计算机专业知识有显著的帮助。

展开
精彩书评

  ★针对性很强,是时下需要的面试教材。读后感觉启发很大,为接下来的面试,打下了基础。 
  ——星空夜谈 

  ★即使你不面试,也可以看看,避免工作中陷入险境,考题很刁钻,建议每天都看一下,不断地提高自己。
  ——Matthew

  ★非常不错,这本书详细讲解了Java面试或笔试的常考问题,能够让读者清晰地了解自己的不足,以更好地补充。特别是对应届毕业生更有帮助。
  ——JimmiWong 

  ★书中列举了知名公司的面试题,还有解答分析,内容涵盖了Java基础,数据库,Java Web,数据结构与设计模式,非常全面。
  ——haibin369 

  ★看了下,内容很不错,特别适合从学校刚毕业,初入职场的年轻IT人士阅读, 本书从就业前的准备工作,到各个公司特色笔试、面试,都讲得非常清楚。
  ——Jphuang 

展开
精彩书摘

  第5章 Java程序设计基本概念
  对于一个求职者或者应届毕业生来说,公司除了对项目经验有所问询之外,最好的考试办法就是检查基本功,包括编程风格,以及对赋值语句、递增语句、类型转换、数据交换等程序设计基本概念的理解。当然,在考试之前最好对自己所掌握的程序概念知识有所了解,尤其是对各种细致的考点要加以重视。本章考题来自真实的笔试资料,希望读者先不要看答案,自我解答后再与答案加以对比,找出自己的不足。
  5.1JVM
  第5章 Java程序设计基本概念
  对于一个求职者或者应毕业生来说,公司除了对项目经验有所问询之外,最好的考试办法就是检查基本功,包括编程风格,以及对赋值语句、递增语句、类型转换、数据交换等程序设计基本概念的理解。当然,在考试之前最好对自己所掌握的程序概念知识有所了解,尤其是对各种细致的考点要加以重视。本章考题来自真实的笔试资料,希望读者先不要看答案,自我解答后再与答案加以对比,找出自己的不足。
  5.1JVM
  面试例题1:下面给出的Java中ClassLoader中的描述,哪些描述是正确的?()
  A.ClassLoader没有层次关系
  B.所有类中的ClassLoader都是AppClassLoader
  C.通过Class.forName(StringclassName),能够动态加载一个类
  D.不同的ClassLoader加载同一个Class文件,所得的类是相同的
  解析:
  A选项错误,ClassLoader具备层次关系。
  B选项错误,ClassLoader不止一种。
  D选项错误,不同的类装载器分别创建的同一个类的字节码数据属于完全不同的对象,没有任何关联。
  答案:C
  扩展知识:ClassLoader知识。
  (1)ClassLoader基本概念
  与C或C++编写的程序不同,Java程序并不是一个可执行文件,而是由许多独立的类文件组成的,每一个文件对应一个Java类。此外,这些类文件并非全部装入内存,而是根据程序需要逐渐载入。ClassLoader是JVM实现的一部分,ClassLoader包括bootstrapclassloader(启动类加载器),ClassLoader在JVM运行的时候加载Java核心的API,以满足Java程序最基本的需求,其中就包括用户定义的ClassLoader,这里所谓的用户定义,是指通过Java程序实现的两个ClassLoader:一个是ExtClassLoader,它的作用是用来加载Java的扩展API,也就是/lib/ext中的类;第二个是AppClassLoader,它是用来加载用户机器上CLASSPATH设置目录中的Class的,通常在没有指定ClassLoader的情况下,程序员自定义的类就由该ClassLoader进行加载。
  (2)ClassLoader加载流程
  当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载Java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。
  下面来看一下ClassLoader中的一段代码:
  protectedsynchronizedClassloadClass(Stringname,booleanresolve)
  throwsClassNotFoundException
  {
  //首先检查该name指定的class是否有被加载
  Classc=findLoadedClass(name);
  if(c==null){
  try{
  if(parent!=null){
  //如果parent不为null,则调用parent的loadClass进行加载
  c=parent.loadClass(name,false);
  }else{
  //parent为null,则调用BootstrapClassLoader进行加载
  c=findBootstrapClass0(name);
  }
  }catch(ClassNotFoundExceptione){
  //如果仍然无法加载成功,则调用自身的findClass进行加载
  c=findClass(name);
  }
  }
  if(resolve){
  resolveClass(c);
  }
  returnc;
  }
  从上面一段代码中可以看出,一个类加载的过程使用了一种父类委托模式。为什么要使用这种父类委托模式呢?
  第1个原因就是这样可以避免重复加载,当父类已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
  第2个原因就是考虑到安全因素,如果不使用这种委托模式,那么可以随时使用自定义的String来动态替代Java核心API中定义的类型,这样会存在非常大的安全隐患,而父类委托的方式就可以避免这种情况,因为String已经在启动时被加载,所以,用户自定义类是无法加载一个自定义的ClassLoader。
  (3)一些重要的方法
  1)loadClass方法。
  ClassLoader.loadClass()是ClassLoader的入口点。该方法的定义如下:
  ClassloadClass(Stringname,booleanresolve);
  name是指JVM需要的类的名称,如Foo或java.lang.Object。resolve参数告诉方法是否需要解析类。在准备执行类之前,应考虑类解析。注意:并不总是需要解析,如果JVM只需要知道该类是否存在或找出该类的超类,那么就不需要解析。
  2)defineClass方法。
  defineClass方法接受由原始字节组成的数组,并把它转换成Class对象。原始数组包含如从文件系统或网络装入的数据。defineClass管理JVM的许多复杂的实现层面——它把字节码分析成运行时数据结构、校验有效性等。因为defineClass方法被标记成final的,所以也不能覆盖它。
  3)findSystemClass方法。
  findSystemClass方法从本地文件系统装入文件。它在本地文件系统中寻找类文件,如果存在,就使用defineClass将原始字节转换成Class对象,以将该文件转换成类。当运行Java应用程序时,这是JVM正常装入类的默认机制。对于定制的ClassLoader,只有在尝试其他方法装入类之后,再使用findSystemClass。这是因为ClassLoader是负责执行装入类的相关步骤,不负责所有类的所有信息。例如,即使ClassLoader从远程的Web站点装入了某些类,仍然需要在本地机器上装入大量的基本Java库。而这些类库不是我们所关心的,所以要JVM以默认方式从本地文件系统装入它们,这就是findSystemClass的用途。
  4)resolveClass方法。
  正如前面所提到的,可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时,可以调用resolveClass,这取决于loadClass的resolve参数的值。
  5)findLoadedClass方法。
  findLoadedClass充当一个缓存:当请求loadClass装入类时,它调用该方法来查看ClassLoader是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。
  6)findClass方法。
  loadClass默认实现调用这个新方法。findClass的用途包含ClassLoader的所有特殊代码,而无须复制其他代码(例如,当专门的方法失败时,调用系统ClassLoader)。
  目的是从本地文件系统使用实现的类装载器装载一个类。为了创建自己的类装载器,应该扩展ClassLoader类,这是一个抽象类。可以创建一个FileClassLoaderextendsClassLoader,然后覆盖ClassLoader中的findClass(Stringname)方法,这个方法通过类的名字得到一个Class对象。
  publicClassfindClass(Stringname)
  {
  byte[]data=loadClassData(name);
  returndefineClass(name,data,0,data.length);
  }
  7)getSystemClassLoader方法。
  如果覆盖findClass或loadClass,getSystemClassLoader能以实际的ClassLoader对象来访问系统ClassLoader(而不是固定地从findSystemClass调用它)。为了将类请求委托给父类ClassLoader,这个新方法允许ClassLoader获取它的父类ClassLoader。当使用特殊方法,定制的ClassLoader不能找到类时,可以使用这种方法。
  父类ClassLoader被定义成创建该ClassLoader所包含代码的对象的ClassLoader。
  8)forName方法。
  Class类中有一个静态方法forName,这个方法和ClassLoader中的loadClass方法的目的一样,都是用来加载class的,但是两者在作用上却有所区别。
  Classclazz=Class.forName(""something"");
  或者
  ClassLoadercl=Thread.currentThread().getContextClassLoader();
  Classclazz=cl.loadClass(""something"");
  Class.forName()调用Class.forName(name,initialize,loader);也就是Class.forName(""something"");等同于Class.forName(""something"",true,CALLCLASS.class.getClassLoader());
  第二个参数“true”是用于设置加载类的时候是否连接该类,true就连接,否则就不连接。关于连接,在此解释一下,在JVM加载类的时候,需要经过三个步骤:装载、连接、初始化。装载就是找到相应的class文件,读入JVM;初始化就是class文件初始化。这里详述一下连接,连接分三步。
  第一步是验证class是否符合规格。
  第二步是准备,就是为类变量分配内存的同时设置默认初始值。
  第三步就是解释,而这步是可选的,根据上面loadClass方法的第二个参数来判定是否需要解释,这里的解释是指根据类中的符号引用查找相应的实体,再把符号引用替换成一个直接引用的过程。
  在JavaAPI文档中,loadClass方法的定义是protected,也就是说,该方法是被保护的,而用户使用的方法是一个参数,一个参数的loadClass方法实际上就是调用了两个参数,第二个参数默认为false。因此,在这里可以看出通过loadClass加载类实际上就是加载的时候并不对该类进行解释,因此不会初始化该类。而Class类的forName方法则相反,使用forName加载的时候就会将Class进行解释和初始化。
  面试例题2:WhichcharactersdoesJVMuse(JVM使用哪种字符表示)?()
  A.ASCIIcharactersB.Unicodecharacters
  C.Cp1252D.UTF-8
  解析:JVM的设计者当初决定JVM中所有字符的表示形式时,是不允许使用各种编码方式的字符并存的。这是因为如果在内存中的Java字符可以以GB2312、UTF-16、BIG5等各种编码形式存在,那么对开发者来说,连进行最基本的字符串打印、连接等操作都会寸步难行。例如,一个GB2312的字符串后面连接一个UTF-8的字符串,那么连接后的最终结果应该是什么编码呢?选哪一个都没有道理。
  Java开发者必须牢记:在Java中字符只以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用它们在字符集中的编号,这是统一的唯一方法)。
  但“在Java中”到底是指在哪里呢?是指在JVM中、在内存中、在你的代码里声明的每一个char、String类型的变量中。例如,你在程序中这样写:
  charhan='永';
  在内存的相应区域,这个字符就表示为0x6c38,可以用下面的代码证明:
  charhan='永';
  System.out.format(""%x"",(short)han);
  输出是:6c38。反过来用Unicode编号来指定一个字符也可以,像这样:
  charhan=0x6c38;
  System.out.println(han);
  输出是:永。
  这其实也是说,只要你正确地读入了“永”字,那么它在内存中的表示形式一定是0x6c38,没有任何其他的值能代表这个字。
  JVM的这种约定使得一个字符分为两部分:JVM内部和OS的文件系统。在JVM内部,统一使用Unicode表示,当这个字符被从JVM内部移到外部(即保存为文件系统中的一个文件的内容时),就进行了编码转换,使用了具体的编码方案。因此可以说,所有的编码转换只发生在边界的地方,JVM和OS的交界处,也就是各种输入/输出流(或者Reader,Writer类)起作用的地方。
  ……

展开
目录
第1部分  求职过程 
古人云:凡事预则立,不预则废。机会都是垂青有准备的人。为了得到一份满意的工作,求职者一定要对整个求职过程有清醒的了解。把能够预见的、必须做的事情早一些做完,这样在大规模招聘开始的时候就可以专心地为面试做准备。求职过程中会发生很多预料不到的事情,当你的计划被这些事情打乱之后,要做的事会越堆越多,一步落后,步步落后。如果能够尽早把能做的事情做完,即便有计划外的事件发生,也不会产生太严重的影响。努力地使事态的发展处在自己能控制的范围之内,这样无论发生任何事都能有应对之策。 

第1章  应聘求职 
每年的9月到次年的1月,都是应届毕业生求职、在职人员跳槽的高峰期。对于即将成为程序员的应届毕业生们,在求职过程中怎样确定目标公司和目标职位?对于已经是程序员的跳槽大军,是按照技术路线发展自己的职业生涯,还是走向管理岗位继续自己的职业道路,或者是改变自己的发展轨迹?在求职过程中要注意哪些细节?这些都是求职者所关心的话题。 
1.1  应聘渠道 
1.2  应聘流程 

第2章  简历书写 
据统计,80%的简历都是不合格的。不少人事管理者抱怨收到的许多简历在格式上很糟糕。简历应该如何做到在格式上简洁明了,重点突出?求职信应该如何有足够的内容推销自己?如何控制长度,言简意赅?相信读了本章你会对简历的撰写有一个新的认识。 
2.1  书写简历注意事项 
2.2  简历模板 

第3章  求职五步曲 
笔试、电话面试和面试是顺利求职的三个过程。三关全过才能顺利签约,只要有一关没能通过,就会被“刷”掉。除此之外,签约本身又何尝不是一个重要的考试?涉及你的未来、人生、行业甚至家庭。当然有签约就有可能会有违约,真希望你们不必走第五步,但是这个世界毕竟不是童话。 
3.1  笔试 
3.2  电话面试 
3.3  面试 
3.4  签约 
3.5  违约 

第4章  职业生涯发展规划 
在一般情况下,我们工作一年之后,对自己的喜好及擅长都有了更加深刻的了解,这时会有较为明确的职业发展规划。 
4.1  缺乏工作经验的应届毕业生 
4.2  更换工作的程序员们 
4.3  快乐地工作 

第2部分  Java程序设计 
本部分主要以Java设计语言为基础,通过大量实际的例子分析各大公司Java面试题目,从技术上分析面试题的内涵。一般公司的面试题都是两套——C++或Java,面试者可以选择。 

第5章  Java程序设计基本概念 
对于一个求职者或者应届毕业生来说,公司除了对项目经验有所问询之外,最好的考试办法就是检查基本功,包括编程风格,以及对赋值语句、递增语句、类型转换、数据交换等程序设计基本概念的理解。当然,在考试之前最好对自己所掌握的程序概念知识有所了解,尤其是对各种细致的考点要加以重视。本章考题来自真实的笔试资料,希望读者先不要看答案,自我解答后再与答案加以对比,找出自己的不足。 
5.1  JVM 
5.2  i++ 
5.3  类型转换 
5.4  程序结构 
5.5  运算符 
5.6  异常 
5.7  反射 

第6章  传递与引用 
Java语言明确说明取消了指针,因为指针往往是在带来方便的同时导致代码不安全的根源,而且还会使程序变得非常复杂和难以理解,滥用指针写成的代码不亚于使用早已“臭名昭著”的GOTO语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上,每一个new语句返回的都是一个指针的引用,只不过在大多数时候Java不用关心如何操作这个“指针”,更不用像在操作C++的指针那样胆战心惊,唯一要多注意的是在给函数传递对象的时候。 
6.1  传值与传引用 
6.2  静态变量与私有变量 
6.3  输入/输出流 
6.4  序列化 

第7章  循环、条件、概率 
递归过程的执行总是一个过程体未执行完,就带着本次执行的结果又进入另一轮过程体的执行……如此反复,不断深入,直到某次过程的执行遇到终止递归调用的条件成立时,则不再深入,而执行本次的过程体余下的部分,然后又返回到上一次调用的过程体中,执行其余下的部分……如此反复,直到回到起始位置上,才最终结束整个递归过程的执行,得到相应的执行结果。递归过程的程序设计的核心就是参照这种执行流程,设计出一种适合“逐步深入,而后又逐步返回”的递归调用模型,以解决实际的面试例题。 
7.1  典型递归问题 
7.2  循环与条件 

第8章  Java内存管理 
内存管理太重要了,花费多少口舌介绍它都不过分。笔者曾经见到这样一句话:“C++程序员觉得内存管理太重要了,所以一定要自己进行管理;Java/C#程序员觉得内存管理太重要了,所以一定不能自己去管理。”从某种意义上说,两者都是对的。面试中内存管理涉及堆、栈、哈希表、内存泄漏等方面。 
8.1  垃圾收集 
8.2  内存管理 
8.3  clone 

第9章  面向对象 
面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看做是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心、以算法为驱动的话,面向对象的编程语言则是以对象为中心,以消息为驱动。用公式表示,过程式编程语言为“程序=算法+数据”;面向对象编程语言为“程序=对象+消息”。 
9.1  面向对象的基本概念 
9.2  类和对象 
9.3  嵌套类 
9.4  集合类 
9.5  构造函数和析构函数 
9.6  复制构造函数和赋值函数 
9.7  多态的概念 

第10章  继承与接口 
接口在实际语言,如Delphi、Java、C++等中,都有广义和狭义之分。 
10.1  基础知识 
10.2  Super 
10.3  this 
10.4  不能继承的情况 
10.5  抽象类与接口 

第3部分  数据结构和设计模式 
本部分主要介绍求职面试过程中出现的第二个重要的板块——数据结构,包括字符串的使用、堆、栈、排序方法等。此外,随着外企研发机构大量迁入我国,外企针对软件工程知识的考核,包括设计模式、UML、敏捷软件开发,以及.NET技术和完全面向对象语言C#的面试题目将会有增无减,今后设计模式在面试中的比重会进一步提高。 

第11章  数据结构基础 
面试时间一般有两个小时,其中至少有20~30分钟左右是用来回答数据结构相关的问题,链表栈、堆、数组的排序和逆置是笔试必考的内容。 
11.1  堆栈 
11.2  链表、哈希表 
11.3  树、图 
11.4  排序基础知识 

第12章  字符串、数组、范型 
求职者在进行笔试时,几乎没有不考字符串、数组和范型的。字符串也是一种相对简单的数据结构,结合指针,容易多次引起面试官反复发问。笔者曾不止一次在笔试或面试时遇到字符串的试题。事实上,字符串也是一个考验程序员编程规范和编程习惯的重要考点。范型是Java SE 1.5的新特型,泛型的本质是参数化类型,也就是说,所操作的数据类型被指定为一个参数。这种参数类型可用在类、接口和方法的创建中,分别称为范型类、泛型接口、泛型方法。Java语言引入范型的好处是安全简单。Java范型编程也是Java程序员面试的热点之一。求职者不能忽视这些细节,因为这些细节会体现你对操作系统、软件工程、边界内存处理等方面知识的掌控能力。 
12.1  字符串基础问题 
12.2  StringBuffer 
12.3  正则表达式 
12.4  数字流和数组 
12.5  字符串其他问题 
12.6  范型与容器 

第13章  设计模式 
地上本没有路,走的人多了,也就成了路。设计模式如同此理,它是经验的传承,并不成体系;它是被前人发现、经过总结形成了一套某一类问题的一般性解决方案,而不是被设计出来的定性规则;它不像算法那样可以照搬照用。 
13.1  UML 
13.2  常见设计模式 
13.3  软件工程 

第4部分  操作系统、数据库、网络 
本部分主要介绍求职面试过程中出现的第三个重要的板块——操作系统、数据库、网络知识。作为一名程序员,尤其是系统管理方面的程序员,对这几部分有深刻的理解和领悟是相当重要的。 

第14章  操作系统 
操作系统面试例题主要涉及进程、线程、内存管理、垃圾回收,以及缓存等方面。 
14.1  基础知识 
14.2  进程 
14.3  线程与串行化 

第15章  数据库和SQL语言 
数据库面试例题主要涉及范式、事物、存储过程、SQL语言及索引等方面。 
15.1  数据库理论问题 
15.2  SQL语言常见问题 

第16章  计算机网络及分布式系统 
网络面试例题主要涉及局域网、广域网和IP管理等方面。 
16.1  网络结构 
16.2  TCP/IP 
16.3  网络其他问题 

第5部分  Java开源 
EJB组件曾经被认为是一个重量级的组件。EJB 3.0规范的重要目标就是简化EJB的开发,提供一个相对轻量级的组件方案。Spring基于轻量内核,然后通过集成第三方的服务器来提供完整的架构。 

第17章  J2EE技术 
从整体上讲,J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术在不断适应和促进企业级应用过程中的产物。目前,Java平台有三个版本:适用于小型设备和智能卡的。 
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证