美文网首页
Java SE基础面试题

Java SE基础面试题

作者: 执着的逗比 | 来源:发表于2020-04-01 11:27 被阅读0次
    1、面向对象都有哪些特性以及你对这些特性的理解

    1)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继 承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。

    2)封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象 的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。

    3)多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。

    2、Java的八大基本数据类型?

    1)byte:1个字节,8位
    2)short:2个字节,16位
    3)int:4个字节,32位
    4)long:8个字节,64位
    5)float:4个字节,32位
    6)double:8个字节,64位
    7)boolean:官方文档未明确定义,依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1位,但是实际中会考虑计算机高效存储因素
    8)char:2个字节,16位

    3、== 和equals的区别

    equals 和 == 最大的区别是一个是方法,一个是运算符,结果都返回布尔值。

    1)==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型(String也算引用数据类型),则比较的是对象的地址值是否相等。

    2)equals():用来比较方法两个对象的内容是否相等。
    注意:equals在基本类型中比较不能使用,只能在基本包装类中使用。

    4、两个对象的hashcode()相同,则equals()也一定为true吗?

    首先,答案肯定是不一定。

    1)hashcode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashcode是用来在散列存储结构中确定对象的存储地址的;
    2)如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashcode一定要相同;
    3)如果对象的equals方法被重写,那么对象的hashcode也尽量重写,并且产生hashcode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
    4)两个对象的hashcode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”;

    hashcode是用于查找使用的,而equals是用于比较两个对象的是否相等的。

    5、为什么重写equals()方法,同时也要重写hashcode()方法?

    1)例如内存中有这样的位置
    0 1 2 3 4 5 6 7
    而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一之类的算法。

    2)但如果用hashcode那就会使效率提高很多。
    我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了。

    3)但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。
    那么。重写了equals(),为什么还要重写hashCode()呢?
    想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊。

    简单来说:hashcode就是查找定位的,equals是用于比较两个对象的是否相等的,如果找不到对象的位置,你还如何比较相等。

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

    Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。四舍五入的原理是在参数上加 0.5 然后进行取整。

    7、Java中的 '<<' '>>' '>>>' 是什么?

    '<<'表示左移,不分正负数,低位补0
    '>>' 表示右移,如果该数为正,则高位补0,若为负数,则高位补1
    '>>>' 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。

    简单理解:
    '<<'1 相当于乘以2
    '>>' 1 相当于除以2
    '>>>' 不考虑高位的正负号,正数的 '>>>' 等同于 '>>'。

    8、swtich能否作用在byte、long、String上?

    1)早期JDK,switch(expr),expr 可以是 byte、short、char、int;
    2)JDK 1.5 开始,引入了枚举(enum),expr 也可以是枚举;
    3)JDK 1.7 开始,expr 还可以是字符串(String);
    4)长整型(long)是不可以的。

    9、String属于基础的数据类型吗?

    String不是基本的数据类型,String是引用类型,是final修饰的Java类。

    10、String 、StringBuilder 、StringBuffer 的区别?

    1)可变性
    String类中使用字符数组保存字符串,private final char value[],所以String对象是不可变的,对String对象的操作,都会生成新的String对象,不会改变原对象。StringBuilder和StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[]value,这两种对象都是可变的。

    2)线程安全性
    String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

    3)性能
    每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本省进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StringBuilder相比使用StringBuffer仅能获得一定的性能提升,但却要冒多线程不安全的风险。

    11、String str="i"与 String str=new String("i")一样吗?

    不一样,首先String str="i",Java虚拟机会先在常量池中搜索是否有i,如果存在,直接将str引用到该地址,反之,再创建;而 String str=new String("i") 则会被分到堆内存中,即使内容一样还是会创建新的对象。

    12、final 在 java 中有什么作用?

    1)final 修饰的类,不能够被继承。
    2)final 修饰的方法代表不能重写。
    3)final 修饰的成员变量必须要初始化,赋初值后不能再重新赋值(可以调用对象方法修改属性值)。对基本类型来说是其值不可变;对引用变量来说其引用不可变,即不能再指向其他的对象。

    13、重载和重写的区别

    1)重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

    2)重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private,则子类中就不能重写。

    14、构造器Constructor是否可被override

    我们知道父类的私有属性和构造方法并不能被继承,所以Constructor也就不能被override,但是可以overload,所以你可以看到一个类中有多个构造函数的情况。

    15、抽象类必须要有抽象方法吗?

    不一定,抽象类不一定就要有抽象方法,但是有抽象方法的类一定是抽象类。

    16、抽象类可以使用final修饰吗?

    不能的,final是最终类,是不能被继承的。而抽象类是必须被继承的才有其意义的。

    17、普通类和抽象类有哪些区别?

    1)抽象类声明时必须使用abstract关键字,而普通类可以使用public、default等;
    2)抽象类里的抽象方法不能有方法体,而普通类的方法可以有方法体;
    3)抽象类被继承时,非抽象子类必须实现它的所有方法,否则仍需要定义为抽象类,而普通类不需要;
    4)抽象类可以应用多态,而普通类不可以。

    18、接口和抽象类有什么区别?

    1)接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法
    2)接口中的实例变量默认是final类型的,而抽象类中则不一定
    3)一个类可以实现多个接口,但最多只能实现一个抽象类
    4)一个类实现接口的话要实现接口的所有方法(JDK1.8过后也可以实只实现我们想要的方法,default修饰词修饰的方法可以不实现),而抽象类不一定
    5)接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象
    从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规定。

    未完待续

    相关文章

      网友评论

          本文标题:Java SE基础面试题

          本文链接:https://www.haomeiwen.com/subject/hmrouhtx.html