Java基础面试题

常考的Java基础面试题

1.JDK与JRE的区别?
JRE是Java Runtime Environment的缩写,即Java运行时环境,包含了Java虚拟机,Java基础类库。是使用Java语言编写的程序运行所需要的软件环境,是提供给想运行Java程序的用户使用的。

JDK是Java Development Kit的缩写,即Java开发工具包,是程序员使用Java语言编写Java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译Java源码的编译Javac,以及其他工具。

2.== 和 equals 的区别?
“==”对于基本类型来说是值的比较,对于引用类型来说是内存地址的比较。
“equals” 是Object 类的方法,也是内存地址的比较,只是常用的引用类型如:String 重写了该方法,将其变为内容的比较。
Object 类中 equals 方法的定义
3. final、finalize() 和 finally 的区别?
final 可以修饰类、变量、 方法,修饰类该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。

finalize 是一个方法,属于Object类的一个方法,而Object 类是所有类的父类,Java 中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

finally 一般作用在try-catch 代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会被执行,一般用来存放一些关闭资源的代码。

4. abstract 和 interface 的区别?
默认方法实现: 抽象类可以用默认方法实现;接口不能有默认方法实现。

实现:抽象类的子类使用extends 来继承;接口必须使用 implements 来实现接口。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

5. s = “hello” 和 s = new String(“hello”) 的区别?
内存的分配方式不一样。String str = "hello"的方式,Java 虚拟机会将其分配到常量池中,而String str = new String(“hello”) 则会被分到推内存中。

6. List 和 Set 的区别?
List、Set都是继承自Collection接口;

List特点:元素有放入顺序,元素可重复,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在Set 的位置是该元素的 HashCode 决定的,其位置是固定的。加入 Set 的 Object 必须定义 equals() 方法,另外 List 支持 for 循环,也就是通过下标来遍历,也可以用迭代器,但是 Set 只能用迭代器,因为它无序,无法用下标来取得想要的值。)

Set 和 List 对比:
Set: 检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置的改变。
List: 和数组类似,List 可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置的改变。

7. Collection 和 Collections 的区别?
Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是他的子类,比如List、Set 等。

Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类。

8. HashMap 和 HashTable 的区别?
存储: HashMap 运行 key 和 value 为 null, 而 HashTable 不允许。
线程安全:HashTable 是线程安全的,而HashMap 是非线程安全的。
推荐使用:在HashTable 的类注释可以看到,HashTable 是保留类不建议使用,推荐在单线程环境下使用HashMap 替代, 如果需要使用多线程使用则用 ConcorrentMap 替代。

9. String、 StringBuffer 和 StringBuilder 的区别?
String、StringBuffer 和 StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而StringBuilder 是非线程安全的,但 StringBuilder的性能却高于 StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。

10. Thread 和 Runnable 的区别?
共同点:继承 Thread 和 实现 Runnable 接口都可以实现多线程。
Thread 类的实现源码

联系:Thread 实现了 Runnable 接口。

区别:
继承 Runnable 接口更具有健壮性,可以避免Java 中的单继承的限制,一个类可以继承多个接口。
Runnable 更容易实现资源共享,多个线程同时处理一个资源。

11. 什么是守护线程?有什么用?
什么是守护线程?与守护线程相对应的就是用户线程,守护线程就是守护用户线程,当用户线程全部执行结束之后,守护线程才会跟着结束。也就是守护线程必须伴随着用户线程,如果一个应用内只存在一个守护线程,没有用户线程,守护线程自然会退出。

12. Java 中的 notify 和 nofityAll 有什么区别?
notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。
而 notifyAll() 唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。

13. 什么是死锁?
多个线程相互占用对方的资源的锁,而又相互等待对方释放锁,此时若无外力干预,这些线程则一直处于阻塞的假死状态,形成死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值