Java最常见的面试题(2019—Java基础部分)
适宜人群
需要面试的初/中/高级程序员
JAVA基础
1. JDK、JRE、JVM的关系
- JDK:Java Development Kit 即Java开发工具包,提供了Java开发环境和Java运行环境。
- JRE:Java Runtime Environment 即Java运行环境,为Java程序的运行提供环境。
- JVM:Java Virtual Michine即Java虚拟机,Java程序运行的最小条件。
JVM是Java程序实现跨平台(系统)的核心部分,在不同平台上有不同版本的JVM,例如Linux系统上有Linux版本的JVM,Windows系统上有Windows版本的JVM,正因为有各种版本的JVM支持,Java程序才得以在各种平台上实现。
三者之间的关系为 JDK包含JRE和一些Java系统类库,JRE包含JVM和一些其它的支持Java程序员性的组件。即JDK>JRE>JVM。
2. ==和equals的区别
- ==
==在比较基本类型和引用类型时分别有不同的功能。
在比较基本类型的时候比较值是否相等。
在比较引用类型的时候比较引用是否相等(引用也就是我们平常说的堆指向栈的地址值)。 - equals
其实equals本质上就是“==”,只不过是Java中的一些类如:String、Integer等类重写了equals方法。所在在比较String,Integer类型时比较的是值是否相等。但是比较没有重写equals方法的引用类型时(如我们自己定义的实体类)默认比较的是引用(地址值)是否相等。
3. final 在 Java 中有什么作用?
- final修饰的类叫最终类,该类不能被继承。
- final修饰的方法不能被重写。
- final修饰的变量的值不能被修改。
4. Java 中的 Math. round(-1. 5) 等于多少?
- Math.round(-1.5)等于-1,Math,rotund(2.5)等于3。若方法的参数为正数则是四舍五入,若为负数则是五舍六入。例:Math.round(-2.6)=-3,Math.round(-2.5)=-2。
5. Java中操作字符串都有哪些类?它们的区别是什么?
分别是String、StringBuffer、StringBuilder
- String类声明的是不可变的对象,每次操作时都会生成新的String对象,然后再将指针指向新的引用。
- StringBuffer和StringBuilder
相同点:都可以在原有的对象上进行修改
不同点:StringBuffer线程安全,效率低
StringBuilder线程不安全,效率高
所以在单线程的情况下使用StringBuilder,在多线程的情况下使用StringBuffer。
6. String str = " a " 和 String str = new String(" a ")一样吗?
不一样。内存分配方式不一样。String str = " a " 的方式,JVM会将其分配到常量池中。而String str = new String(" a ")会被分配到堆内存中。
7. 抽象类中可以没有抽象方法吗?
抽象类中可以不存在抽象方法。
8.普通类和抽象类有哪些区别?
抽象类中可以有抽象方法,普通类不能有抽象方法
普通类可以直接实例化,抽象类不可以直接实例化(需要通过抽象类的引用指向它的子类的实例,也就是父类引用指向子类的实例,父类是抽象类,这样在实例化子类之前会先实例化它的父类)。
9.Java中都有哪些容器
Java中容器主要分为两大类Collection 、Map,它们下面还有很多子类
- Collection
- List
- ArrayList
- LinkedList
- vector
- stack
- set
- HashSet
- LinkedHashSet
- TreeSet
- List
- Map
- HashMap
- LinkedHashMap
- HashTable
- ConcurrentHashMap
- TreeMap
- HashMap
10.HashMap和HashTable的区别
存储性: HashMap允许Key和Value存储null,HashTable不可以
安全性: HashTable线程安全,HashMap线程不安全。但是HashTable是Java的保留类(过时不推荐使用的类),若需要多线程开发推荐使用线程安全的ConcurrentHashMap类。
11. Sleep和wait的区别
sleep是Thread类的方法,wait是Object类的方法
sleep不释放锁 , wait释放锁
sleep到时间自动恢复,wait需要notify或notifyall方法唤醒
12.ThreadLocal是什么?有哪些使用场景?
ThreadLocal是为每个使用该变量的线程提供一个独立的副本,让其保存只属于自己线程的信息,多个线程之间互相不影响。例如:用户登录时使用ThreadLocal保存用户的用户,密码信息。每一个用户对应一个线程,多个用户之间的信息不会相互影响。
13. 什么是反射?
反射是指在运行过程中,可以知道任意一个类的属性和方法,可以调用任意一个对象的属性和方法。这种动态获取信息和动态调用的功能是Java的反射机制。