概述
Java基础部分
1."=="和equals方法的区别?
答:他们的区别主要存在在引用数据类型上,
(1).==为比较两侧的对象是否同一对象,是用内存地址来比较的
equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关
(2).==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException
除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧
2.“两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这样说对不对?"
答:不对。如果两个对象x和y满足x.equals(y) == true,它们的hash code应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
3.Integer与int的区别
答:(1)int是java内置的8种基本数据类型之一,意思整型,占用4字节。
Integer是java为int提供的封装类,是引用数据类型。从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
(2) int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。(例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer)。
(3)在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。
(4)在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
(5)另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
这个题目的变种通常考察Integer的源码实现及自动装箱/拆箱机制
变种1:给出各==运算符的逻辑结果值
public static void main(String[] args) {
Integer a = new Integer(3);
Integer d = new Integer(3); // 通过new来创建的两个Integer对象
Integer b = 3; // 将3自动装箱成Integer类型int c = 3;
int c = 3; // 基本数据类型3
System.out.println(a == b); // false 两个引用没有引用同一对象
System.out.println(a == d); // false 两个通过new创建的Integer对象也不是同一个引用
System.out.println(c == b); // true a自动拆箱成int类型再和c比较
}
当两边都是Integer对象时,是引用比较;当其中一个是int基本数据类型时,
另一个Integer对象也会自动拆箱变成int类型再进行值比较。
变种2:给出各==运算符的逻辑结果值
public static void main(String[] args) {
Integer f1 = 100;
Integer f2 = 100;
Integer f3 = 150;
Integer f4 = 150;
System.out.println(f1 == f2); // true,当int在[-128,127]内时,结果会缓存起来
System.out.println(f3 == f4); // false,属于两个对象
}
这时很容易认为两个输出要么都是true要么都是false。
首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,
所以下面的==运算比较的不是值而是引用。
装箱的本质是什么呢?当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方valueOf,关键代码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
returnnew Integer(i);
}
IntegerCache是Integer的内部类。
简单的说,如果整型字面量的值在-128到127之间,
那么不会new新的Integer对象,
而是直接引用常量池中的Integer对象,
所以上面的面试题中f1f2的结果是true,而f3f4的结果是false。
4.String、StringBuffer、StringBuilder的区别
答:(1).String是一个字符串常量,被final修饰过的,长度不可变,拼接字符串的时候使用+=,
每一次拼接字符串都会是一个新的内存空间;
(2).Stringbuffer是字符串变量,存在缓存区,长度是可以变得,只需要通过append来进行追加就可以,不需要开辟新的内存空间;有synchronized 所以线程是安全;
(3).Stringbuilder 也是字符串变量,和Stringbuffer差不多,但是没有同步锁。线程不安全;
(4).在项目当中,我们最常用的是string ,因为使用的比较简单,不需要new对象,还提供了许多的方法;虽然stringbuffer的效率比这个要高,但是在数据量小的时候,相差不了多少,只有在大数据量拼接的时候才会使用stringbuffer和stringbuilder;
5.抽象类(abstract class)和接口(interface)有什么异同?
答:相同点
(1):不能直接实例化。如果要实例化,抽象类变量必须实现所有抽象方法,接口变量必须实现所有接口未实现的方法。
(2):都可以有实现方法(Java8以前的接口不能有实现方法)。
(3):都可以不需要实现类或者继承者去实现所有方法(Java8以前的接口,Java8及以后的接口中可以包括默认方法,不需要实现者实现)。
不同点
(1):抽象类和接口所反映出的设计理念不同。抽象类表示的是对象/类的抽象,接口表示的是对行为的抽象。
(2) :抽象类不可以多重继承,接口可以多重继承。即一个类只能继续一个抽象类,却可以继承多个接口。
(3):访问修饰符——
抽象类中的方法可以用public protected和default abstract修饰符,不能用private、static、synchronize、native 修饰;变量可以在子类中重新定义,也可以重新赋值;
接口的方法默认修饰符是public abstract, Java8 开始出现静态方法,多加static关键字;变量默认是public static final 型,且必须给其初值,在实现类中也不能重新定义,也不能改变其值。
(4):抽象类可以有构造器,接口没有构造器。
6.Java中BIO、NIO和AIO的区别和应用场景
答:
1.同步:使用同步IO时,Java自己处理IO读写。
2.异步:使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后OS通知Java处理(回调)。
3.阻塞:使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。
4.非阻塞:使用非阻塞IO时,如果不能立马读写,Java调用会马上返回,当IO事件分发器通知可读写时在进行读写,不断循环直到读写完成。
(1):BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
同步并阻塞,服务器的实现模式是一个连接一个线程,这样的模式很明显的一个缺陷是:由于客户端连接数与服务器线程数成正比关系,可能造成不必要的线程开销,严重的还将导致服务器内存溢出。当然,这种情况可以通过线程池机制改善,但并不能从本质上消除这个弊端。
(2):NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
在JDK1.4以前,Java的IO模型一直是BIO,但从JDK1.4开始,JDK引入的新的IO模型NIO,它是同步非阻塞的。而服务器的实现模式是多个请求一个线程,即请求会注册到多路复用器Selector上,多路复用器轮询到连接有IO请求时才启动一个线程处理。
(3):AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
JDK1.7发布了NIO2.0,这就是真正意义上的异步非阻塞,服务器的实现模式为多个有效请求一个线程,客户端的IO请求都是由OS先完成再通知服务器应用去启动线程处理(回调)。
应用场景:
并发连接数不多时采用BIO,因为它编程和调试都非常简单,但如果涉及到高并发的情况,应选择NIO或AIO,更好的建议是采用成熟的网络通信框架Netty。
最后
以上就是聪慧墨镜为你收集整理的高级程序员Java面试题Java基础部分的全部内容,希望文章能够帮你解决高级程序员Java面试题Java基础部分所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复