自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

java程序员笔记

以创业得心态去打工

  • 博客(73)
  • 收藏
  • 关注

原创 14 Java虚拟机实现 synchronized

java 中的 synchronized 运行在 Java 中,我们经常用 synchronized 关键字对程序进行加锁。无论是一个代码块还是静态方法或者实例方法,都可以直接用 synchronized 声明。当声明 synchronized 代码块时,编译的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素,作为所要加...

2019-01-28 18:17:46 313

原创 13 Java内存模型

数据竞争int a=0, b=0;public void method1() { int r2 = a; b = 1;}public void method2() { int r1 = b; a = 2;}上述代码中,定义了两个共享变量 a 和 b,以及两个方法。在单线程分别调用方法一和方法二后,r1 和 r2 的值可能是(1,0) 或者是(0,2)。如果是在多...

2019-01-26 22:30:33 212

原创 12 JVM 垃圾回收(下)

Java 虚拟机的堆划分Java 虚拟机将堆划分为新生代和老年代。其中新生代又被划分为 Eden 区,以及两个大小相同的 Survivor 区。默认情况下,Java 虚拟机采取一种动态分配的策略,根据对象生成的速率,以及 Survivor 区的使用情况动态调整 Eden 区和 Survivor 区的比例。也可以通过参数 -XX:SurvivorRatio 来固定这个比例。需要注意的是,其中一个...

2019-01-25 23:30:23 229

原创 11 JVM 垃圾回收(上)

引用计数法和可达性分析垃圾回收,就是将已经分配出去的,但却不在使用的内存回收回来,以便再次分配。在 Java 虚拟机语境下,垃圾指的是死亡的对象所占据的堆空间。下面就总结一下如何如何辨别一个对象是否死亡。引用计数法:为每一个对象添加一个引用计数器,用来统计指向该对象的引用个数。如果某个对象的引用计数器为 0,则说明该对象已经死亡,便可以被回收了。通过引用计数法来标记对象的死亡和存活的过程中,...

2019-01-24 19:54:21 251

原创 10 Java 对象的内存布局

Java 创建对象的方式1:new 语句和反射机制创建。该方式会调用类的构造器,同时满足诸多约束。如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器。子类的构造器需要调用父类的构造器,如果父类存在无参数构造器的话,该调用可以是隐式的。如果父类没有无参数构造器,那么子类的构造器则需要显式的调用父类带参数的构造器。显式调用又可以分为两种,一种是使用“super”关键字调用父类构...

2019-01-23 14:48:30 164

原创 07 JVM 是如何实现反射的

Java 中的反射反射是 Java 语言的一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。我们可以通过 Class 对象枚举该类中的所有方法,还可以通过 Method.SetAccessible 让过 Java 语言的访问权限,在私有方法所在类之外的地方调用该方法。反射在 Java 中的引用十分广泛。日常我们用的 Java 继承开发工具 IDE 便运用了这...

2019-01-21 21:41:41 385

原创 06 JVM 是如何处理异常的

在 JAVA 中,异常处理的方式主要是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。抛出异常可以分为显示和隐式两种。显示抛出异常的主体是应用程序,它指的是在程序中使用 throw 关键字,手动将异常实例抛出。隐式抛出异常的主题是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常。例如数组越界异常。捕获异常主要设计一下三种代码块:...

2019-01-19 20:51:00 699

原创 04 JVM是如何执行方法调用的(下)

虚方法调用Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用会被编译成 invokeinterface 指令。这两种指令,均属于 Java 虚拟机中的虚方法调用。动态绑定:Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。静态绑定:调用静态方法的 invokestatic 指令,以及用于调用构造器,私有实例方法和超类非私有实例...

2019-01-18 21:53:35 221

原创 04 JVM是如何执行方法调用的(上)

重载和重写重载:同一个类中定义名字相同的方法,但是参数类型或者参数个数必须不同。重载的方法在编译过程中就可完成识别。具体到每一个方法的调用,Java 编译器会根据所传入参数的生命类型来选取重载方法。选取的过程分以下三个阶段:1:在不考虑对基本类型自动装拆箱,以及可变长参数的情况下选取重载方法。2:如果第 1 个阶段未找到,那么在允许自动装拆箱,但是不允许可变长参数的情况下选出重载方法。3...

2019-01-18 10:21:24 190

原创 03 Java 虚拟机是如何加载 Java 类的

