logo资料库

Java 面试最新150题.docx

第1页 / 共337页
第2页 / 共337页
第3页 / 共337页
第4页 / 共337页
第5页 / 共337页
第6页 / 共337页
第7页 / 共337页
第8页 / 共337页
资料共337页,剩余部分请下载后查看
2013 年年底的时候,我看到了网上流传的一个叫做《Java 面试题大全》的东西, 认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考 答案也是错误的,于是我花了半个月时间对这个所谓的《Java 面试大全》进行了全 面的修订并重新发布在我的 CSDN 博客。在修订的过程中,参照了当时 JDK 最新版 本(Java 7)给出了题目的答案和相关代码,去掉了 EJB 2.x、JSF 等无用内容或过 时内容,补充了数据结构和算法、大型网站技术架构、设计模式、UML、Spring MVC 等内容并对很多知识点进行了深入的剖析,例如 hashCode 方法的设计、垃圾收集、 并发编程、数据库事务等。当时我甚至希望把面试中经常出现的操作系统、数据库、 软件测试等内容也补充进去,但是由于各种原因,最终只整理出了 150 道面试题。 让我欣慰的是,这 150 道题还是帮助到了很多人,而且在我 CSDN 博客上的总访问 量超过了 5 万次,最终还被很多网站和个人以原创的方式转载了。最近一年内,用 百度搜索"Java 面试"我写的这些东西基本上都排在搜索结果的前 5 名,这让我觉得 "亚历山大",因为我写的这些东西一旦不准确就可能误导很多人。2014 年的时候我 又整理了 30 道题,希望把之前遗漏的面试题和知识点补充上去,但是仍然感觉挂 一漏万,而且 Java 8 问世后很多新的东西又需要去总结和整理。为此,我不止一次 的修改了之前的 180 题,修改到自己已经感觉有些疲惫或者厌烦了。2014 年至今, 自己带的学生又有很多走上了 Java 程序员、Java 工程师的工作岗位,他们的面试 经验也还没来得及跟大家分享,冥冥之中似乎有一股力量在刺激我要重新写一篇 《Java 面试题全集》,于是这篇文章就诞生了。请不要责备我把那些出现过的内容 又写了一次,因为每次写东西就算是重复的内容,我也需要对编程语言和相关技术 进行重新思考,不仅字斟句酌更是力求至臻完美,所以请相信我分享的一定是更新 的、更好的、更有益的东西,这些内容也诉说着一个职业程序员和培训师的思想、 精神和情感。 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面:
- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行 为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什 么。 - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为 父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的 软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果 不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中关于桥梁模式的 部分)。 - 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通 过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的 对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对 数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供 最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣 机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的, 因为几个按键就搞定了所有的事情)。 - 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的 说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时 的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么 运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B 系统有多种提 供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须刀是 A 系统,它的 供电系统是 B 系统,B 系统可以使用电池供电或者用交流电,甚至还有可能是太阳 能,A 系统只会通过 B 类对象调用供电的方法,但并不知道供电系统的底层实现是 什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的 多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也 称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事: 1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用 父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的 不同而表现出不同的行为)。
2、访问修饰符 public,private,protected,以及不写(默认)时的区别? 答: 修饰符 当前类 同 包 子 类 其他包 public protected default private √ √ √ √ √ √ √ × √ √ × × √ × × × 类的成员不写访问修饰时默认为 default。默认对于同一个包中的其他类相当于公开 (public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected) 对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java 中,外 部类的修饰符只能是 public 或默认,类的成员(包括内部类)的修饰符可以是以上 四种。 3、String 是最基本的数据类型吗? 答:不是。Java 中的基本数据类型只有 8 个:byte、short、int、long、float、 double、char、boolean;除了基本类型(primitive type),剩下的都是引用类 型(reference type),Java 5 以后引入的枚举类型也算是一种比较特殊的引用类 型。 4、float f=3.4;是否正确? 答:不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下
转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f =(float)3.4; 或者写成 float f =3.4F;。 5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗? 答:对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正 确编译,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 6、Java 有没有 goto? 答:goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。(根据 James Gosling(Java 之父)编写的《The Java Programming Language》一书的附录 中给出了一个 Java 关键字列表,其中有 goto 和 const,但是这两个是目前无法使 用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的 意义,因为熟悉 C 语言的程序员都知道,在系统类库中使用过的有特殊意义的单词 或单词的组合都被视为保留字) 7、int 和 Integer 有什么区别? 答:Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基 本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本 数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer, 从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。 Java 为每个原始类型提供了包装类型: - 原始类型: boolean,char,byte,short,int,long,float,double - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double class AutoUnboxingTest {
public static void main(String[] args) { Integer a = new Integer(3); Integer b = 3; // 将 3 自动装箱成 Integer 类型 int c = 3; System.out.println(a == b); // false 两个引用没有 引用同一对象 System.out.println(a == c); // true a 自动拆箱成 in t 类型再和 c 比较 } }           1 2 3 4 5 6 7 8 9 10 最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示: public class Test03 { public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2); System.out.println(f3 == f4); } }          1 2 3 4 5 6 7 8 9 如果不明就里很容易认为两个输出要么都是 true 要么都是 false。首先需要注意的 是 f1、f2、f3、f4 四个变量都是 Integer 对象引用,所以下面的==运算比较的不 是值而是引用。装箱的本质是什么呢?当我们给一个 Integer 对象赋一个 int 值的 时候,会调用 Integer 类的静态方法 valueOf,如果看看 valueOf 的源代码就知道 发生了什么。 public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.lo return new Integer(i); w)]; }    1 2 3
  4 5 IntegerCache 是 Integer 的内部类,其代码如下所示: /** * Cache to support the object identity semantics of aut oboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax= } option. * During VM initialization, java.lang.Integer.IntegerC ache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property
int h = 127; String integerCacheHighPropValue = ger.IntegerCache.high"); sun.misc.VM.getSavedProperty("java.lang.Inte if (integerCacheHighPropValue != null) { try { e); E -1); int i = parseInt(integerCacheHighPropValu i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALU h = Math.min(i, Integer.MAX_VALUE - (-low) } catch( NumberFormatException nfe) { n int, ignore it. // If the property cannot be parsed into a } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1. 7)
分享到:
收藏