我是靠谱客的博主 聪慧墨镜,最近开发中收集的这篇文章主要介绍高级程序员Java面试题Java基础部分,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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基础部分所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部