Java面试题(一)

1. 面向对象
跟面向过程进行对比。
面向过程注重过程,即注重每一个步骤和顺序。
面向对象更注重有哪些对象(参与者),这些对象做了什么。
面向过程比较直接高效。面向对象易于扩展、复用和维护。
面向对象的三大特性:封装、继承和多态。
(1)封装
隐藏对象的属性和方法,只对外提供调用方式。外部调用者不需要知道内部的实现细节,只需要关注如何去调用。比如我们调用一个方法,我们不需要知道它实现的细节,只需要知道如何调用就好。
(2)继承
子类继承父类,子类共性的方法或属性可以直接使用父类的(非私有属性和方法),子类只需要扩展个性化的。
(3)多态
多态是指同一个行为,具有多个不同表现形式或形态的能力。
多态的三个条件:继承、重写方法、父类引用指向子类对象。
优点:提高程序的扩展性,比如我们在扩展子类时,我们只需要改变父类引用指向新的子类对象。
缺点:只能访问与父类共有的子类方法,不可以访问问子类特有的方法。
2.JDK、JRE和JVM关系
(1)JRE:Java Runtime Environment它是Java运行时环境,如果你不需要开发只需要运行Java程序,那么你可以安装JRE。它包含了Java虚拟机,也就是JVM。
(2)JDK:它是Java开发运行环境,它包含了JRE和java工具,同时也就包含了JVM。
(3)Java程序可以在任意操作系统上运行。Java程序的运行是依靠JVM运行实现跨平台的。在这里插入图片描述
3、==和equals的区别
==对比的是栈中的值,基本数据类型比较的是变量值,引用数据类型比较的是堆中引用数据类型的地址。
Object中的equals默认采用双等于号进行比较,但通常会被重写。
如String类的equals方法就是比较字符串的值。
例子:

public class StringDemo { 
    public static void main(String args[]) { 
        String str1 = "Hello"; //在堆中的常量池创建
        String str2 = new String("Hello"); //在堆中创建
        String str3 = str2; // 引用传递 
        System.out.println(str1 == str2); // false 
        System.out.println(str1 == str3); // false 
        System.out.println(str2 == str3); // true 
        System.out.println(str1.equals(str2)); // true 
        System.out.println(str1.equals(str3)); // true 
        System.out.println(str2.equals(str3)); // true 
    } 
}

4、HashCode和equals方法的联系
(1)HashCode即哈希码,又称为散列码。哈希码的作用是确定该对象在哈希表中的索引位置。任何类都有含有hashCode()方法,它返回该对象的哈希码。
(2)如果两个对象equals相等,那么这两个对象的HashCode一定也相同。
(3)如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置。
(4)当equals()被重写时,也应该重写hashCode()方法。

5、重载和重写
(1)重载发生在同一个类中,方法名相同,参数类型、个数、顺序不同,与返回值无关。
(2)重写发生在子类继承父类,子类重写父类的方法,方法名和参数名保持一致,返回值可以小于等于父类的范围。
6、final关键字
(1)final修饰类时,该类无法被继承
(2)final修饰方法时,该方法无法被重写,但可以被重载
(3)final修饰基本数据类型时,该变量赋值后就无法被改变
(4)final修饰引用数据类型时,初始化后就不能指向新的对象,但可以改变它的值。
7、String、StringBuffer、StringBuilder的区别
(1)String是由final修饰的,是不可变的,每次操作都会创建新的对象;
(2)StringBuffer和StringBuilder是可变的,它们的操作在原对象上操作。但是StringBuffer和StringBuilder也有很大的区别,StringBuffer是线程安全的,StringBuilder是线程不安全的。
(3)当需要频繁修改字符串时,应该使用StringBuffer和StringBuilder。通常使用StringBuilder,但是应用在多线程且为共享变量时,应该使用StringBuffer。
8、接口和抽象类的区别
(1)接口的方法只能是抽象方法(public abstract),它的成员变量只能是public static final类型的;而抽象类除了抽象方法,还能包含普通方法,也可以包含各种类型的成员变量。
(2)一个类能实现多个接口,但只能继承一个抽象类。
9、List和Set的区别
(1)List是有序、可重复的,可以存在多个null元素。它可以通过迭代器(Iterator)或get下标获取元素。
(2)Set是无序、不可重复的,只能存在一个null元素。它只能通过迭代器(Iterator)获取元素。
10、ArrayList和LinkedList的区别
(1)ArrayList是基于动态数组实现的,属于连续存储,适合下标查询。扩容机制:因为数组的长度是固定的,所以当插入时超出长度时,则需要建立更大的数组,然后将旧的数组复制过来,再添加新的元素。如果不是尾插法的话会涉及到元素的移动,会花费比较大的开销,但如果是尾插法的话,它的性能可能甚至超越LinkedList,所以并不是说ArratList的增删操作就比LinkedList好。
(2)LinkedList是基于双向链表实现的,适合做插入和删除操作,不适合做查询,因为需要逐一遍历。对它进行遍历时,最好使用迭代器,因为如果通过下标进行访问时,每次都要从头开始遍历,大大降低性能。也不要通过indexOf获取元素索引,因为当结果为空时,会遍历整个链表。

参考B站视频:Monkey老师的100道Java面试题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值