java基础面试题

什么是面向对象

拿洗衣机举例,面向对象会拆分出洗衣机和人两个对象,可以复用、扩展、可维护
面向过程会拆分一系列动作,更加高效

面向对象的三大特征

  1. 继承
    继承基类的方法,并作出自己的改变和扩展
  2. 多态
    继承和封装都是为多态服务的,多态是指同一行为不同形式的表现。java的重写和重载是实现多态的两种方式。
    多态三要素:继承,重写,父类指向子类引用
  3. 封装
    将同一类事物的特征和方法包装在一起,对外只暴露接口

JDK JRE JVM

JDK:java开发工具
JRE:java运行环境
JVM:java虚拟机
在这里插入图片描述

==和equals的比较

基本数据类型比较值
引用类型比较对象的地址值

如果类中重写了equals方法,比较内容是否相等。
String、Date、File、包装类都重写了Object类的equals方法。
如果类中没有重写equals方法,比较地址值是否相等(是否指向同一个地址值)

hashcode和equals

如果两个对象相等,则hashcode一定相等,对象的equals方法也返回true
如果hashcode相同,他们不一定相等
因此equals方法被覆盖,则hashcode也一定要被覆盖

final

修饰类:表示类不可以被继承
修饰方法:表示方法不可以被重写,可以重载
修饰变量:表示变量一经赋值,不可以更改

String StringBuffer StringBuilder

String:final修饰,不可变,每次操作都会产生一个新的string对象
StringBuffer:线程安全,synchrinized修饰,多线程使用共享变量时使用
StringBuilder:线程不安全,效率高

重载和重写的区别

重载:发生在同一个类中,方法名相同,参数类型,数量,顺序不同。返回值和访问修饰符可以不同,发生在编译时
重写:发生在父子类中,方法名和参数列表必须相同,返回值范围和抛出异常的范围小于等于父类,方法修饰符大于等于父类

接口和抽象类区别

List和set的区别

List:有序,可以重复,允许多个null,可以通过get()获得指定下标元素
Set:无序,不可以重复,只能有一个null,只能通过迭代器逐一遍历

ArrayList和LinkedList的区别

ArrayList:基于动态数组,适合下标访问。扩容机制:数组长度固定,超出数组长度需要新建数组。将老数组拷贝到新数组。如果不是尾插法,会涉及到插入元素的移动。
LinkedList:基于链表,适合插入和删除,不适合查询。需要逐一遍历。

HashMap和HashTable有什么区别,其底层是什么实现的?

HashMap:没有synchronized修修饰,不安全,允许空值
HashTable:安全,不允许空值
底层实现:数组加链表
JDK8开始链表长度大于8数组长度大于64,链表变成红黑树,元素以内部node节点存在

ConcurrentHashMap原理

java中的异常体系

java所有的异常来自于顶级父类Throwable
下面有两个子类:Error和Exception
Excption分为RunTimeException运行时异常和CheckException检查异常,
CheckException发生在编译过程中。

java类加载器

双亲委派模型

GC如何判断对象是否可以被回收

引用计数法:每个对象都有一个引用计数属性,新增一个引用的时候计数加一,释放一个引用的时候计数减一,当计数为0时,可以回收。
可达性分析法:从GC Roots向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何一条引用链,该对象可以被回收

GC Roots的对象

虚拟机栈中引用的对象
本地方法栈Native引用的对象
方法区常量引用的对象
方法区类静态属性引用的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值