版权声明:本文为博主原创文章,首发简书。未经博主允许不得转载。
https://www.jianshu.com/u/3348b92f77a4
前言
今天给大家带来的是百度2020上半年网友分享以及我个人收录的面试真题大全。并且花了大量时间为大家寻找到了最佳的答案解析。希望可以收到帮助到大家。喜欢的朋友可以点个赞支持一下,谢谢。
Java相关
1、HashMap 有用过吗?您能给我说说他的主要用途吗?
有用过,我在平常工作中经常会用到HashMap 这种数据结构,HashMap 是基于Map 接口实现的一种键-值对<key,value>的存储结构,允许null 值,同时非有序,非同步(即线程不安全)。HashMap 的底层实现是数组+ 链表+ 红黑树(JDK1.8 增加了红黑树部分)。它存储和查找数据时,是根据键key 的hashCode的值计算出具体的存储位置。HashMap 最多只允许一条记录的键key 为null,HashMap 增删改查等常规操作都有不错的执行效率,是ArrayList 和LinkedList等数据结构的一种折中实现。
2、说一说自己对于synchronized 关键字的了解
synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在Java 早期版本中,synchronized 属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的synchronized 效率低的原因。庆幸的是在Java 6 之后Java 官方对从JVM 层面对synchronized 较大优化,所以现在的synchronized 锁效率也优化得很不错了。JDK1.6 对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。
3、synchronized 和volatile 、ReentrantLock 、CAS 的区别。
这个问题被问频率不在HashMap 之下,因为并发编程,真的很重要。能问到这几个点的方式真的是太多了,我们能发挥的空间也同样很大。CAS 的ABA 问题?上面几个东西的特性?使用场景?大概我不用再例举了吧?对了,我多次被问到的一个问题是:synchronized 修饰实例方法和修饰静态方法有啥不一样。
4、String、StringBuffer、StringBuilder 区别
都是字符串类,String 类中使用字符数组保存字符串,因有final 修饰符,String 对象是不可变的,每次对String 操作都会生成新的String 对象,这样效率低,且浪费内存空间。但线程安全。StringBuilder 和StringBuffer 也是使用字符数组保存字符,但这两种对象都是可变的,即对字符串进行append 操作,不会产生新的对象。它们的区别是:StringBuffer 对方法加了同步锁,是线程安全的,StringBuilder 非线程安全。
5、进程和线程的区别
进程:具有一定独立功能的程序,是系统进行资源分配和调度运行的基本单位。
线程:进程的一个实体,是CPU 调度的苯单位,也是进程中执行运算的最小单位,即执行处理机调度的基本单位,如果把进程理解为逻辑上操作系统所完成的任务,线程则表示完成该任务的许多可能的子任务之一。
关系:一个进程可有多个线程,至少一个;一个线程只能属于一个进程。同一进程的所有线
程共享该进程的所有资源。不同进程的线程间要利用消息通信