Java 引用类型Java 中的引用类型细分为四种:类,接口,数组类和泛型参数。因为泛型参数会在编译过程中被擦除,所以 Java 虚拟机实际上只有前三种。数组类是由 Java 虚拟机直接生成的,其他两种则有对应的字节流。无论是数组类还是其他两种类型,Java 虚拟机都需要对其进行链接和初始化。加载加载就是查找字节流,然后据此创建类的过程。数组类由 Java 虚拟机直接生成,其他类则需要 ...

2019-01-16 22:37:37 127

原创 算法笔记-向量空间

我们平常都会听音乐。以网易云音乐为例,根据我们喜欢的音乐的风格,给我们每日推送音乐。相当多的时候,它推送的音乐正好是我们喜欢听的音乐。下面我们就总结这样一个只能推荐系统,是如何实现的。算法分析要解决这个问题,满足以下两点就可:1:找到跟你口味偏好相似的人,将他们喜欢的音乐推送给你。2:找到你喜欢的音乐相似的类型,把这些音乐推送给你。下面就根据上面两个思路实现算法。基于相似用户的推荐...

2019-01-15 21:11:46 244

原创 02 Java 的基本类型

Java 的基本类型Java 包括了八种基本类型,明细如下:Java 的基本类型都有对应的值域和默认值。byte,short,int,long,float以及double的值域依次扩大,前面的值域都被后面的值域包括在内。所以,从前面的基本类型转换成后面的基本类型,无需强制转换。补充:尽管它们的默认值表示不一样,但是在内存中都是 0.boolean 和 char 是唯二的无符号类型。bool...

2019-01-14 21:21:29 200

原创 01 Java 代码是怎么运行的

Java代码运行的方式1:在开发工具中运行2:双击 jar 文件运行3:在命令行中运行4:在网页中运行上述运行方式都离不开 JRE,也就是 Java 运行时环境。实际上 JRE 仅包含运行 Java 程序的必须组件,包括 Java 虚拟机以及 Java 核心类库等。Java 程序员经常接触到的 JDK 同样包含了 JRE,并且还附带了一系列开发和诊断工具。为什么 Java 要在虚拟机里...

2019-01-13 22:30:17 314

原创 算法笔记-朴素贝叶斯算法

现在的手机早已经实现垃圾短信过滤和骚扰电话拦截功能,今天总结一下到底是用什么样的数据结构和算法实现这样的功能。基于黑名单的过滤器我们可以在手机上维护一个骚扰电话号码和垃圾短信发送号码的黑名单。每次收到短信或者接到来电的时候,都去黑名单进行电话号码匹配,以便识别骚扰电话和垃圾短信。那么,用什么样的数据结构存储黑名单的电话号码呢。如果数据量少的话,可以用散列表,二叉树,跳表等动态数据结构存储数据...

2019-01-12 23:39:24 222

原创 算法笔记-位图

网络爬虫的原理:通过解析已经爬取页面中的网页链接,然后再爬取这些链接对应的网页。但是,一个页面的链接有可能被包含在多个页面之中,这就会导致爬虫爬取过程中,重复爬取相同的页面,这就需要我们过滤一下已经爬取过的页面。最直接得方法,每次爬取新的链接的时候,都在以爬取链接的集合中查找,确认是否已经爬取过。思路简单,接下来总结用什么数据结构存储已爬取的链接。算法分析问题处理对象是网页链接,包含两个操...

2019-01-11 21:27:55 255 2

原创 算法笔记-最短路径

关于图这种数据结构总结的时候,总结了深度优先搜索和广度优先搜索,这两种算法主要是针对无权图的搜索算法。今天总结针对有权图的搜索算法,最短路径。常用的地图导航软件,规划行程的时候,会给出最短路径,最少用时,最少红绿灯等不同路径,这种的问题都可以最短路径算法解决。最短路径实现算法之初,先确定数据结构。针对地图规划,我们用有权图来表示。地图中的分叉路口映射为图中的顶点,路口与下一个路口之间的距离...

2019-01-10 23:23:36 370

原创 算法笔记-拓扑排序

在开发过程中,编译器编译整个项目的时候,会按照源文件的依赖顺序,依次编译。比如 A 文件的执行依赖 B 文件,那就先编译 B 文件然后才能编译 A 文件。那么编译器是如何通过文件之间的依赖关系,确定一个全局的编译顺序呢?这就用到了拓扑排序。下面在举一个例子,理解什么是拓扑排序。日常我们穿衣服的时候,衣服与衣服之间也有这种依赖关系。比如,一定要先穿内裤才可以再穿秋裤,一定要先穿短袖才可以再穿外套...

