![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java面试
文章平均质量分 83
要有价值
这个作者很懒,什么都没留下…
展开
-
Collector原理解析
collect函数式编程原理解析原创 2022-07-20 17:22:46 · 645 阅读 · 1 评论 -
阻塞队列 — DelayedWorkQueue源码分析
前言线程池运行时,会不断从任务队列中获取任务,然后执行任务。如果我们想实现延时或者定时执行任务,重要一点就是任务队列会根据任务延时时间的不同进行排序,延时时间越短地就排在队列的前面,先被获取执行。队列是先进先出的数据结构,就是先进入队列的数据,先被获取。但是有一种特殊的队列叫做优先级队列,它会对插入的数据进行优先级排序,保证优先级越高的数据首先被获取,与数据的插入顺序无关。实现优先级队列高效常用的一种方式就是使用堆。关于堆的实现可以查看《堆和二叉堆的实现和特性》ScheduledThreadPoo.原创 2022-05-30 20:23:44 · 2674 阅读 · 1 评论 -
HTTP、Socket、TCP之间的关系与区别
前言整理了下HTTP、Socket、TCP之间的关系与区别,我们经常会被问到的东西,那么什么是HTTP呢?HTTP属于老话题了,在项目中我们经常需要往服务器端发POST或者GET请求,但是对于HTTP的了解不应该只局限于此。千里之行,始于足下。越想走的远,基本原理就应该了解的透彻全面一些,仅仅停留在使用ASIHttpRequest或者AFNetWorking传个参数发个请求的程度上是不够的。通过本文你能收货哪些内容:完整HTTP请求与响应包含的必要元素HTTP不同版本之间的差别HTTP、Soc原创 2021-11-12 19:44:39 · 928 阅读 · 0 评论 -
图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。前言深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻原创 2021-04-09 11:04:14 · 22411 阅读 · 4 评论 -
动态代理的两种实现和优缺点
一、文章要点提前知二、动态代理的本质1、首先了解一下动态代理类对应的class文件是什么时候生成的?首先通过一张图了解一下Java源文件实例对象的一个简单的流程:2、动态代理的本质简述:通过一定的技术,省略源文件的编写,直接在运行期间,生成相应的Java字节码文件;三、JDK原生动态代理1、JDK原生动态代理中两个重要的小伙伴 a、Proxy:Proxy是所有动态代理的父类;它提供了一个静态的方法创建代理的Class对象来配置生成代理类Class文件的方法与参数,主要就是通过Prox原创 2021-03-10 17:57:01 · 490 阅读 · 0 评论 -
Servlet 运行工作原理详解
Servlet 运行工作原理详解事实上,servlet就是一个Java接口,interface! 打开idea,ctrl + shift + n,搜索servlet,就可以看到是一个只有5个方法的interface![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NBUouz5q-1614861128873)(C:\Users\ule_lee\Desktop\v2-85bf84640fbc6b6e195b9c5b513b918f_hd.png)]所以,提问中说的网络协议、原创 2021-03-04 20:32:40 · 1736 阅读 · 1 评论 -
四种常见的线程池
在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例。不过,在Executors类中,为我们提供了常用线程池的创建方法。接下来我们就来了解常用的四种:newFixedThreadPool首先,看一下这种线程池的创建方法:public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads转载 2021-03-04 16:40:38 · 5839 阅读 · 5 评论 -
红黑树的理解
写在前面当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我的疑问,那么本文对你会有帮助,本文帮助你全面、彻底地理解红黑树!本文将通过图文的方式讲解红黑树的知识点,并且不会涉及到任何代原创 2021-03-04 16:34:25 · 244 阅读 · 1 评论 -
Java四种引用类型
1.强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。2.软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。3.弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,原创 2021-03-03 17:30:19 · 74 阅读 · 2 评论 -
常见JVM虚拟机指令
常见JVM虚拟机指令1.基本常用指令解释new创建一个对象并将地址放入虚拟机栈dup复制一个对象地址放入虚拟机栈invokespecial用于调用私有方法及final方法,调用构造方法invokestatic用于调用静态方法invokeinterface用于调用接口方法checkcast确定对象为所给定的类型并强制类型转换putstatic设置类中静态字段的值getstatic从类中获取静态字段putfield设置对象原创 2021-03-03 17:26:21 · 161 阅读 · 1 评论 -
SimpleDateFormat的线程不安全问题
一、前言日期的转换与格式化在项目中应该是比较常用的了,最近同事小刚出去面试实在是没想到被 SimpleDateFormat 给摆了一道…面试官:项目中的日期转换怎么用的?SimpleDateFormat 用过吗?能说一下 SimpleDateFormat 线程安全问题吗,以及如何解决?同事小刚:用过的,平时就是在全局定义一个 static 的 SimpleDateFormat,然后在业务处理方法(controller)中直接使用,至于线程安全… 这个… 倒是没遇到过线程安全问题。哎,面试官的考察点真原创 2021-03-03 16:24:18 · 2339 阅读 · 2 评论 -
B树、B-树、B+树、B*树之间的关系
B树B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树。特此说明。先介绍下二叉搜索树 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;原创 2021-03-02 17:41:26 · 162 阅读 · 0 评论 -
接口、抽象类的区别
1、基本语法区别Java中接口和抽象类的定义语法分别为interface与abstract关键字。抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点:a、抽象类不能被实例化只能被继承;b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;d、一个子类继承一个抽象类,则子类必须实现父类抽象方原创 2021-02-23 10:29:22 · 135 阅读 · 0 评论 -
进程、程序、线程的本质区别
进程是什么?程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。这是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出的。有了进程为什么还要线程?进程有很多优点,它提供了多道编程,让原创 2021-02-22 10:54:49 · 369 阅读 · 0 评论 -
从Jvm的角度来看Java的多线程
为什么使用多线程,一直深入讲解到jvm底层的锁实现。多线程的目的为什么要使用多线程?可以简单的分两个方面来说:在多个cpu核心下,多线程的好处是显而易见的,不然多个cpu核心只跑一个线程其他的核心就都浪费了;即便不考虑多核心,在单核下,多线程也是有意义的,因为在一些操作,比如IO操作阻塞的时候,是不需要cpu参与的,这时候cpu就可以另开一个线程去做别的事情,等待IO操作完成再回到之前的线程继续执行即可。多线程带来的问题其实多线程根本的问题只有一个:线程间变量的共享java里的变量可以分3原创 2021-02-05 17:33:06 · 231 阅读 · 0 评论 -
JAVA 8 Stream的详细用法
一、概述Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。特点: 1 . 不是数据结构,不会保存数据。 2. 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟pe原创 2021-02-01 18:44:08 · 192 阅读 · 0 评论 -
java中equals以及==的用法(简单介绍)
java中equals以及==的用法(简单介绍)简单介绍equals方法是java.lang.Object类的方法有两种用法说明:一、对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。1、“==”比较两个变量本身的值,即两个对象在内存中的首地址。(java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属性)2原创 2021-01-29 20:00:39 · 734 阅读 · 0 评论 -
一文彻底理解ReentrantLock可重入锁的使用
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。一、简介ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantL原创 2021-01-22 17:15:46 · 207 阅读 · 0 评论 -
Lambda表达式与匿名内部类的区别分析
一、 匿名内部类匿名内部类其实就是没有名字的内部类,但是其必须要实现一个接口或者继承一个父类,通常是用来简化代码例程如下:先定义一个 IAnimalpublic interface IAnimal { void run(); void walk();}然后定义测试类 NestedClassTestpublic class NestedClassTest { public static void main(String[] args) { IAn原创 2021-01-22 11:30:45 · 171 阅读 · 0 评论 -
Java只有值传递
在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了。如果你有以下想法,那么你有必要好好阅读本文。错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。错误理解二:Java是引用传递。错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。实参与形参我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法:public static void main(String[] args)这原创 2020-12-29 15:59:07 · 66 阅读 · 0 评论 -
hashCode()和equals()面试题集锦
一、hashCode()和equals()是什么?hashCode()方法和equals()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致。二、hashCode()和equals()的区别下边从两个角度介绍了他们的区别:一个是性能,一个是可靠性。他们之间的主要区别也基本体现在这里。1、equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成原创 2020-12-29 14:28:19 · 176 阅读 · 0 评论