208道Java面试题含答案解析文档格式.docx
《208道Java面试题含答案解析文档格式.docx》由会员分享,可在线阅读,更多相关《208道Java面试题含答案解析文档格式.docx(69页珍藏版)》请在冰豆网上搜索。
;
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的常用方