2019-01-09 23:41:13 242

原创 算法笔记-动态规划理论

什么样的问题适合动态规划解决一个模型:动态规划解决的问题的模型是“多阶段决策最优解模型”。动态规划一般用来解决最优问题。这个解决过程,需要经历多个决策阶段。每个决策阶段都对应一组状态,从每个决策阶段都选出一种合适的状态,组成一个决策序列,这个序列就是我们期望的最优解。三个特征:1:最优子结构。最优子结构指的是最优解包含子问题的最优解。也就是说,通过子问题的最优解,可以推导出问题的最优解。...

2019-01-08 21:40:26 185

原创 算法笔记-动态规划1

动态规划适合求解最优问题,比如最大值最小值等。它可以显著的降低时间复杂度,提高代码的执行效率。0-1 背包问题在上篇总结中,用回溯算法解决了 0-1背包问题。但是,在求解的过程中,我们应该能想象的出,有些步骤是一直在重复执行。如果背包的总载重为 9 ,物品个数为 5 ,质量分别为 [2,2,4,6,3]。那么将这些数据带入回溯算法的代码中,执行阶段用递归树来表示:在上图中递归树中每个节点的...

2019-01-07 22:32:08 142

原创 算法笔记-回溯算法

在深度优先算法的总结中,就用到了回溯算法求解。回溯算法本身除了指导沃算法设计以外,在实际软件开发场景中应用也十分广泛。例如正则表达式的匹配,编译原理中的语法分析等等。如何理解回溯算法如同走迷宫一样,我们会不断地遇到分叉路口,此时可以随机选择一条路走下去。如果,后续发现这条路走不通,那么我们就返回到分叉路口的选择处,重新选择一条新的路继续走下去,直到走出迷宫。回溯的处理思想,类似于枚举搜索。我...

2019-01-06 23:07:35 504

原创 算法笔记-分治算法

MapReduce 是 Google 大数据处理的三大马车之一,它在倒排索引,PageRank 计算,网页分析等搜索引擎相关技术中都有大量的应用。而 MapReduce 主要的思想就是分治思想。如何理解分治算法分治算法的核心思想就是分而治之。将原问题分解成 n 个规模较小,但是结构与原问题相似的子问题,递归解决这些问题,最后合并结果,就完成了问题的解答。分治算法中用到了递归的方法求解,二者却...

2019-01-06 17:21:57 237

原创 算法笔记-贪心算法

贪心算法其实更准确的表述应该是一种算法思想。它的应用非常广泛,比如:霍夫曼编码,Prim,Kruskal 最小生成树以及 Dijkstra 单源最短路径算法。如果证明贪心算法的可行性需要复杂的数学推导,但是通过简单的举例演示更容易让我们理解这种算法思想,有助于我们在实际中运用。理解“贪心算法”如果有一个 100 kg的袋子,只允许装 5 种豆子,如何合理的在装满袋子的前提下,让袋子的总价值最大...

2019-01-05 22:24:48 576

原创 算法笔记-字符串匹配算法

在实际开发过程中,总会遇到字符串匹配或者是包含的问题。而通用的编程语言中,基本上都有实现字符串匹配的方法。例如:Java 中的 indexof() 方法,底层的实现就是用的字符串匹配的算法。本文总结两种比较简单,容易理解的两种字符串比较算法:BF 算法和 RK 算法。BF 算法BF 算法,中文叫做暴力匹配算法,又叫朴素算法。在 BF 算法中我们首先需要了解两个概念:主串和模式串。举个例子,如...

2019-01-04 23:08:06 198

原创 算法笔记-Trie树

当我们在搜索引擎中输入关键字后,总会展开一个下拉列表,显示关键词相关的词汇以及内容。那么,这个搜索提示是如何实现的呢?今天总结的 Tire 树就可以实现这个功能。Tire 树是什么Tire 树也叫字典树。它是一个树形结构,专门用来处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。上图示用六个字符串构造一个 Tire 树。这六个字符串分别是:how,hi,her,...

2019-01-03 21:43:18 184

原创 算法笔记-字符串搜索2

