设计模式34讲

  |   0 评论   |   321 浏览

阅读设计模式,更多地还能帮助我们梳理解决问题的思路,学习设计模式中蕴藏的丰富的设计理
念,取其精髓,取长补短,将这些设计不断应用于现实的系统设计之中,更有助于设计出符合设
计美学、高内聚低耦合的功能模块。
为了帮助大家更好地学习设计模式,在接下来的 34 节课程中,我们会先从设计模式的几大原则
讲起,“知其然还要知其所以然”,悉数讲解市面上常见的近 30 种设计模式,通过类图讲解、
代码示例、应用场景、优缺点说明等通俗易懂的文字帮助大家更好地理解这些设计模式,并从中
总结出设计模式的使用、注意事项等,最终篇会对课程进行系统总结,实践总结,帮助大家的更
好地温故而知新。

Java 并发编程之美:并发编程基础晋级篇

  |   0 评论   |   452 浏览

本章主要介绍了并发编程的基础知识,为后面高级篇讲解并发包源码提供了基础,通过图形结合讲述了为什么要使用多线程编程,多线程编程存在的线程安全问题,以及什么是内存可见性问题。然后讲解了 synchronized 和 volatile 关键字,并且强调了前者既保证了内存可见性同时也保证了原子性,而后者则主要做到了内存可见性,但是它们的内存语义还是很相似的,最后讲解的什么是 CAS 和线程间同步以及各种锁的概念,都为后面讲解 JUC 包源码奠定了基础。

Java 并发编程之美:线程相关的基础知识

  |   0 评论   |   355 浏览

借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了;相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。

并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。

作为 Java 并发编程之美系列的开篇,首先通过通俗易懂的方式先来和大家聊聊多线程并发编程线程有关基础知识(本文结合示例进行讲解,定会让你耳目一新),具体内容如下:

Spring Boot 工程化最佳实践

  |   0 评论   |   698 浏览

Spring Boot 已经成为 Java 后端事实上的标准开发框架,目前已经演进到了 2.1.5 版本。在项目开发过程中,也逐渐形成了一些公认的不错的做法或者规范,本文试图将其沉淀总结为最佳实践,供后来人学习和使用。这些实践包含实际项目开发中的方方面面,包含但不限于工程实践、技术细节、规范流程、技术选型等,希望能让读者少走弯路,同时能在团队中形成相对统一的规范与实践,减少不同项目之间切换的学习成本。

适合人群:Java 后端开发人员、架构师、技术管理者。

带你全面了解高级 Java 面试中需要掌握的 JVM

  |   0 评论   |   362 浏览

如果在大学里学过或者在工作中使用过 C 或者 C++ 的读者一定会发现这两门语言的内存管理机制与 Java 的不同。在使用 C 或者 C++ 编程时,程序员需要手动的去管理和维护内存,就是说需要手动的清除那些不需要的对象,否则就会出现内存泄漏与内存溢出的问题。

如果你使用 Java 语言去开发,你就会发现大多数情况下你不用去关心无用对象的回收与内存的管理,因为这一切 JVM 虚拟机已经帮我们做好了。了解 JVM 内存的各个区域将有助于我们深入了解它的管理机制,避免出现内存相关的问题和高效的解决问题。

Java 最常见 200+ 面试题全解析:面试必备

  |   0 评论   |   383 浏览

什么要写这样一篇关于面试的文章?原因有三个:第一,我想为每一个为梦想时刻准备着的“有心人”,尽一份自己的力量,提供一份高度精华的 Java 面试清单;第二,目前市面上的面试题不是答案不准确就是内容覆盖面太窄,所以提供一份经典而又准确的面试题是非常有必要的;第三,本文会对部分面试题提供详细解读和代码案例,让读者知其然并知其所以然,从而学到更多的知识。

或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。

凡事预则立,不预则废。能读到这里的人,我相信都是这个世界上的“有心人”,还是那句老话:上天不负有心人!我相信你的每一步努力,都会收获意想不到的回报。

数据结构与算法之美26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树

  |   0 评论   |   534 浏览

红黑树是一个让我又爱又恨的数据结构,“爱”是因为它稳定、高效的性能,“恨”是因为实现起来实在太难了。我今天讲的红黑树的实现,对于基础不太好的同学,理解起来可能会有些困难。但是,我觉得没必要去死磕它。

我为什么这么说呢?因为,即便你将左右旋背得滚瓜烂熟,我保证你过不几天就忘光了。因为,学习红黑树的代码实现,对于你平时做项目开发没有太大帮助。对于绝大部分开发工程师来说,这辈子你可能都用不着亲手写一个红黑树。除此之外,它对于算法面试也几乎没什么用,一般情况下,靠谱的面试官也不会让你手写红黑树的。

数据结构与算法之美25 | 红黑树(上):为什么工程中都用红黑树这种二叉树

  |   0 评论   |   562 浏览

上两节,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。

不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于log2n的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复杂度会退化到O(n)。我上一节说了,要解决这个复杂度退化的问题,我们需要设计一种平衡二叉查找树,也就是今天要讲的这种数据结构。

数据结构与算法之美24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

  |   0 评论   |   489 浏览

上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。

我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是O(1)。既然有了这么高效的散列表,使用二叉树的地方是不是都可以替换成散列表呢?有没有哪些地方是散列表做不了,必须要用二叉树来做的呢?

带着这些问题,我们就来学习今天的内容,二叉查找树!