
面试题
文章平均质量分 78
格子衫111
梦想不能只是梦和想...
展开
-
搞懂JVM类加载过程,其实很简单
类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。其中验证、准备、解析3个部分统称为连接(Linking原创 2022-09-22 22:17:07 · 838 阅读 · 0 评论 -
一篇文章搞懂多线程
前言 多线程几乎是面试的必考点,重要性不言而喻。但是工作中如果没经常使用,其相关知识就会很快忘记。下面我对多线程的知识点梳理一下,以便下次需要的时候可以随时查阅。为方便理解,我尽量使用通俗易懂的语言表述。 一、基本概念 1、程序 数据结构 + 算法,主要指存放在硬盘上的可执行文件。换言之,就是编写的代码。 2、进程 主要指运行在内存中的可执行文件。 换言之,就是正在运行的程序,如下图所示,电脑中会有很多单独运行的程序,这些就是进程 3、线程 线程就是进程内部的程序流...原创 2020-10-06 22:38:51 · 974 阅读 · 2 评论 -
面试官:手写一个冒泡排序,并对其改进
核心思想(升序): 从首位置开始,依次比较前后两个数,如果前面的数比后面的数大,就交换两个数。这样第1轮结束后,最大的数就会移动到最后的位置。对剩余元素重复执行N-1次,整个数组有序。因为像空气上浮到水面,最大的元素会慢慢浮到最后,所以冒泡因此得名。 冒泡排序是比较简单的一种排序算法,核心思想就是比较相邻的两个数,但效率比较低所以可做一些优化。时间复杂度为O(N^2),数据规模较小时可采用,但数据过大时就不建议采用冒泡了。 原始: ```java public class MaopaoTest { .原创 2021-06-02 11:57:00 · 385 阅读 · 0 评论 -
面试题:线程池常见10问【重要】
一、使用线程池比手动创建线程好在哪里? 1、减少线程生命周期带来的开销。如:线程是提前创建好的,可以直接使用,避免创建线程的消耗。 2、合理的利用内存和CPU。如:避免线程创建较多造成的内存溢出,避免线程创建较少造成CPU的浪费。 3、可以统一管理资源。如:统一管理任务队列,可以统一开始或结束任务。 /** * 例子: 用固定线程数的线程池执行10000个任务 */ public class ThreadPoolDemo { public static void main(原创 2021-06-14 14:38:41 · 1985 阅读 · 0 评论 -
面试题:线程安全3问
一、一共有哪 3 类线程安全问题? 什么是线程安全: 当多个线程访问一个对象时,不需要考虑不能同时写入或者读写不能并行的问题,也不需要做额外的同步操作,那么就说这个对象是线程安全的。 1)运行结果错误:如两个线程同时访问共享变量i,执行1000次 i++操作,未加同步操作; 2)发布和初始化引发的线程安全问题:如子线程还未给一个对象初始化,主线程就去访问,得到的是null; 3)活跃性问题, 死锁:如两个线程各拿到对方的锁不愿意释放; 活锁:如消息队列中报错的消息被重复放到队列头进行执行; 饥饿:如某个线程原创 2021-06-13 19:36:17 · 333 阅读 · 0 评论 -
面试题:线程基础5问
一:为何说只有 1 种实现线程的方法? 1.创建线程,本质上就一种,通过new Thread()实现; 但实现线程执行内容有两种方式,也是我们最常见的,1)继承Thread类;2)实现Runnable接口。 其他方式,例如线程池,Timer只是对new Thread()的封装。 2.实现Runnable接口相比继承Thread类的好处: 1)结构上分工更明确,线程本身属性和任务逻辑解耦; 2)某些情况下性能更好,直接把任务交给线程池执行,无需再次new Thread(); 3)可拓展性更好,实现接口可以多个原创 2021-06-13 17:47:02 · 151 阅读 · 0 评论