Java基础面试题(二)

目录

1、Map接口的主要实现类有哪些,有什么区别

2、Map结构的理解

3.如何决定使用 HashMap 还是 TreeMap?

4.说一下 HashMap 的实现原理?

5.说一下 HashSet 的实现原理?

6.ArrayList 和 LinkedList 的区别是什么?

7.如何实现数组和 List 之间的转换?

8.ArrayList 和 Vector 的区别是什么?

9.Array 和 ArrayList 有何区别?

10.迭代器 Iterator 是什么?

11.创建线程有哪几种方式?

12.说一下 实现runnable接口 和 继承Thread类 有什么区别?

13.谈一谈对程序、进程、线程的理解

14.线程有哪些状态?

15.sleep() 和 wait() 有什么区别?

16.notify()和 notifyAll()有什么区别?

17.线程的 run()和 start()有什么区别?

18.synchronized与Lock的异同?

19.同步代码中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解。

20.解决线程安全问题有哪几种方法?

21.什么是死锁?

22.怎么防止死锁?

23.说一下 synchronized 底层实现原理?

24.synchronized 和 Lock 有什么区别?

25.什么是反射?

26.什么是 java 序列化?什么情况下需要序列化?

27.获取Class实例的三种方式

28.谈谈你对class的理解。


1、Map接口的主要实现类有哪些,有什么区别

/HashMap:作为Map的主要实现类;线程不安全,效率高;存储null和key和value

/LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历;原因:在原有的hashmap底层结构基础上,添加了一对指针,指向前一个和后一个元素 。对于频繁的遍历操作,此类执行效率高于HashMap。

/TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。底层使用红黑树。实现排序遍历,此时考虑key的自然排序或定制排序

/HashTable:作为古老的实现类;线程安全的,效率低,不能存储null和key和value

/Properties:常用来处理配置文件。key和value都是String类型

2、Map结构的理解

Map中的key:无序的、不可重复的,使用Set存储所有的key--->key所在的类要重写equals()和hashCode()

Map中的Value:无序的、可重复的,使用使用Collection存储所有的value

一个键值对:key-value构成了 一个entry对象。

Map中的entry:无序的、不可重复的,使用set存储所有的entry

3.如何决定使用 HashMap 还是 TreeMap?

如果需要得到一个有序的结果应该使用TreeMap

如果不需要排序最好选用HashMap,性能更优

4.说一下 HashMap 的实现原理?


HashMap基于Hash算法实现,通过put(key,value)存储,get(key)来获取value

当传入key时,HashMap会根据key,调用Hash(Object key)方法,计算出Hash值,根据Hash值将Value保存在Node对象里,Node对象保存在数组里。

当计算出的Hash值相同时,称为Hash冲突,HashMap的做法是用链表和红黑树存储相同Hash值的value

当Hash冲突的个数:小于等于8使用链表,大于8使用红黑树解决链表查询慢的问题。

5.说一下 HashSet 的实现原理?


HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的操作相对比较简单,相关HashSet的操作,基本上都是直接调用底层的HashMap的相关方法来完成,HashSet不允许有重复的值,并且元素是无序的

6.ArrayList 和 LinkedList 的区别是什么?


ArrayList的数据结构是动态数组;LinkedList的数据结构是双向链表。

ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的数据结构,需要依次往后查找

在非首尾的增删操作,LinkedList要比ArrayList的效率要高,因为ArrayList在操作增删时要影响其他元素的下标

总结:需要频繁读取集合中的元素时,推荐使用ArrayList;插入和删除操作较多时,推荐使用LinkedList

7.如何实现数组和 List 之间的转换?


List转数组:String[] list = List.toArray(array);//array为List

数组转List:List list = java.util.Arrays.asList(array);//array为数组

8.ArrayList 和 Vector 的区别是什么?


相同点:都实现了List接口,都是有序集合

区别:Vector是线程安全的,ArrayList不是线程安全的;

当Vector或ArrayList中的元素超过它的初始大小时,Vector会将容量翻倍,而ArrayList只会将容量扩大50%

9.Array 和 ArrayList 有何区别?

Array类型的变量在声明时必须实例化;ArrayList可以只是先声明;

Array大小是固定的,而ArrayList的大小是动态变化的;

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型

10.迭代器 Iterator 是什么?

迭代器是一种设计模式,它是一个对象,可以遍历并选择序列中的对象。

