208道Java面试题含答案解析文档格式.docx

上传人:b****2 文档编号:14223049 上传时间:2022-10-20 格式:DOCX 页数:69 大小:542.92KB
下载 相关 举报
208道Java面试题含答案解析文档格式.docx_第1页
第1页 / 共69页
208道Java面试题含答案解析文档格式.docx_第2页
第2页 / 共69页
208道Java面试题含答案解析文档格式.docx_第3页
第3页 / 共69页
208道Java面试题含答案解析文档格式.docx_第4页
第4页 / 共69页
208道Java面试题含答案解析文档格式.docx_第5页
第5页 / 共69页
点击查看更多>>
下载资源
资源描述

208道Java面试题含答案解析文档格式.docx

《208道Java面试题含答案解析文档格式.docx》由会员分享,可在线阅读,更多相关《208道Java面试题含答案解析文档格式.docx(69页珍藏版)》请在冰豆网上搜索。

208道Java面试题含答案解析文档格式.docx

;

Stringy="

Stringz=newString("

);

System.out.println(x==y);

//true

System.out.println(x==z);

//false

System.out.println(x.equals(y));

System.out.println(x.equals(z));

代码解读:

因为x和y指向的是同一个引用,所以==也是true,而newString()方法则重写开辟了内存空间,所以==结果为false,而equals比较的一直是值,所以结果都为true。

equals解读

equals本质上就是==,只不过String和Integer等重写了equals方法,把它变成了值比较。

看下面的代码就明白了。

首先来看默认情况下equals比较一个有相同值的对象,代码如下:

classCat{

publicCat(Stringname){

this.name=name;

}

privateStringname;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

}}

Catc1=newCat("

王磊"

Catc2=newCat("

System.out.println(c1.equals(c2));

输出结果出乎我们的意料,竟然是false?

这是怎么回事,看了equals源码就知道了,源码如下:

publicbooleanequals(Objectobj){

return(this==obj);

}

原来equals本质上就是==。

那问题来了,两个相同值的String对象,为什么返回的是true?

代码如下:

Strings1=newString("

老王"

Strings2=newString("

System.out.println(s1.equals(s2));

同样的,当我们进入String的equals方法,找到了答案,代码如下:

publicbooleanequals(ObjectanObject){

if(this==anObject){

returntrue;

}

if(anObjectinstanceofString){

StringanotherString=(String)anObject;

intn=value.length;

if(n==anotherString.value.length){

charv1[]=value;

charv2[]=anotherString.value;

inti=0;

while(n--!

=0){

if(v1[i]!

=v2[i])

returnfalse;

i++;

原来是String重写了Object的equals方法,把引用比较改成了值比较。

总结 

==对于基本类型来说是值比较,对于引用类型来说是比较的是引用;

而equals默认情况下是引用比较,只是很多类重新了equals方法,比如String、Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等。

3.两个对象的hashCode()相同,则equals()也一定为true,对吗?

不对,两个对象的hashCode()相同,equals()不一定true。

Stringstr1="

通话"

Stringstr2="

重地"

System.out.println(String.format("

str1:

%d|str2:

%d"

str1.hashCode(),str2.hashCode()));

System.out.println(str1.equals(str2));

执行的结果:

1179395|str2:

1179395

false

很显然“通话”和“重地”的hashCode()相同,然而equals()则为false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

4.final在java中有什么作用?

∙final修饰的类叫最终类,该类不能被继承。

∙final修饰的方法不能被重写。

∙final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

5.java中的Math.round(-1.5)等于多少?

等于-1,因为在数轴上取值时,中间值(0.5)向右取整,所以正0.5是往上取整,负0.5是直接舍弃。

6.String属于基础的数据类型吗?

String不属于基础类型,基础类型有8种:

byte、boolean、char、short、int、float、long、double,而String属于对象。

7.java中操作字符串都有哪些类?

它们之间有什么区别?

操作字符串的类有:

String、StringBuffer、StringBuilder。

String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。

StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。

8.Stringstr="

i"

与Stringstr=newString("

)一样吗?

不一样,因为内存的分配方式不一样。

Stringstr="

的方式,java虚拟机会将其分配到常量池中;

而Stringstr=newString("

)则会被分到堆内存中。

9.如何将字符串反转?

使用StringBuilder或者stringBuffer的reverse()方法。

示例代码:

//StringBufferreverse

StringBufferstringBuffer=newStringBuffer();

stringBuffer.append("

abcdefg"

System.out.println(stringBuffer.reverse());

//gfedcba//StringBuilderreverse

StringBuilderstringBuilder=newStringBuilder();

stringBuilder.append("

System.out.println(stringBuilder.reverse());

//gfedcba

10.String类的常用方法都有那些?

∙indexOf():

返回指定字符的索引。

∙charAt():

返回指定索引处的字符。

∙replace():

字符串替换。

∙trim():

去除字符串两端空白。

∙split():

分割字符串,返回一个分割后的字符串数组。

∙getBytes():

返回字符串的byte类型数组。

∙length():

返回字符串长度。

∙toLowerCase():

将字符串转成小写字母。

∙toUpperCase():

将字符串转成大写字符。

∙substring():

截取字符串。

∙equals():

字符串比较。

11.抽象类必须要有抽象方法吗?

不需要,抽象类不一定非要有抽象方法。

abstractclassCat{

publicstaticvoidsayHi(){

System.out.println("

hi~"

上面代码,抽象类并没有抽象方法但完全可以正常运行。

12.普通类和抽象类有哪些区别?

∙普通类不能包含抽象方法,抽象类可以包含抽象方法。

∙抽象类不能直接实例化,普通类可以直接实例化。

13.抽象类能使用final修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为final该类就不能被继承,这样彼此就会产生矛盾,所以final不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

14.接口和抽象类有什么区别?

实现:

抽象类的子类使用extends来继承;

接口必须使用implements来实现接口。

构造函数:

抽象类可以有构造函数;

接口不能有。

main方法:

抽象类可以有main方法,并且我们能运行它;

接口不能有main方法。

实现数量:

类可以实现很多个接口;

但是只能继承一个抽象类。

访问修饰符:

接口中的方法默认使用public修饰;

抽象类中的方法可以是任意访问修饰符。

15.java中IO流分为几种?

按功能来分:

输入流(input)、输出流(output)。

按类型来分:

字节流和字符流。

字节流和字符流的区别是:

字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据。

16.BIO、NIO、AIO有什么区别?

∙BIO:

BlockIO同步阻塞式IO,就是我们平常使用的传统IO,它的特点是模式简单使用方便,并发处理能力低。

∙NIO:

NewIO同步非阻塞IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。

∙AIO:

AsynchronousIO是NIO的升级,也叫NIO2,实现了异步非堵塞IO,异步IO的操作基于事件和回调机制。

17.Files的常用方

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1