黑马java面试题Java基础部分可参考汇编.docx
- 文档编号:11369471
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:33
- 大小:33.36KB
黑马java面试题Java基础部分可参考汇编.docx
《黑马java面试题Java基础部分可参考汇编.docx》由会员分享,可在线阅读,更多相关《黑马java面试题Java基础部分可参考汇编.docx(33页珍藏版)》请在冰点文库上搜索。
黑马java面试题Java基础部分可参考汇编
下面的内容是对网上原有的面试题集及答案进行了全面修订之后的内容(原来的题目有很多重复无用的题以及错误的答案),参照了JDK最新版本,删除了重复题目以及EJB2.x等无用内容,补充最新面试题、知识点巩固练习题和经典面试编程题,增加了大型网站技术架构、数据结构、操作系统、计算机网络等内容
Java程序员面试题集(1-50)与代码查错
一、Java基础部分
1、面向对象的特征有哪些方面?
答:
面向对象的特征主要有以下几个方面:
1)抽象:
抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。
抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2)继承:
继承是从已有类得到继承信息创建新类的过程。
提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
3)封装:
通常认为封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单)。
4)多态性:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
多态性分为编译时的多态性和运行时的多态性。
运行时的多态性可以解释为:
当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的。
方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。
2、作用域public,private,protected,以及不写时的区别?
答:
区别如下:
作用域当前类同包子类其他
public√√√√
protected√√√×
default√√××
private√×××
不写时默认为default。
默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。
受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。
3、String是最基本的数据类型吗?
答:
不是。
Java中的基本数据类型只有8个:
byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype)和枚举类型(enumerationtype),剩下的都是引用类型(referencetype)。
4、floatf=3.4;是否正确?
答:
不正确。
3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换floatf=(float)3.4;或者写成floatf=3.4F;。
5、shorts1=1;s1=s1+1;有错吗?
shorts1=1;s1+=1;有错吗?
答:
对于shorts1=1;s1=s1+1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short型。
而shorts1=1;s1+=1;可以正确编译,因为s1+=1;相当于s1=(short)(s1+1);其中有隐含的强制类型转换。
6、Java有没有goto?
答:
goto是Java中的保留字,在目前版本的Java中没有使用。
(根据JamesGosling(Java之父)编写的《TheJavaProgrammingLanguage》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实我个人并不认同这个说法,因为熟悉C语言的程序员都知道,在系统类库中使用过的那些单词才被称为保留字)
7、int和Integer有什么区别?
答:
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的封装类型(wrapperclass),int的封装类就是Integer,从JDK1.5开始引入了自动封箱/解封箱机制,使得二者可以相互转换。
Java为每个原始类型提供了封装类:
原始类型:
boolean,char,byte,short,int,long,float,double
封装类型:
Boolean,Character,Byte,Short,Integer,Long,Float,Double
8、&和&&的区别?
答:
&运算符有两种用法:
(1)按位与;
(2)逻辑与。
&&运算符是短路与运算。
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。
很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:
username!
=null&&!
username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。
注意:
逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
9、解释内存中的栈(stack)、堆(heap)和静态存储区的用法。
答:
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。
栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。
Stringstr=newString(“hello”);
上面的语句中str放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。
最新版本的JDK中使用了一项叫“逃逸分析“的技术,可以将一些局部对象放在栈上以提升对象的操作性能。
10、Math.round(11.5)等于多少?
Math.round(-11.5)等于多少?
答:
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。
四舍五入的原理是在参数上加0.5然后进行下取整。
11、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:
早期的JDK中,switch(expr)中,expr可以是byte、short、char、int。
从1.5版开始,Java中引入了枚举类型(enum),expr也可以是枚举,从1.7版开始,还可以是字符串(String)。
长整型(long)是不可以的。
12、用最有效率的方法计算2乘以8?
答:
2<<3(左移3位相当于乘以2的3次方)。
13、数组有没有length()方法?
String有没有length()方法?
答:
数组没有length()方法,有length的属性。
String有length()方法。
14、在Java中,如何跳出当前的多重嵌套循环?
答:
在最外层循环前加一个标记如A,然后用breakA;可以跳出多重循环。
(Java中支持带标签的break和continue语句,作用有些类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue)
15、构造器(constructor)是否可被重写(override)?
答:
构造器不能被继承,因此不能被重写,但可以被重载。
16、两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?
答:
不对,如果两个对象x和y满足x.equals(y)==true,它们的哈希码(hashcode)应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
17、是否可以继承String类?
答:
String类是final类,不可以被继承。
继承String本身就是一个错误的行为,对String类型的重用最好的重用方式是关联而不是继承。
18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:
是值传递。
Java编程语言只有值传递参数。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。
对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
C++和C#中可以通过传引用来改变传入的参数的值。
19、String和StringBuilder、StringBuffer的区别?
答:
Java平台提供了两种类型的字符串:
String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
而StringBuffer和StringBuilder类表示的字符串对象可以直接进行修改。
StringBuilder是JDK1.5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。
20、重载(Overload)和重写(Override)的区别。
重载的方法能否根据返回类型进行区分?
答:
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
重载对返回类型没有特殊的要求。
21、描述一下JVM加载class文件的原理机制?
答:
JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
补充:
1.由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。
当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。
加载完成后,Class对象还不完整,所以此时的类还不可用。
当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。
最后JVM对类进行初始化,包括:
1如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2如果类中存在初始化语句,就依次执行这些初始化语句。
2.类的加载是由类加载器完成的,类加载器包括:
根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。
从JDK1.2开始,类加载过程采取了父亲委托机制(PDM)。
PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。
类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。
JVM不会向Java程序提供对Bootstrap的引用。
下面是关于几个类加载器的说明:
a)Bootstrap:
一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
b)Extension:
从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
c)System:
又叫应用类加载器,其父类是Extension。
它是应用最广泛的类加载器。
它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。
22、char型变量中能不能存贮一个中文汉字?
为什么?
答:
char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16bit),所以放一个中文是没问题的。
补充:
使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。
所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务。
23、抽象类(abstractclass)和接口(interface)有什么异同?
答:
抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。
一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
24、静态嵌套类(StaticNestedClass)和内部类(InnerClass)的不同?
答:
StaticNestedClass是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。
而通常的内部类需要在外部类实例化后才能实例化。
25、Java中会存在内存泄漏吗,请简单描述。
答:
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收也会发生内存泄露。
一个例子就是Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象。
26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
答:
都不能。
抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。
本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。
synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
27、静态变量和实例变量的区别?
答:
静态变量也称为类变量,属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:
不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,然后在调用静态方法时可能对象并没有被初始化。
29、如何实现对象克隆?
答:
有两种方式:
1.实现Cloneable接口并重写Object类中的clone()方法;
2.实现Serializable接口,通过对象的序列化和反序列化实现克隆。
30、GC是什么?
为什么要有GC?
答:
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
要请求垃圾收集,可以调用下面的方法之一:
System.gc()或Runtime.getRuntime().gc()。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。
垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
回收机制有分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。
补充:
标准的Java进程既有栈又有堆。
栈保存了原始型局部变量,堆保存了要创建的对象。
Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。
这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域:
²伊甸园(Eden):
这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
²幸存者乐园(Survivor):
从伊甸园幸存下来的对象会被挪到这里。
²终身颐养园(Tenured):
这是足够老的幸存对象的归宿。
年轻代收集(Minor-GC)过程是不会触及这个地方的。
当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。
与垃圾回收相关的JVM参数:
²-Xms/-Xmx---堆的初始大小/堆的最大大小
²-Xmn---堆中年轻代的大小
²-XX:
-DisableExplicitGC---让System.gc()不产生任何作用
²-XX:
+PrintGCDetail---打印GC的细节
-XX:
+PrintGCDateStamps---打印GC操作的时间戳
31、Strings=newString(“xyz”);创建了几个字符串对象?
答:
两个对象,一个是静态存储区的"xyx",一个是用new创建在堆上的对象。
32、接口是否可继承(extends)接口?
抽象类是否可实现(implements)接口?
抽象类是否可继承具体类(concreteclass)?
答:
接口可以继承接口。
抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。
33、一个“.java”源文件中是否可以包含多个类(不是内部类)?
有什么限制?
答:
可以,但一个源文件中最多只能有一个公开类而且文件名必须和公开类的类名完全保持一致。
34、AnonymousInnerClass(匿名内部类)是否可以继承其它类?
是否可以实现接口?
答:
可以继承其他类或实现其他接口,在swing编程中常用此方式。
35、内部类可以引用其他包含类的成员吗?
有没有什么限制?
答:
一个内部类对象可以访问创建它的外部类对象的成员包括私有成员。
36、Java中的final关键字有哪些用法?
答:
表示该类不能被继承,是顶级类。
37、指出下面程序的运行结果:
classA{
static{
System.out.print("1");
}
publicA(){
System.out.print("2");
}
}
classBextendsA{
static{
System.out.print("a");
}
publicB(){
System.out.print("b");
}
}
publicclassHello{
publicstaticvoidmain(String[]ars){
Aab=newB();
ab=newB();
}
}
答:
执行结果:
1a2b2b。
创建对象时构造器的调用顺序是:
先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。
38、数据类型之间的转换:
1)如何将字符串转换为基本数据类型?
2)如何将基本数据类型转换为字符串?
答:
1)调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;
2)一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串;另一种方法是调用String类中的valueOf(…)方法返回相应字符串
39、如何实现字符串的反转及替换?
答:
方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 黑马 java 试题 基础 部分 参考 汇编