
Java基础
文章平均质量分 81
叩丁狼
用心做教育,专注每一位学员的成长
展开
-
强大而好用的选择器:focus-within
本文为叩丁狼高级讲师原创文章,转载请注明出处。伪类和伪元素在开发网页样式中,选择器必不可少,而且选择器也是在开发css中非常重要的内容,包括常用的类选择器,id选择,同时还有伪类,伪类选择器最大的特点就是冒号开头。平时也经常会有小伙伴问到,在使用的时候有伪类,也有伪元素,有些添加单冒号,有些添加双冒号,有没有什么区别?在网上总结的比较多的一个特点就是,其实在使用的时候,无论是伪类还是伪...原创 2019-12-25 10:26:58 · 938 阅读 · 1 评论 -
JavaScript-DOM操作
本文为叩丁狼高级讲师原创文章,转载请注明出处。在之前的文章中,学习过了DOM的访问方式,其中也把DOM相关的概念进行了学习,其实DOM的内容还有很多,所以本文将会继续学习DOM操作相关的内容,DOM操作涉及到的操作有:增、删、改、查,而查这方面的内容其实就是上一次所写的“访问方式”。##DOM的增加DOM操作中增指的是增加节点,分为两部分:创建节点和插入节点。###创建节点创建节...原创 2019-12-17 17:01:34 · 585 阅读 · 1 评论 -
超简单自动编译sass扩展和工具
本文为叩丁狼高级讲师原创文章,转载请注明出处。在之前的文章中,学习过了DOM的访问方式,其中也把DOM相关的概念进行了学习,其实DOM的内容还有很多,所以本文将会继续学习DOM操作相关的内容,DOM操作涉及到的操作有:增、删、改、查,而查这方面的内容其实就是上一次所写的“访问方式”。##DOM的增加DOM操作中增指的是增加节点,分为两部分:创建节点和插入节点。###创建节点创建节...原创 2019-12-10 16:13:53 · 568 阅读 · 1 评论 -
Css、less和Sass(SCSS)
本文为叩丁狼高级讲师原创文章,转载请注明出处。背景CSS(层叠样式表)是一门非程序式语言,入门学习使用非常直观方便,但是队友一些比较复杂或者重用性比较强的项目来说,因为CSS没有变量、函数、SCOPE(作用域),需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用,尤其对于非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码。为了方便前...原创 2019-12-04 09:23:13 · 1519 阅读 · 1 评论 -
面试题:如何在10亿个随机整数中找出前1000个最大的数
本文作者:梁开权,叩丁狼高级讲师。原创文章,转载请注明出处。我们知道排序算法有很多:冒泡算法:通过两层for循环,外层第一次循环找到数组中最大的元素放置在倒数第一个位置,第二次循环找到第二大的元素放置在倒数第二个位置。。。循环N次就可以找到TopN。缺点:冒泡排序内层循环需要大量交换元素。复杂度介于O(n)和O(n^2)之间。快速排序:选一个基准元素,每次排序可以将这个基准元素...原创 2019-10-28 16:18:14 · 1566 阅读 · 3 评论 -
MyBaits-Plus
本文作者:范佳龙,叩丁狼高级讲师。原创文章,转载请注明出处。MyBaits-PlusMyBatis的优点Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old ...原创 2019-10-24 11:02:31 · 1118 阅读 · 1 评论 -
线程基础(三十四)-Read-Write Lock Pattern
本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。接上篇,本篇讲解线程另外一个设计模式:Read-Write Lock Pattern.概念Read是读, 指获取/查询数据的线程, Write是写,指操作(增删改)数据的线程.Read-Write Lock 模式要求:1>在读模式时,多个线程可以同时执行读操作,但不允许写操作2>在写模式时,只允许一个线程执行写...原创 2019-10-21 09:42:39 · 452 阅读 · 1 评论 -
一起来看源代码-01TreeMap添加操作
本文作者:黄海燕,叩丁狼高级讲师。原创文章,转载请注明出处。##前言之前很多小伙伴问我怎么看源代码,还有就是越来越多的程序员都想要看源代码,搞懂底层原理,但是感觉源代码非常的晦涩难懂,不够直接和清晰,所以我希望这篇文章能够快速带同学们看懂java源码,更加深入的学习java,帮助小伙伴们节约学习的时间成本.##1.树的介绍什么是树结构?其实就是一个节点下面有多个子节点,我们称之为...原创 2019-10-18 09:46:45 · 440 阅读 · 1 评论 -
MongoDB With Jav
本文作者:杨龙,叩丁狼高级讲师。原创文章,转载请注明出处。准备工作要使用 Java 代码操作 MongoDB 数据库,创建 Maven 项目则先添加 MongoDB 的 Java 驱动依赖.<!-- MongoDB 的 Java 驱动 --><dependency> <groupId>org.mongodb</groupId>...原创 2019-10-15 09:11:06 · 578 阅读 · 0 评论 -
垃圾回收器和内存分配策略
本文作者:李敏,叩丁狼高级讲师。原创文章,转载请注明出处。4. 垃圾回收器和内存分配策略**GC(Garbage Collection)**的历史比java久远.1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.GC一直致力于解决的问题:哪些内存需要回收(what)?什么时候回收(when)?如何回收(how)?在虚拟机运行时数据区中,最频繁使用的是...原创 2019-10-12 09:15:16 · 369 阅读 · 0 评论 -
从JDBC规范谈桥接模式
作者:叩丁狼教育,原创文章,转载请注明出处。 JDBC是以统一方式访问数据库的API.它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracle数据库专门写一个程序,为访问Sybase数据库又专门写一个程序等等,只需要用JDBC API写一个程序就够了,它可以向相应数据库发送SQL调用.JDBC是Java应用程序与各种不同数据库之间进行对话的方法的机制.简单地...原创 2018-11-12 17:47:23 · 1126 阅读 · 0 评论 -
MySQL常见面试题十
作者:梁开权,叩丁狼教育高级讲师,原创文章,未经同意不得随意转载1、MySQL主从复制的原理。(1)、主库必须开启二进制日志(2)、当有增删改的语句时,会记录到主库的binlog中(3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因)(4)、从库的sql线程负责读取它的relay log里的信息并应用到数...原创 2018-11-14 14:25:47 · 1684 阅读 · 0 评论 -
关于函数式编程
本文作者:杨龙,叩丁狼高级讲师。原创文章,转载请注明出处。为什么要有函数式编程及定义为什么写出高效的并行代码,比如集合操作。 写出出易于维护、更可靠、更不容易出错,比如集合操作。 程序员不必再纠缠于匿名内部类的冗繁和可读性。 能将函数方便地传递也让编写惰性代码变得容易,惰性代码在真正需要时才初始化变量的值。定义函数式编程,就是把一个函数可以作为实参数传递给另一个函数使用...原创 2018-12-06 10:10:09 · 202 阅读 · 0 评论 -
PriorityQueue详解
作者:王一飞 ,叩丁狼高级讲师。原创文章,转载请注明出处。 概念PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。PriorityQueue 队...原创 2018-11-08 16:08:34 · 1561 阅读 · 0 评论 -
详解Gradle项目构建的生命周期
作者:黄少存,叩丁狼高级讲师。本文为原创文章,转载请注明出处。 上一篇咱们已经知道了如何自定义任务了,而且也知道执行任务只需要点击下任务就 ok 了,还有直接写在任务中的代码在执行任意任务时都会被执行. 那为什么这些代码会被执行? 执行的顺序又是怎样的呢?请看一下Gradle 构建的生命周期就明了了.Gradle 项目构建生命周期Gradle 的生命周期分三个阶段,初始化阶段...原创 2018-11-02 16:50:22 · 2467 阅读 · 1 评论 -
Gradle项目依赖管理
作者:黄少存,叩丁狼高级讲师。本文为原创文章,转载请注明出处。 上一篇咱们讲解了 Gradle 构建项目的生命周期,这一篇咱们来看下 Gradle 的另一个重要的知识点,就是依赖管理,那为什么需要依赖管理呢?依赖管理几乎所有基于 JVM 的软件项目都需要依赖外部的类库来重用现有的功能代码.自动化依赖管理可以明确依赖的版本,能解决传递性依赖带来的版本冲突问题.而Gradle ...原创 2018-11-02 16:49:10 · 2060 阅读 · 0 评论 -
并发中的Map容器
本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 上几篇讨论了并发环境下list容器的操作, 本篇我们来聊下另外一个集合容器:Map家族体系Map:以key-value对的形式存在,一种数据结构,一个key, 映射一个value值, map中不能包含重复的key值, 一个key最多只能映射到一个值。常用方法有:添加: V put(K key, V value);删除...原创 2018-10-10 11:22:53 · 393 阅读 · 0 评论 -
并发容器-ConcurrentLinkedQueue详解
作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 概念并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:方式1:加锁,这种实现方式就是我们常说的阻塞队列。方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。先对而已,加锁队列的实现较为简单,这里就略过,我们来重点来解读一下非阻塞队列。从点到面, 下面我们来看下非阻塞队列经典实现...原创 2018-11-08 16:10:06 · 602 阅读 · 0 评论 -
并发容器-CopyOnWriteArrayList
本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 接上篇讲的并发中的list, 今天来聊聊CopyOnWriteArrayList。概念CopyOnWriteArrayList 类是JDK1.5引入的处理并发操作的容器类,他是Arraylist类的一种线程安全的变种,在并发环境下, 保证集合的读与写安全。CopyOnWriteArrayList类是线程安全的容器,但它...原创 2018-10-10 11:21:35 · 338 阅读 · 0 评论 -
并发中的List集合
本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。 实际开发中, 我们使用频率最高的容器估计是list集合,那肯定会遇并发操作.那该如何保证在多线程并发的环境下安全,高效的使用list集合呢?好,这就是今天我们聊话题:并发中的List集合.家族体系List: 有序集合(也称为序列 )。用户可以精确控制列表中每个元素的插入位置。 也可以通过整数索引(列表中的位置)访问元素,并...原创 2018-10-10 11:19:17 · 12216 阅读 · 0 评论 -
使用Gradle自定义任务task
黄少存,叩丁狼高级讲师,本文为原创文章,转载请注明出处。 任务是 Gradle 构建中的两个基本概念之一,而任务的定义和使用有多种形式,以下就给大家介绍几个task 的定义和使用。定义任务基本语法// 使用task 后带任务名称 加上执行闭包{}task t1 { println 't1'}// 任务名称后加上圆括号task t2() { println 't2'...原创 2018-10-16 11:27:50 · 4289 阅读 · 0 评论 -
Gradle构建脚本入门
黄少存,叩丁狼高级讲师,本文为原创文章,转载请注明出处。 上一篇咱们已经知道了Gradle构建脚本的重要性,要使用比较复杂的项目构建就需要来书写构建脚本,那Gradle 的构建脚本有哪些呢,请看构建脚本介绍.构建脚本介绍Gradle 构建脚本中最重要的两个概念是 project 和 task,任何一个 Gradle 构建都由一个或者多个project 组成,每个 project 包括...原创 2018-10-16 11:26:38 · 296 阅读 · 1 评论 -
使用Gradle快速构建项目
黄少存,叩丁狼高级讲师,本文为原创文章,转载请注明出处。 到这里,相信大家都已经知道 Gradle 就是一个构建工具,其主要的目的就是帮咱们构建项目,以下我就通过一个普通的 Java 项目和普通的 web 项目的构建带你走入 Gradle 项目构建.1 Gradle 搭建Java项目使用构建工具搭建 Java 项目的主要目的就是其自动的打包和依赖功能.以下就来看下如何使用 Gradle...原创 2018-10-16 11:25:09 · 453 阅读 · 0 评论 -
快速掌握NIO(下)
本文作者:禹明明,叩丁狼高级讲师。原创文章,转载请注明出处。 上篇文章我们已经简单了解了什么是NIO,它和IO的区别在哪里,下边我们来使用NIO方式来编写一个简单的通信Demo来看一下NIO的使用方式,解释我都写在了注释中,方便大家对照代码理解NIO网络通信-Server端package cn.wolfcode.nio;import java.io.IOException;...原创 2018-10-08 10:59:48 · 470 阅读 · 0 评论 -
快速掌握NIO(上)
本文作者:禹明明,叩丁狼高级讲师。原创文章,转载请注明出处。 NIO概述NIO是JDK1.4引入的新的IO模型,是New I/O的简称,现在更多人认为应该是 Non-blocking(非阻塞) IO的简称,NIO提供了比传统IO更高的性能和更优的操作方式JDK1.4之前我们使用的IO是同步阻塞的,我们可以称之为BIO(阻塞IO)JDK1.4Java学习了Linux的select...原创 2018-10-08 10:57:56 · 238 阅读 · 0 评论 -
Bean Validation
本文作者:梁开权,叩丁狼高级讲师。原创文章,转载请注明出处。 关于 Bean Validation在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理...原创 2018-10-08 10:52:59 · 421 阅读 · 0 评论 -
Gradle 入门-实现多项目构建
本文作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。之前咱们已经学习了Gradle 的基本原理知识点,已经了解了 Gradle 构建配置的组成部分以及构建的生命周期,如何进行依赖管理以及如何解决传递性依赖冲突.那这一篇咱们来做个实践,来看下咱们在企业中经常使用到的操作,就是如何在项目中来使用 Gradle 构建工具.咱们先来看下多项目的构建.多项目构建在企业中,一个比价复杂...原创 2018-12-07 14:49:59 · 476 阅读 · 0 评论 -
Gradle 入门-版本冲突问题
本文作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。在之前的文章上,咱们已经知道了如何添加依赖,接下来咱们来看下如何来管理依赖.其实管理依赖的最重要的环节就是传递性依赖过程中存在的版本冲突的问题处理.接下来咱们先来看个存在传递性依赖过程中 jar 测版本冲突问题,再来看下 Gradle 有哪些的处理方法.传递性依赖中的版本冲突hibernate中slf4j的版本冲突问题...原创 2018-12-07 14:50:22 · 2206 阅读 · 0 评论 -
函数式编程——类库
本文作者:杨龙,叩丁狼高级讲师。原创文章,转载请注明出处。基类型和包装类型拆箱装箱的性能问题将基本类型转换为装箱类型,称为装箱,反之则称为拆箱,两者都需要额外的计算开销。包装类型在求和的时候,会出现性能问题。所以我们会把下面 count 类型声明基本类型 long。Long count = 0;for(int i = 1; i <= 10; i++){ count +...原创 2019-04-19 17:01:29 · 433 阅读 · 0 评论 -
第一篇-jvm运行时内存分析
本文作者:黄海燕,叩丁狼高级讲师。原创文章,转载请注明出处。开篇:有些程序员觉得学习jvm是一个装逼的行为开发中用不到,或者是为了应付面试而去学习的,我觉得如果你是甘于平庸的码农只是写写业务代码的,确实是没有学习的必要的.但是如果你对你的职业生涯是有规划想往架构师、高级程序员等方向发展的,或者是解决内存泄漏、gc频繁导致的程序响应慢等问题,或者是写出最优的代码,那么了解整个jvm的执行流程...原创 2019-04-19 16:56:49 · 450 阅读 · 0 评论 -
从0开始写框架(三)—分布式事务解决方案
本文作者:罗海鹏,叩丁狼高级讲师。原创文章,转载请注明出处。回顾 上一篇文章我们说到,各种分布式事务解决方案的特点,其中最后提到了可靠消息事务最终一致性这种解决方案,而我们这篇文章的标题也是它,没错,我们接下来要详细的分析该解决方案的实现细节了,上一篇文章在介绍该解决方案时,已经说了那个执行流程分析图,仅仅只是一个粗略图而已,实际上,可靠消息事务最终一致性的设计是非常复杂的。那么为什么要...原创 2019-02-16 09:18:12 · 333 阅读 · 0 评论 -
从0开始写框架(二)—分布式事务解决方案
本文作者:罗海鹏,叩丁狼高级讲师。原创文章,转载请注明出处。前言 工欲善其事必先利其器,既然我们决定要做一个分布式事务框架,那首先需要了解一下,分布式事务是怎么回事,它跟传统的本地事务有什么区别,解决方案有哪些,每种解决方案的对比等等。本地事务 在了解分布式事务之前,先回顾一下本地事务,顾名思义,本地事务就是在同一个JVM中,一个开启了事务的业务方法就是本地事务。而这一个开启了事务...原创 2019-02-16 09:15:45 · 560 阅读 · 0 评论 -
从0开始写框架(一)—开篇介绍
本文作者:罗海鹏,叩丁狼高级讲师。原创文章,转载请注明出处。概述 我们这个系列的文章叫做“从0开始写框架”,那从文章的标题可以知道,这系列的文章主要是讲:一个java框架是如何开发出来的。看到这里,可能已经有部分小伙伴不明觉厉了。 但其实,开发一个框架并不是什么很神秘、很高大上的事情,就跟我们平时做业务类的项目差不多,这个差不多指的是开发形式上差不多。不一样的地方就在于思想上要做一个...原创 2019-02-16 09:12:11 · 493 阅读 · 0 评论 -
并发面试题--什么是ThreadLocal本地局部变量?
本文作者:黄海燕,叩丁狼高级讲师。原创文章,转载请注明出处。ThreadLocal是一个本地线程副本变量工具类,可以理解为线程的本地变量。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,实现了线程的数据隔离,是线程独有的所以本身就是线程安全,特别适用于各个线程依赖多个不同的变量值完成操作的场景。如:数据库连接、Session管理等。##1...原创 2019-02-16 09:09:36 · 988 阅读 · 1 评论 -
并发面试题:java中有几种方法可以实现一个线程?
本文作者:黄海燕,叩丁狼高级讲师。原创文章,转载请注明出处。##1.创建并启动线程的6种方式:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和FutureTask创建线程4)使用线程池,例如用Executor框架5)Spring实现多线程(底层是线程池)6)定时器Timer (底层封装了一个TimerThread对象)##...原创 2019-02-16 09:06:15 · 926 阅读 · 0 评论 -
NIO-缓冲区
本文作者:杨龙,叩丁狼高级讲师。原创文章,转载请注明出处。定义I/O 操作也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)。那么在 NIO 中使用 Buffer 进行对缓冲区抽象。概念上,缓冲区是包在一个对象内的基本数据元素数组,直白说就是数据的容器。Buffer 类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buf...原创 2019-02-15 15:33:03 · 376 阅读 · 0 评论 -
NIO-简介
本文作者:杨龙,叩丁狼高级讲师。原创文章,转载请注明出处。IO 操作问题在 Java 的早期,JVM 在解释字节码时往往很少或没有运行时优化。这就意味着,Java 程序运行速率大大低于本地编译代码,因而对操作系统 I/O 子系统的要求并不太高。在运行时优化方面,JVM 已然前进了一大步。现在 JVM 运行字节码的速率已经接近本地编译代码,借助动态运行时优化,其表现甚至还有所超越。这就意味着...原创 2019-02-15 15:31:21 · 431 阅读 · 0 评论 -
一次完整的HTTP请求所经历的步骤
本文作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。HTTP通信机制是在一次完整的HTTP通信过程中,Web 浏览器与 Web 服务器之间将完成下列几个步骤:1. 建立TCP连接在 HTTP 工作开始之前,Web 浏览器首先要通过网络与 Web 服务器建立连接,该连接是通过TCP来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议,因此 Inte...原创 2019-02-15 15:28:39 · 1008 阅读 · 0 评论 -
高性能的关键异步请求的原生态
本文作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。前言:说到异步请求咱们得先知道何为同步请求,从而对比来理解异步请求.同步请求简述, 浏览器发送请求->web服务器开启线程处理请求->处理完把结果返回给浏览器. 咱们来看下程序中同步请求的业务逻辑图.同步请求对于同步操作来说,web服务器开启请求处理线程之后需要等待业务的处理完成才能做响应.对于同步请求来说这是...原创 2019-02-15 15:26:28 · 244 阅读 · 0 评论 -
线程并发—线程池
本文作者:黄海燕,叩丁狼高级讲师。原创文章,转载请注明出处。1.1 为什么要使用线程池?所谓线程池,其实和连接池的概念很像,就是在内存中实现创建好了多个线程,我们使用的时候直接从里面拿,不用的时候直接放回去,并且线程池我们是可以进行管理的,很好的控制多个线程,并且减少了创建和销毁的过程减小了内存中的消耗。相比起普通的创建线程,线程池的好处:重用存在的线程,减少对象创建、消亡的开销,...原创 2019-02-15 15:37:20 · 330 阅读 · 0 评论