BM算法的核心思想在上一篇的总结中,如果模式串和当前子串不匹配,则模式串和下一个子串进行比较,比较的时候会从第一个字母开始一个一个对比。在上述的描述中,我们可以把模式串与子串的对比看作是模式串在主串上的滑动。如果当前对比不匹配,模式串就向后滑动一位,与新的子串进行对比。这样的过程,每次模式串都是移动一位。但是再实际情况中,可能主串中的字符有 c,但是模式串中并不包含该字符。那么,模式串其实可...

2019-01-02 22:36:37 130

原创 算法笔记-图的搜索

社交网络中,有一个六度分割理论,就是你跟世界任何一个人间隔的关系不会超过六度,也就是通过六步就能将你跟另一个陌生人连接起来。对应到社交好友中,你的好友就是你的一度连接,你的好友的好友就是你的二度连接,你的好友的好友的好友就是你的三度连接。对应用图存储的社交关系,找到你的一度二度三度好友就是在图中找到搜索相关的顶点。这就运用到图的搜索算法:深度优先和广度优先搜索。图结构的代码实现public...

2019-01-02 21:26:16 180

原创 算法笔记-图的表示

微博,微信,QQ当中,好友之间的关系就需要用图这种数据结构来存储。有关图的算法也比较多:图的搜索,最短路径,最小生成树,二分图等等。这篇文章开始总结图的知识点。什么是图图中的元素叫做顶点,元素与元素之间的连线,叫做边。用图的结构来表示微信用户之间的关系,微信用户就是图中的顶点,互为好友的用户,就用边来表示。微信用户有多少个好友,对应图中顶点的度。跟顶点相连接的边的个数,叫做顶点的度。用图...

2018-12-29 23:27:55 177

原创 算法笔记-堆的应用

堆应用:优先级队列优先级队列,首先是一个队列,但是并非遵守先进先出的原则,而是根据队列总元素的优先级高低出列。优先级队列应用的场景非常多,后续总结的数据结构和算法都要依赖于它。比如:赫夫曼编码,图的最短路径,最小生成树等等。举例一:合并有序小文件。假如有 100 个文件,每个文件 100M,文件中存储的都是有序字符串,现在要将这些文件合并成一个有序的大文件。第一种方法,从 100 个文件...

2018-12-28 21:49:02 455

原创 算法笔记-堆排序

为什么说堆排序没有快速排序快堆排序是一种原地的,时间复杂度为 O(nlogn) 的排序算法。快速排序的时间复杂度也是 O(nlogn),甚至堆排序比快速排序的时间复杂度还要稳定,但是快速排序的性能要比堆排序好。什么是堆堆是一个完全二叉树。堆上任一节点的值都大于等于它的左右子树的值,或者小于等于它的左右子树的值。对于每个节点大于等于子树的堆,叫做大顶堆。对于每个节点小于等于子树的堆,叫做...

2018-12-27 22:00:50 123

原创 算法笔记-红黑树1

上一篇总结中二叉查找树支持快速查找,删除以及插入操作,时间复杂度与树的高度成正比,理想情况下是 O(logn)。但是在频繁插入删除的情况下,树的高度可能就大于 log2|n。极端情况下,树可以退化成链表这种结构,那么相应的操作效率也就下降了。针对这种情况,为了保持二叉查找树的执行效率高效,出现了平衡二叉查找树,其中最广为人知的就是红黑树。什么是平衡二叉查找树二叉树中任意节点的左右子树的高度...

2018-12-26 22:52:34 138

原创 算法笔记-二叉树2

二叉查找树:树中的任意一个节点,它的左子树节点的值都小于该节点的值,它的右子树节点的值都大于该节点的值。图例如下:二叉查找树-查找获取根节点,如果根节点为空,如果根节点的值等于该值,则返回根节点。如果该值小于根节点,则在根节点的左子树中递归查找。如果该值大于根节点,则在根节点的右子树中递归查找。代码如下://树节点class TreeNode{ int data; TreeNod...

2018-12-25 21:40:27 102

原创 算法笔记-二叉树1

什么样的二叉树适合用数组来存储前面的一系列文章主要总结的是线性数据结构,从今天开始,总结非线性数据结构的知识点。比如:树。树先看图:通过上面的图,可以很直观的理解以下概念:根节点,子节点,兄弟节点,叶子节点。没有父节点的节点叫做根节点,比如节点 23。拥有相同的父节点的节点,称之为兄弟节点,比如节点 13 和节点 54。没有子节点的节点叫做叶子节点,比如节点 10,节点 28 等。层...

2018-12-24 22:01:42 139

原创 算法笔记-哈希算法2

