Java基础面试题
面向对象三大特征
封装:是指把对象的属性进行私有化,同时提供方法供外界调用
继承:是使用已存在的类作为基础建立新的类,新的类继承父类的所有属性和方法,也可以添加新的属性和方法,优点是提高代码重用、提高程序维护性、提高开发效率
多态:在程序运行时才决定引用变量是哪个具体类,实现方式有继承和接口
String类的常用方法
indexOf():返回指定字符的索引
charAt():返回指定索引处的字符
replace():字符串替换
trim():去除字符串两侧的空白
split():分割字符串
getBytes():返回字符串的byte类型数组
length():长度
substring():截取字符串
equals():比较相等
基本数据类型
四类八种,整形(byte、short、int、long)、浮点型(float、double)、字符型(char)、布尔型(boolean)
==和equals的区别
基本数据类型的比较的是值,引用数据类型的比较的是内存地址
equals是方法,基本数据类型没有方法,对于引用类型,若没有重写该方法,比较的就是地址,若重写了,一般就是比较值,常用的String已经重写了
常见的运行时异常
类转换异常、算术异常、下标越界异常、空指针异常、参数非法异常
成员变量与局部变量的区别
属于类/只是变量参数、修饰符不同、有默认值/无
接口和抽象类的区别
抽象类可以有非抽象方法,接口可以有默认实现
接口中不能有除了static和final变量之外的变量,抽象类可以有
一个类可以实现多个接口,但只能实现一个抽象类
接口的方法默认是public,抽象类不限制
接口是行为规范,抽象类是设计模板
final关键字的作用
修饰类,表示类不能被继承
修饰方法,表示方法不能被重写
修饰变量,表示常量
hashcode和equals
这两个方法常用于判断两个对象是否相等,hashcode效率高,hashcode不相等则两对象不相等,相等再判断equals
hashcode默认用的是对象地址,equals用的也是对象地址,对于堆内存中的对象来说,一般比较对象的属性值,而不是地址,所以要重写这两个方法
重载与重写
重载是同一个类中多个同名方法根据不同的传参执行不同的逻辑
重写是子类对父类方法的重写编写
自动装箱与拆箱
自动装箱是指将基本数据类型用对应的包装类包起来,拆箱相反
HashMap
数据结构:数组+链表+红黑树,链表长度超过8时转换为红黑树
工作原理:hash数组和单向链表
两个对象的hashcode相同时:两个对象不一定相等,使用equals比较后,相等则覆盖,不相等则存储到链表
hash的实现:高16位异或低16位
table数组:长度默认16,装载因子默认0.75,达到12就扩容,扩容是翻倍扩容
为什么使用红黑树:红黑树属于平衡二叉树,查找效率较高
HashMap和HashTable的区别
HashTable是线程安全的,HashMap不是
HashMap的效率更高
HashTable不允许null键和null值
HashMap有链表转红黑树的机制
List、Set、Map三者区别
List有序可重复
Set无序不重复
Map存储键值对,键无序不重复
ArrayList和LinkedList区别
ArrayList底层使用对象数组,LinkedList则使用链表
Spring中bean的作用域
单例模式(默认),原型模式,request,session,application
线程死锁
产生死锁的条件:互斥条件、请求与保持条件、不剥夺条件、循环等待条件
sleep()和wait()区别
主要区别是sleep()没有释放锁,而wait()释放了锁
wait需要notify唤醒,sleep执行完自动苏醒
wait常用于线程间通信,sleep常用于暂停执行
使用多线程的问题
内存泄漏、上下文切换、死锁
synchronized关键字
保证被它修饰的方法或代码块在任意时刻只能有一个线程执行
线程、程序、进程的概念与关系
进程是程序的一次执行过程,是系统运行程序、资源分配的基本单位
线程是进程中执行任务的单位,操作系统调度的最小资源单位
程序是包含指令和数据的文件,是静态的
程序加载到内存中由CPU执行产生进程,进程中执行最少有一个主线程
创建线程的两种方式及区别
实现Runnable接口、继承Thread类
Java不支持多继承,继承了Thread类就不能继承其它的类,而实现Runnable接口还能继承其它类,相对较灵活;继承Thread类后开销较大
String对象的intern()
首先从常量池中查找是否存在该常量值的字符串,若不存在则创建,否则直接返回常量池中字符串的引用
不可变对象
指对象一旦被创建,状态就不能改变,任何修改都会创建一个新的对象,如String和包装类
好处是线程安全
访问修饰符
public:任何地方
private:当前类
protected:当前类、当前包、子类
default(默认):当前类、当前包
BIO、NIO、AIO
BIO:同步阻塞式IO,单线程一次只对应一个连接,数据读写阻塞在一个线程内完成,适用于单机低并发
NIO:同步非阻塞式IO,线程在等待IO时可以执行其他连接请求,适用于高并发
AIO:异步非阻塞式IO,进制接收请求后直接返回,处理完后再发送结果
Java8的新特性
lambda表达式、Stream接口、Comparator接口、Filter过滤、Sort排序、Date API
this与super
this执行当前对象本身,super指向父类
break、continue和return
break跳出循环,continue跳出本次循环继续执行下个循环,return结束方法
获取反射的三个方法
- 对象.getClass()
- Class.forName(“包名.类名”)
- 类名.Class
四种引用生存空间
回收 | 用途 | 生存时间 | |
---|---|---|---|
强引用 | 从不 | 对象的一般状态 | JVM停止运行 |
软引用 | 内存不足时 | 对象缓存 | 内存不足时 |
弱引用 | 正常垃圾回收 | 对象缓存 | 垃圾回收 |
虚引用 | 正常垃圾回收 | 跟踪对象的垃圾回收 | 垃圾回收 |
数组与链表
数组在内存中连续存放,查找快,增加删除慢
链表通过元素存储前后元素的地址,增加删除快,查找慢S
String str="i"和String str=new String(“i”)一样吗
不一样,第一个是从常量池中查找引用,没有就在常量池中创建,第二个会在堆内存中开辟新空间
方法参数的传递方式
值传递,基本类型就是其值,引用类型是地址值
BigDecimal
不会像float等出现精度丢失的问题
比较用compareTo,保留用setScale
&和&&
&:按位与、逻辑与
&&:短路与,左边为false时右边就不运算了,直接输出false,|与||同理
static
静态,不创建对象也能使用类的属性或方法
反射概念
Java反射机制是程序运行过程中,对于任意一个类或对象,都能够知道并使用这个类的所有属性和方法
优点:灵活,缺点:有性能瓶颈