11.创建线程有哪几种方式?


继承Thread类并实现run方法,调用继承类的start方法开启线程;

通过实现Runnable接口,重写run方法,调用线程对象的start方法开启线程;

除此之外,还可以通过实现Callable接口,实现call方法,并用FutureTask类包装Callable对象开启线程。

总结:一共有四种方式创建线程

1、继承Thread类

2、实现Runnnable接口

3、实现Callable接口

4、线程池(相应速度提高了,提高了资源的重用率,便于管理)

12.说一下 实现runnable接口 和 继承Thread类 有什么区别?

开发中:优先选择:Runnable接口的方式

原因:1、实现的方式没有类的单继承的局限性

2、实现的方式更适合来处理多个线程有共享数据的情况

联系: public class Thread implements Runnable

相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中

13.谈一谈对程序、进程、线程的理解

程序:为完成特点的任务用某种语言编写的一组指令集合

进程:正在运行的一个程序

线程:一个程序内部的程序路径

14.线程有哪些状态?

新建、就绪、运行、阻塞、死亡

15.sleep() 和 wait() 有什么区别?

相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态

不同点:

(1)两个方法声明的位置不同:Thread类中声明sleep(),Object类中声·明wait()

(2)调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须在同步代码块或者同步方法中

(3)关于是否释放同步监视器:如果两个方法都还用在同步代码块或同步方法中,sleep()不会释放锁,wait会释放锁

16.notify()和 notifyAll()有什么区别?

notify()方法会唤醒对象等待池中的一个线程,进入锁池;

notifyAll()方法会唤醒等待池中的所有线程,进入锁池

17.线程的 run()和 start()有什么区别?


调用start()方法是用来启动线程的,轮到该线程执行时,会自动调用run方法;

直接运行run方法无法达到启动多线程的目的,相当于调用Thread对象中的run方法

一个线程的start方法只能调用一次,多次调用会抛出异常;而run方法可以多次调用

18.synchronized与Lock的异同?

相同:二者都可以解决线程安全问题

不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器。Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现unlock()

优先使用顺序:Lock->同步代码块->同步方法

19.同步代码中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解。

1、同步方法仍然涉及同步监视器,只是不需要我们显示的声明

2、非静态的同步方法,同步监视器是:this

静态的同步方法,同步监视器是:当前类的本身

共享数据:多个线程共同操作的变量。比如:ticket就是共享数据

同步监视器:俗称“锁”,任何一个类都可以当做锁

20.解决线程安全问题有哪几种方法?

1、同步代码块

格式::

synchronized(同步监视器){

//需要被同步的代码

}

同步方式,(好处)解决了线程的安全问题

(局限性)操作同步代码时,只能有一个线程参与,与其他线程等待。相当于是一个单线程的过程,效率低。

2、同步方法

3、Lock锁

21.什么是死锁?

死锁是指两个或两个以上的进程在竞争资源的过程中造成的不可解堵塞。两个线程都在互相等待。

22.怎么防止死锁?

预防:资源一次性分配;可剥夺资源;资源有序分配;超时放弃

避免:银行家算法;

23.说一下 synchronized 底层实现原理?

同步代码块是通过monitorenter和monitorexit指令获取线程的执行权;

同步方法是通过加ACC_SYNCHRONIZED 标识实现线程的执行权的控制

24.synchronized 和 Lock 有什么区别?


synchronized是关键字,属于jvm层面;Lock是具体类,是api层面的锁;

synchronized无法获取锁的状态,Lock可以判断;

synchronized用于少量同步,Lock用于大量同步。

25.什么是反射?

反射是被视为动态语言,反射可以获取类中的内部信息,并能直接操作任意对象的内部属性及方法。

26.什么是 java 序列化?什么情况下需要序列化?


序列化:将java对象转换成字节流的过程。

反序列化:将字节流转换成java对象的过程。

当java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。

序列化的实现:类实现Serializable接口。

27.获取Class实例的三种方式

Class clazz1 = person.class;

Class clazz2 = person.getClass;

Class clazz3 = Class.forName(person classpath);

28.谈谈你对class的理解。

class实例对应着加载到内存中的一个运行时类。

以上是java基础篇的25道常见面试题,其内容参考博客JAVA面试题大全(200+道题目)-CSDN博客,对其内容根据自己见解修改题目及答案。后期会继续更新剩余java面试题目。关注博主,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪人.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值