哈希算法在分布式系统中有哪些引用哈希算法应用之负载均衡负载均衡的算法有很多,诸如:轮询,随机,加权轮询等等。哈希算法可以帮助我们实现一个会话粘滞的负载均衡算法。会话粘滞:让同一个客户端每次请求访问的时候,固定的访问某台服务器。简单直接的方法:维护一张客户端与服务端映射关系的表。每次客户端发起请求的时候,从映射表中查找到映射关系,再路由到对应的服务端。但是这种方法存在下面几种弊端:1,如果客户...

2018-12-23 22:28:20 158

原创 算法笔记-哈希算法1

什么是哈希算法将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就是哈希算法,映射得到的值就叫哈希值。设计一个优秀的哈希算法,需要注意以下几点:1:从哈希值不能反向推导出原始数据,所以哈希算法也叫单项哈希算法。2:对输入数据非常敏感,哪怕原始数据修改了 1 个 Bit,最后得到得哈希值也不一样。3:散列冲突的概率要小,对于不同的原始数据,得到的哈希值相同的概率要小。4:哈希...

2018-12-22 18:07:01 544

原创 算法笔记-散列表3

为什么散列表和链表会经常一起使用LRU缓存淘汰算法总结链表那篇文章中,曾经实现过LRU缓存淘汰算法,但是当时的删除插入操作时间复杂是 O(n)。如果用散列表加链表的方式实现LRU缓存淘汰算法,时间复杂度就变成O(1)。数据的存贮我们用散列表实现,散列冲突用链表法解决。如果有相同散列值的元素,我们就将其插入到该散列值对应位置链表的尾部,链表上的节点都有一个 hnext 指针,指向该链表的后后...

2018-12-21 21:50:21 155

原创 算法笔记-散列表2

如何打造一个工业级别的散列表在散列表中:散列函数,扩容机制,冲突解决等是决定散列表性能的重要因素,下面针对这三者分析它们是如何影响散列表的性能的。散列函数散列函数的设计不能太过复杂,否则计算散列值的时候势必会消耗更多的时间。散列函数生成的值要尽可能随机且自由分布,否则势必会引起更多的散列冲突散列函数的设计过程中,我们要综合考虑数据关键字的类型,长度,规模以及分布。上篇文章中,针对运动员的...

2018-12-20 21:14:41 176

原创 算法笔记-散列表1

Word文档中的单词拼写检查功能是如何实现的什么是散列表散列表用的是数组支持按照下标随机访问数据的时候,时间复杂度为 O(1)的特性。我们通过散列函数将元素的键值映射为下标,然后将元素存储在数组中对应下标的位置。查找元素的时候,通过散列函数将键值转化为数组下标,然后从数组中取出对应下标位置上的元素。什么是散列思想某校举办运动会,共有 100 名运动员,编号从 0 到 99。如果我们将运动员...

2018-12-19 20:26:18 117

原创 算法-跳表

为什么 Redis 要用跳表来实现什么是跳表二分查找中,底层数据结构是数组。如果底层数据结构换成链表,使其支持二分查找,那么就城这种数据结构为跳表。跳表是一种各方面性能都比较优秀的动态数据结构。它支持快速的查找,插入以及删除操作,实现起来也不复杂,甚至可以替代红黑树。理解跳表原始链表{1,3,4,5,7,8,9,10,13,16,17,18}一级索引{1,4,7,9,13,17}二级...

2018-12-18 20:54:41 658

原创 element table 自定义表尾

简单介绍下项目:后端管理系统,页面样式用的是 element,数据绑定用的是 vue.js。功能需求:需要添加缴药记录,这些记录要显示在一个 table 中,但是 table 末尾一行不做数据展示,只负责触发数据新增的动作。先看最终实现的效果:红框处就是自定义的表位,选择药品处的下拉框,每当选中一个药品的时候,当前 table 就多出一行选中过的药品信息。实现过程:由于用到 eleme...

2018-12-18 19:56:30 9663 3

原创 算法-二分查找2

如何快速定位IP对应的省份二分查找的四种变形:查找第一个值等于给定值得元素,查找最后一个值等于给定值得元素,查找第一个大于等于给定值得元素,查找最后一个小于等于给定值得元素。同时,今天的这四种情况,给定数据集合同样是有序的,但是却有重复元素。变体一:查找第一个值等于给定值得元素先看代码: public static int searchOne(int[] list,int num){ ...

2018-12-17 22:17:51 176

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除