- 博客(19)
- 收藏
- 关注
原创 LRUCache实现
LRUCache实现在面试中,我们经常听到说LRU这个关键词,那么我们需要了解什么是LRU,我的理解是,LRU是一种淘汰策略,我们都知道操作系统的内存更替策略、Redis的缓存淘汰策略都有它的一个影子。那么要知其所以然,我们还得需要手工实现它,那么这里我给出一个实现是基于双端链表+哈希表的,这里并没有考虑到并发的场景,如果读者想去优化,可以给缓存加入读写锁ReentrantReadWriteLock。public static class LRUCache { private static cl
2021-10-08 17:25:18
215
原创 Java并发编程(1)—ABAB问题的实现
Java并发编程 - ABAB问题的实现 其实学到了并发这块和底层操作系统是紧密联系的,所以操作系统对进程的处理方式在Java中也是一样的,这篇我们不讲解并发的详细知识,先实现一道经典的并发问题,让读者自己体会并发编程之美。synchronized的解决方案实现如下,读者可以调整线程A,B中的wait和notify出现的位置,会发现有些会造成死锁。public class SyncABABSolution { public static void main(String[] arg
2021-08-19 11:03:13
319
原创 Java基础知识6—IO操作理论
Java基础知识(6) - IO操作理论 IO操作一直是一个经久不衰的面试话题,其实IO的东西并不是特别多,唯一的难处在与它特别零散,各个知识点需要交叉起来学习,这样我们才会有感觉到收益。下面我们先从操作系统的IO模型讲起,最后到Java原生的IO模型。操作系统的IO 操作系统的IO模型一共有五种,按照效率从低到高排列分别是:阻塞式、非阻塞式、信号驱动式、多路复用式和异步式。在深入探讨这五种模型之前,我们需要知道操作系统处理一次IO的过程,即:CPU将数据从磁盘拷贝到内核空间,再将内核空间的数
2021-08-12 22:12:01
196
原创 必会算法总结6—二分查找算法
必会算法总结(6) - 二分查找算法 二分查找算法也是比较重要的算法,虽然简单,但是它也是笔试当中经常出现的算法。它也是典型的使用分治法实现的算法,下面我给出它的实现。算法核心这里实现的时候有一个细节,尽量不要使用mid = (i + j) / 2计算中点的值,因为很容易出数值溢出的情况,在这里我给出两种实现,代码如下:普通的二分法这种二分查找不会判断两侧端点nums[i]和nums[j]处的值,只会判断中间的值nums[mid]是否满足条件。public int binarySear
2021-08-05 15:02:24
187
原创 必会算法总结5—弗洛伊德算法
必会算法总结(5) - 弗洛伊德算法 弗洛伊德算法又是一个图论的算法,可能有小伙伴会问,会这么多图论的算法有用吗?可以说这对于校招进大厂的小伙伴是特别重要的,而且图相对于其它的数据结构是比较复杂的,现在的笔试动不动就是一道基于图去实现的题,可以说图论算法成了进大厂的第一步,所以我们必须特别重视图论算法的设计与实现。 回到正题,上一篇我们讲解的迪杰斯特拉算法广泛适用于单源最短路径问题,而弗洛伊德算法则更广泛的适用于多源最短路径问题,因为它用到了动态规划的思路去求解,所以避免了重复计算。各位要区分清
2021-07-31 20:36:21
478
原创 操作系统1—概述
操作系统(1) - 概述 我们很多走应用程序开发的程序员可能觉得像操作系统、编译原理等知识没必要深入学习,其实这个想法是十分错误的。学习操作系统这些可以让我们更加清楚计算机的体系结构,而且操作系统对于进程、内存等资源的管理思路也是大量的应用到Jvm中。那么这一节我们先介绍操作系统的概念。操作系统的地位计算机软件分为以下两类,而操作系统则属于系统软件系统软件:属于计算机系统的一部分,用于支持应用软件的运行应用软件:计算机用户所利用的软件操作系统的定义能够有效地组织和管理系统中的各种软/
2021-07-30 19:14:37
95
原创 必会算法总结4—迪杰斯特拉算法
必会算法总结(3) - 迪杰斯特拉算法 迪杰斯特拉算法的核心在于贪心+BFS。它和上一篇介绍到的拓扑排序一样属于图论算法,是大学计算机专业必学的算法之一,也是笔试经常出的算法。那么下面让我们一起来学习迪杰斯特拉算法的实现。算法思想迪杰斯特拉算法需要维护以下两张列表:visited:记录已经计算出最短路径的节点shortest:记录到达每个节点的最短路径每次选取shortest中的权值最小的节点加入visited中,并实时维护shortest列表。图的存储实现在本次实例中我选用图的邻接
2021-07-29 15:53:02
283
原创 必会算法总结3—拓扑排序
必会算法总结(3) - 拓扑排序 可能很多人第一次看到拓扑排序这个名字还以为它是种数值排序算法,它其实是对有向无环图AOV的一种特殊的遍历算法。拓扑排序是图论中比较重要的算法,在笔试中也是很常见的,需要知道的是只有无环图才有拓扑排序,所以使用我们可以使用拓扑排序判断一个图中是否存在环。那么下面我们就一起学习拓扑排序。邻接表在本示例中我们选用邻接表存储图,代码如下:Nodepublic class Node { int value; List<Node> neig
2021-07-26 22:54:19
148
1
原创 必会算法总结2—最小公倍数
必会算法总结(1) - 最小公倍数 计算两个数字的最小公倍数我们需要直到数论中这样一条性质:a * b = gcd(a, b) * lcm(a, b),所以我们要计算两个数字的最小公倍数lcm只需要变换一下公式:lcm(a, b) = a * b / gcd(a, b)。所以核心还是在于计算最大公约数。算法实现两个数字:public class Main { public static int gcd(int a, int b) { if (b == 0)
2021-07-25 16:57:33
317
原创 必会算法总结1—最大公约数
必会算法总结(1) - 最大公约数 算法可谓是很多小伙伴心中的痛,懒得去刷题或者刷了但是收益不大。其实算法也是有自己的框架体系在支撑:像贪心,动态规划,DFS,BFS,这些技巧其实更多的是需要大量刷题去实践,去总结。有时候我们经常会遇到各种各样的笔试题,其实很大一部分在大学课堂中学过:像图论中求最小生成树的普利姆算法、克鲁斯卡尔算法;以及求单源最短路径的迪杰斯特拉算法;以及各种各样的排序算法。这些算法需要我们去理解,去记忆,因为这些已经算是必会项目了。 回到正题,这篇我们会去学习如何去求两个数的
2021-07-25 16:29:59
191
原创 Jvm基础知识2—垃圾回收算法
Jvm基础知识(2) - 垃圾回收算法 很多人都认为GC是Java语言特有的,或者是Java语言伴随的产物。这个认识是有错误的,最早使用垃圾回收的语言是Lisp语言,Java只是让垃圾回收这个技术火起来罢了;除了Java,Go语言、Python语言也是有垃圾收集器的语言。我们都知道在C或者C++中,我们对内存是有绝对控制权的,我们掌握着一个结构体实例的生杀大权,但是程序员可能忘记回收内存最终导致生产环境内存泄漏的问题。在Java中,我们只需要使用new生成一个对象,free或者delete交给GC去做
2021-07-20 09:25:31
119
原创 Jvm基础知识—Java内存区域
Jvm基础知识(1) - Java内存区域 Jvm可以说是Java语言跨平台的基。当然Jvm有好处也有坏处,好处就是我们Java程序员不用关心何时回收内存,跨平台编程等。坏处就是这导致我们Java程序员面临一些底层问题时无从下手,所以Jvm的知识可以说是我们Java程序员必备的基础之一。先贴一张Jvm的运行时数据区,借鉴了周志明老师的《深入理解Java虚拟机》:运行时数据区程序计数器(Program Counter Register)Java虚拟机栈(Java Virtua Machine
2021-07-19 21:09:50
133
原创 Java集合框架2— LinkedList
Java集合框架(2) - LinkedList Java的集合框架其实是常用数据结构的实现,上篇博客我们讲了ArrayList这种基于数组形式实现的列表,那么这篇博客我们主要讲解基于双向链表实现的列表:LinkedList。那么这里说一下常见的面试题:Java的ArrayList和LinkedList有什么区别?这个问题其实问的其实是数据结构的基础。数组支持随机访问,但是它在列表中间添加和删除元素困难;链表虽然不支持随机访问,但是它在列表中间添加和删除元素简单。继承与实现体系public cla
2021-07-18 21:10:49
94
原创 Java基础知识5—内部类
Java基础知识(5) - 内部类 在这里我们会说明Java的四种内部类:成员内部类、静态内部类,方法内部类、匿名内部类。内部类在集合框架中大量运用,所以这个章节的知识依旧是很重要的。成员内部类下面是成员内部类的一个例子:public class Outer { class Inner {} private String s; public void setS(String s) { this.s = s; }
2021-07-18 14:29:19
92
原创 Java集合框架1 - ArrayList
Java集合框架(1) - ArrayList篇 Java内置了很多数据结构的实现,比如ArrayList、LinkedList、ArrayDeque等。那么这篇博客主要讲解ArrayList的实现。见名知意,ArrayList首先是一个列表,它是靠数组去实现的。那么它和我们平时使用的数组最大的不同是它可以动态的去扩容。继承与实现体系public class ArrayList<E> extends AbstractList<E> implements Li
2021-07-17 20:48:49
99
原创 Java基础知识4—面向对象
Java基础知识(4)-面向对象 我们都听过,Java的面向对象支持的特性有封装、继承和多态,这一章节我们会将讲ava中对于这三种思想的实现,这里我们会说到Java中内置的两个指针:this和super。封装 封装指外界不能直接改变一个对象的属性,必须通过对象的方法更新对象的属性。根据这个原则,我们在设计POJO类时会将一个属性的访问域设置为private,将方法的访问域设置为public。 那么在这里不得不说一个内置的指针:this。之前我们说过,在使用new关键字时Jvm会在堆中开辟
2021-07-17 09:46:47
92
原创 Java基础知识3—Object类
Java基础知识(3)-Object类 我们知道Java有两种数据类型,基本类型和引用类型。基本类型已经在我之前的博客介绍过了,这里就不细说了。那么另外一种类型是引用类型,在Java中所有引用类型的父类都是Object类,也就是说在我们所写的Java代码中,Object类是继承树的根节点。那么掌握Object类的方法对于我们来说是很有必要的。这里我们不考虑线程相关的方法notify、notifyAll、wait。hashCode我们可能都听说过什么重写了equals方法必须重写hashCode方法
2021-07-16 22:24:18
142
原创 Java基础知识2—类和对象
Java基础知识(2)-类和对象 这一块的知识就涉及到思想层面的东西。无论是大学的课程还是各种书籍,上来就说面向对象设计(OOP),那么什么是OOP,面向对象为什么会在发展的过程中逐渐超越面向过程编程,这是我们值得思考的。其中最大的特点就是,建模方式不一样。如果是用Java做一个网页,一上来干的事情是先建类,这就是质的飞跃,因为我们最先考虑的是数据本身,而不是操作数据的行为。这个小小的变化在软件的维护过程中很容易扩展,因为一直是围绕数据本身去思考。 那么回到Java本身,那么我们Java程序员写
2021-07-16 18:20:32
110
原创 Java基础知识1—编程基础
Java基础知识(1) - 编程基础 首先我们需要知道,Java是一门强类型语言,这里所说的强类型指的是所有的变量声明都必须显示的指出这个变量的类型。比如我们的lamada表达式,你必须用函数式接口类型的变量去装载lamada表达式。在Java中一共有两种类型的变量,一种是基本类型,一种是引用类型。我们重点介绍基本类型以及它的字面量表示。基本类型整型类型大小byte1Byteshort2Byteint4Bytelong8Byte浮点型
2021-07-16 15:01:48
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人