自定义博客皮肤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程序员笔记

以创业得心态去打工

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

原创 14 Java虚拟机实现 synchronized

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

2019-01-28 18:17:46 331

原创 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 222

原创 12 JVM 垃圾回收(下)

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

2019-01-25 23:30:23 244

原创 11 JVM 垃圾回收(上)

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

2019-01-24 19:54:21 268

原创 10 Java 对象的内存布局

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

2019-01-23 14:48:30 175

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

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

2019-01-21 21:41:41 393

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

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

2019-01-19 20:51:00 712

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

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

2019-01-18 21:53:35 237

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

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

2019-01-18 10:21:24 200

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

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

2019-01-16 22:37:37 153

原创 算法笔记-向量空间

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

2019-01-15 21:11:46 259

原创 02 Java 的基本类型

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

2019-01-14 21:21:29 232

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

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

2019-01-13 22:30:17 337

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

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

2019-01-12 23:39:24 254

原创 算法笔记-位图

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

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

原创 算法笔记-最短路径

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

2019-01-10 23:23:36 422

原创 算法笔记-拓扑排序

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

2019-01-09 23:41:13 294

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

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

2019-01-08 21:40:26 202

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

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

2019-01-07 22:32:08 149

原创 算法笔记-回溯算法

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

2019-01-06 23:07:35 559

原创 算法笔记-分治算法

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

2019-01-06 17:21:57 268

原创 算法笔记-贪心算法

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

2019-01-05 22:24:48 621

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

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

2019-01-04 23:08:06 210

原创 算法笔记-Trie树

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

2019-01-03 21:43:18 208

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

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

2019-01-02 22:36:37 146

原创 算法笔记-图的搜索

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

2019-01-02 21:26:16 193

空空如也

空空如也

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

TA关注的人

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