Java_SE中的经典面试题

        面试造航母,入职打螺丝。面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些程序员了。本猿总结了SE阶段的一些面试题,大家可以一起学习讨论~


1. Collection和Collections有什么区别?

  • java.util.Collection是集合类的一个顶级接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
  • java.util.Collections是一个包装类(工具类/帮助类)。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。

2. 什么是 java序列化?如何实现Java序列化?

  • 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
  • 序列化的实现,将需要被序列化的类实现Serializable 接口,标注该对象是可被序列化的。

3. 什么是同步?什么是异步?

  • 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可保持一致。
  • 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。
  • 我们可以用打电话和发短信来很好的比喻同步与异步操作。

4. ArrayList和LinkedList有什么区别?

  • ArrayList和LinkedList的差别主要来自于Array和LinkedList数据结构的不同。
  • ArrayList是基于动态数组实现的,在随机访问数据上有较好的性能,但是插入和删除数据性能较差。
  • LinkedList是基于双链表实现的,在插入和删除数据时性能较好,随机访问数据时性能较差。而且LikedList中的每个节点中存储的是实际的数据和前后节点的位置,所以需要更多的内存。

5. Java里的线程有哪些状态?

  • 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
  • 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
  • 阻塞(BLOCKED):表示线程阻塞于锁。
  • 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
  • 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
  • 终止(TERMINATED):表示该线程已经执行完毕。

6. 什么是悲观锁?什么是乐观锁?

  • 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)。之所以叫做悲观锁,是因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。
  • 乐观锁( Optimistic Locking ) 是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
  • 相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

7. 什么是线程和进程? 

  • 进程:在操作系统中能够独立运行,并且作为资源分配的基本单位。它表示运行中的程序。系统运行一个程序就是一个进程从创建、运行到消亡的过程。
  • 线程:是一个比进程更小的执行单位,能够完成进程中的一个功能,也被称为轻量级进程。一个进程在其执行的过程中可以产生多个线程。
  • 线程与进程不同的是:同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多。

8. wait()和 Sleep()的区别? 

  • sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
  • wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后,本线程才进入对象锁定池准备获得对象锁进入运行状态。

9. 什么是线程安全问题?如何解决?

线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程就发生了线程安全问题,表现形式为数据的缺失,数据不一致等。

  • 线程安全问题发生的条件:
    • 多线程环境下,即存在包括自己在内存在有多个线程。
    • 多线程环境下存在共享资源,且多线程操作该共享资源。
    • 多个线程必须对该共享资源有非原子性操作。
  • 线程安全问题的解决思路:
    • 尽量不使用共享变量,将不必要的共享变量变成局部变量来使用。
    • 使用synchronized关键字同步代码块,或者使用jdk包中提供的Lock为操作进行加锁。
    • 使用ThreadLocal为每一个线程建立一个变量的副本,各个线程间独立操作,互不影响。

10. Comparable和Comparator接口有何区别?

  • Comparable和Comparator接口被用来对对象集合或者数组进行排序。Comparable接口被用来提供对象的自然排序,我们可以使用它来提供基于单个逻辑的排序。
  • Comparator接口被用来提供不同的排序算法,我们可以选择需要使用的Comparator来对给定的对象集合进行排序。

11. 简述HashTable原理,并说明它和HashMap区别? 

Hashtable原理:Hashtable是基于哈希表的实现。通过使用put(Object key,Object value)方法把两个对象进行关联,需要时用get(Object key)取得与key关联的值对象。还可以查询某个对象的索引值等。这里的get方法查找一个对象时与Vector中的get方法在内部实现时有很大不同,在一个Hashtable中查找一个键对象要比在一个Vector 中快的多。这是因为Hashtable使用了一种哈希表的技术,在Java每个对象缺省都有一个通过 Object的hashCode()方法获得的哈希码,Hashtable就是利用这个哈希实现快速查找键对象的。

二者都实现了Map接口,是将惟一键映射到特定的值上,主要区别在于:

  1)HashMap 没有排序,允许一个null键和多个null值而Hashtable不允许;
  2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和 containsKey,因为contains方法容易让人引起误解;
  3)Hashtable 继承自 Dictionary类,HashMap是Java1.2 引进的 Map 接口的实现;
  4)Hashtable的方法是 Synchronize的,而HashMap不是,在多个线程访问 Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。 Hashtable 和HashMap 采用的hash/rehash算法大致一样,所以性能不会有很大的差异。

... ... 楼主总结的部分面试题,作为借鉴。当然还有好多好多各式各样的题型,大家可以分享在评论区一起学习探讨喔~~~


本文完!

写在结尾:

2022 年 10 月 7 日  一个java菜鸟,发布于北京海淀。

好记性不如烂笔头,持续学习,坚持输出~ 可以点赞、评论、收藏啦。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码云说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值