目录
1、Error和Exception的区别
异常的分类:
- 错误Error
- 异常Exception:
编译时(检查)异常:无法提前预见的异常(文件不存在等)
运行时异常:递归调用、空指针、数组下标越界等编译时不能发现的异常
相同点:
Java中异常被当作对象处理,Error和Exception的父类都是Throwable类
区别:
(1)Error:一般是指与虚拟机相关的问题,如系统崩溃、内存空间不足、栈溢出等,这类错误会导致应用程序中断,仅靠程序本身无法预防和恢复
(2)Exception:指程序可以处理的异常,可以捕获(try-catch\throws)并抛出(throw new),可能恢复的异常
2、重载和重写的区别
重载
功能类似,可以使用相同的名字定义不同的方法,如加法(整数相加、浮点数相加)
(1)同一个类中,方法名相同,形参列表不同(参数类型、参数个数、参数顺序)
(2)static方法可以重载
(3)早绑定,编译期间可以确定调用地址
(4)构造器只能重载不能重写
(5)final方法可以被重载和继承
重写
(1)子类重写父类的方法(不在同一个类):子类根据自身需求,定义自己的行为
(2)需要使用@Override注解,重写的方法名和形参列表相同
(3)权限(修饰符)大于等于父类,private除外(不能重写)
(4)异常小于等于父类
(5)返回值类型优先级小于等于父类(void-void,A-A或A子类,基本数据类型-基本数据类型)
(6)static方法不能重写,因为static是随类加载,不能被覆盖
(7)final方法不能被重写
3、类和接口的区别
(1)类extends单继承,关键字是;接口implements是多实现,多继承
(2)类可以实例化(抽象类不行),接口不能直接实例化
(3)类中方法的修饰符没有限制,接口中有限制:
- 接口中属性是public static final;
- 接口中方法是abstract时,无方法体
- 接口中方法是default、static时,有方法体
4、抽象类和接口的区别
(1)抽象类是根源的抽象,如人可以分为男人和女人;接口是动作的抽象,叫声可以有猫叫和狗叫
(2)抽象类是单继承,接口是多实现(因为可以有多个动作)
(3)抽象类不能被实例化(需要子类继承此抽象类完成相关操作),但抽象类有构造器,便于子类实例化调用
5、abstract关键字
(1)修饰类(不能修饰final类,final类不能被继承)和方法(抽象方法只有方法声明,没有方法体)
(2)不能修饰构造方法和属性(构造器只能重载不能重写)
(3)不能修饰private、static、final方法,因为如果修饰了,private、static、final 方法不能被重写
(4)抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
(5)子类继承父类后,如果子类重写了父类(包括直接 / 间接父类)的所有抽象方法,子类才可以实例化
(6)子类继承父类后,如果子类没有重写父类的所有抽象方法,则子类也属于抽象类,需要用abstract声明,不能被实例化
6、final关键字
final的意义是最终的,不可改变的
(1)修饰变量:就作为常量,值不可变
(2)修饰对象,值可以变,引用不变
(3)修饰方法:不可被重写
(4)修饰类:不可被继承
7、如何调用接口的方法
(1)static静态方法:InterfaceA.method()
(2)default默认方法:InterfaceA.super().method()
(3)接口的实现类如果已经重写了接口的default方法,就调用重写后的方法
(4)类优先原则:类同时继承了类和实现接口时,且父类和接口声明了同名同参数的方法,子类在没有重写该方法时,默认调用类的方法
(5)实现类实现了多个接口,且多个接口均定义了同名同参数的方法,子类没有重写这些方法时,调用时会报错
8、==和equals的区别
==运算符: 如果是基本数据类型,则比较存储的值是否相等;如果是引用数据类型,则比较的是引用指向对象的地址是否相等(是否是同一个对象)
equals是Object的方法:不能用于比较基本数据类型,没有重写时比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
- 比较的类没有重写equals,比较的是引用的类型变量指向的地址
- 比较的类重写了equals(如String类重写了equals),则比较的是对象的内容
9、equals和hashcode的区别
equals:Object类的方法,默认情况下比较的是对象的地址,重写后比较的是对象的内容
hashcode:Object的方法,返回一个哈希值,同一个对象的hash值一定相等,不同对象的hash值可能相等
因此两个对象比较时,如果equals相等,hashcode一定相等;equals不同,hashcode可能不同;hashcode相等,equals不一定相等。
10、int和Integer的区别
(1)int是基本数据类型,Integer是int的包装类
(2)int不需要实例化,Integer使用需要new Integer进行实例
(3)int直接存储数据,Integer是对象引用
(4)int默认是0,Integer是null
(5)Integer在-128~127之间比较用==,超出范围使用equals
11、数组和链表的区别
数组:由栈分配,存储区间连续,查询简单,增删困难,空间大小固定,不能动态扩容
链表:在堆中分配,物理空间不连续,查找效率低,增删快,空间大小可以动态扩展,内存利用率高
12、Hashcode如何计算索引key的位置
设数组长度是length=2^n
(1)取模,hash%(2^n-1)。
缺点:hash值为负数时,计算有误,且与位运算相比,%慢
(2)位运算,用hash&(length-1);
2^n-1:二进制全为1
13、进程和线程的区别
进程:
1、是操作系统进行调度的基本单位,资源分配的最小单元。一个程序的运行就是一个进程。
线程:
1、指的是处理器进行资源调度的基本单位,也是程序执行的最小单位,一个进程包括一个或多个线程。
java默认有两个线程:main和GC
14、并发和并行的区别
并发编程是为了充分利用CPU资源
并发:同一时刻多个线程访问同一个资源(多线程资源共享),比如抢票和秒杀
并行:多个线程一起执行,互不影响。比如泡方便面,可以在烧水的同时,将调料放入碗中
15、用户线程和守护线程
用户线程:自定义线程
守护线程:后台中的特殊线程,比如垃圾回收,守护线程的唯一目的是服务用户线程
使用Thread.currentThread().isDaemon()可以判断线程是否是守护线程