JavaSE面试问题汇总①
- int和Integer的区别
- 为什么设计封装类型?
- JDK、JRE、JVM的区别
- ==和equals方法的区别
- hashCode()与equals()之间的关系
- 泛型中extends和super的区别
- String、StringBuffer、StringBuilder的区别
- 重载和重写的区别
- 接口和抽象类的区别
- List与Set的区别
- ArrayList和LinkedList的区别
- ⭐HashMap与HashTable的区别?底层实现是什么?
- ⭐ConcurrentHashMap原理,jdk7和jdk8的区别
- java中的异常体系
- ⭐CopyOnWriteArrayList的底层原理
- ⭐Final的理解
- 线程的生命周期,线程有哪些状态
- 锁池与等待池
- ⭐Sleep()、wait()、join()、yield()的区别
- 对线程安全的理解
- Thread和Runnable的区别
- ⭐对守护线程的理解
- ⭐ThreadLocal的原理和使用场景
- ⭐⭐ThreadLocal内存泄漏原因,如何避免
- 并发、并行、串行
- ⭐并发三大特性
- ⭐为什么用线程池,解释下线程池参数
- ⭐简述线程池的处理流程
- ⭐线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程
- ⭐线程池中线程复用原理
总结了目前主流平台中常见的面试题,标⭐为重点!
int和Integer的区别
- 作为成员变量来说,Integer的初始值为null,int初始值为0
- Integer是对象,存储在堆内存;int类型直接存储在栈空间
- Integer封装了很多方法和属性,使用时更加灵活
为什么设计封装类型?
因为java本身是个面向对象的语言,一切操作都是以对象作为基础,比如集合(ArrayList,HashMap)里存的元素,也只支持存储Object类型,普通类型无法通过集合存储
JDK、JRE、JVM的区别
JDK是java标准开发包,提供编译、运行java程序所需的各种工具和资源,包括java编译器、java运行时环境,以及常用的java类库
JRE是java运行环境,用于运行java的字节码文件,JRE包括JVM和JVM工作时所需的类库,普通用户只需要安装JRE来运行java程序,而程序开发者必须安装JDK来编译调试程序
JVM是java虚拟机,是JRE的一部分,整个java实现跨平台的最核心部分,负责运行字节码文件
- 详细解释如下图:
==和equals方法的区别
==:如果是基本数据类型,比较的是值;引用类型比较的是引用地址
equals:具体看各个类重写equals方法后的比较逻辑,比如String类,虽然是引用类型。但是String类中重写了equals方法,内部比较的是各个字符是否全部相等
hashCode()与equals()之间的关系
首先hashCode的判断:
- 两个对象的hashCode不同,则肯定是不同的两个对象
- hashCode相同,对象不一定相同
- 两个对象相等。hashCode一定相同
所以重写 equals 方法的时候需要重写 hashCode 方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。
泛型中extends和super的区别
<? extends T> 表示包括T在内的任何T的子类
<? super T> 表示包括T在内的任何T的父类
String、StringBuffer、StringBuilder的区别
- String有final修饰,是不可变的,如果修改,会产生一个新的字符串,StringBuffer和StringBuilder是可变的
- StringBuffer线程安全,StringBuilder线程不安全(不同步)。所以单线程环境下StringBuilder效率更高
重载和重写的区别
重载:发生在同一个类中,方法名相同,参数类型、个数、顺序不同,返回值、访问修饰符不做要求。发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于父类,抛出异常范围小于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private子类就不能重写该方法。