自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Walker_YAM

九和诸侯,一匡天下

  • 博客(84)
  • 资源 (1)
  • 收藏
  • 关注

原创 堆结构的优秀实现类----PriorityQueue优先队列

之前的文章中,我们有介绍过动态数组ArrayList,双向队列LinkedList,键值对集合HashMap,树集TreeMap。他们都各自有各自的优点,ArrayList动态扩容,数组实现查询非常快但要求连续内存空间,双向队列LinkedList不需要像ArrayList一样创建连续的内存空间,它以链表的形式连接各个节点,但是查询搜索效率极低。HashMap存放键值对,内部使用数组加链表实现,检索

2017-06-05 12:57:34 16313 8

原创 Struts2框架的基本使用

前面已经介绍过了MVC思想,Struts2是一个优秀的MVC框架,大大降低了各个层之间的耦合度,具有很好的扩展性。从本篇开始我们学习Struts2的基本用法,本篇主要包括以下内容:Struts2的下载安装理解整个框架的运行流程自定义实现Action自定义配置处理结果一、下载和安装Struts2      登录Apache官网 http://struts.apache.org/downlo

2017-04-29 08:48:48 43473 13

原创 访问权限控制

访问权限控制又称「隐藏具体实现」,也就是说,我们可以通过它来决定某个类或者类中的成员在程序中的可见范围。例如,被修饰为 public 的元素在全局范围可见,而被修饰为 private 的元素只能可见于类的内部。Java 的访问权限控制提供了四种不同的访问权限限定词,用于描述元素在程序中的可见范围。下面我们具体来看一看:包的概念Java 中最基本的文件单位就是类,每个类文件的文件名不...

2018-04-11 15:06:28 539

原创 关于类的对象创建与初始化

今天,我们就来解决一个问题,一个类实例究竟要经过多少个步骤才能被创建出来,也就是下面这行代码的背后,JVM 做了哪些事情? Object obj = new Object();当虚拟机接受到一条 new 指令时,首先会拿指令后的参数,也就是我们类的符号引用,于方法区中进行检查,看是否该类已经被加载,如果没有则需要先进行该类的加载操作。一旦该类已经被加载,那么虚拟机会根据类型信息在...

2018-04-10 16:17:50 2466

原创 垃圾收集机制与内存分配策略

Java 语言与其他编程语言有一个非常突出的特点,自动化内存管理机制。而这种机制离不开高效率的垃圾收集器(Garbage Collection)与合理的内存分配策略,这也是本篇文章将要描述的两个核心点。引一句周志明老师对 Java 中的内存管理机制的描述: Java 与 C++ 之间有一堵有内存动态分配和垃圾收集技术所围成的「高墙」,墙外面的人想进去,墙里面的人却想出来。各有各的...

2018-04-04 10:28:37 387

原创 虚拟机字节码执行引擎

所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给出的字节码指令,基于栈解释器的一种执行机制。通俗点来说,也就是 JVM 解析字节码指令,输出运行结果的一个过程。接下来我们详细看看这部分内容。方法调用的本质在描述「字节码执行引擎」之前,我们先从汇编层面看看基于栈帧的方法调用是怎样的。(以 IA32 型 CPU 指令集为例)IA32 的程序中使用栈帧数据结构来...

2018-03-29 15:34:50 217

原创 虚拟机类加载机制

虚拟机把字节码文件从磁盘加载进内存的这个过程,我们可以粗糙的称之为「类加载」,因为「类加载」不仅仅是读取一段字节码文件那么简单,虚拟机还要进行必要的「验证」、「初始化」等操作,下文将一一叙述。类加载的基本流程一个类从被加载进内存,到卸载出内存,完整的生命周期包括:加载,验证,准备,解析,初始化,使用,卸载。如图:这七个阶段按序开始,但不意味着一个阶段结束另一个阶段才能开始。也就...

2018-03-21 17:22:13 203

原创 字节码文件的内部结构之谜

如果计算机的 CPU 只有「x86」这一种,或者操作系统只有 Windows 这一类,那么或许 Java 就不会诞生。Java 诞生之初就曾宣扬过它的初衷,「一次编写,多处运行」,而它之所以能够实现跨平台的一个核心点就在于,Java 引入「字节码」屏蔽了与底层操作系统之间的差异。同一段 Java 程序在编译后生成的字节码文件是唯一的,不会因为平台的不同而产生任何的变化。而同一段字节码跑在不同实...

2018-03-17 11:11:05 1240

原创 数值信息的机器级存储

计算机中使用八位的块,或者说是「字节」,作为最小的寻址单元。你可以将整个存储器视作一个超大的「字节数组」,每个字节都有一个唯一的数字编号,这个编号就是所谓的地址,通过这个地址,我们可以唯一的确定一块数据。但是我们代码中定义的各种数值又是如何转换为二进制串存储在这些「字节」里面的呢?为什么两个整数相加之后的结果会变成负数?等等这些类似问题,其实都归咎于 计算机中是如何存储各种类型的数值的。只有理...

2018-03-14 10:59:20 252

原创 漫谈计算机编码

我们知道,在计算机内部,所有的信息都是以二进制形式进行存储。无论是字符,或是视频音频文件,最终都会对应到一串由 0 和 1 构成的数字串。所以从我们能看懂的人类信息转变为机器级别的二进制语言的过程就可以理解为一种编码的过程,自然,相反的过程就是所谓的解码的过程。可以这么说,所有的乱码都是源于解码方式与编码方式的不一致。就好像我用英文给你写了一封信(我要表达的信息用英文这种方式 [编码] 了),...

2018-03-09 15:04:04 487

原创 弄懂 JRE、JDK、JVM 之间的区别与联系

其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云。本篇不会讲述 jvm 底层是如何与不同的系统进行交互的,而主要理清楚三者之间的区别,搞清楚我们写的 xxx.java 文件是被谁编译,又被谁执行,为什么能够跨平台运行。首先,我们分别对这三者进行阐述。JVM :英文名称(Java Virtual Machine),就...

2018-03-05 11:39:28 69839 6

原创 基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)

我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序。由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容器。当然,jdk 中也为我们提供了基于红黑树的存储的 TreeMap 容器,它的内部元素是有序的,但是由于它内部通过红黑结点的各种变换来维持二叉搜索树的平衡,相对复杂,并且在并发环境下碍于 rebala

2017-12-22 10:38:33 2787

原创 为并发而生的 ConcurrentHashMap(Java 8)

HashMap 是我们日常最常见的一种容器,它以键值对的形式完成对数据的存储,但众所周知,它在高并发的情境下是不安全的。尤其是在 jdk 1.8 之前,rehash 的过程中采用头插法转移结点,高并发下,多个线程同时操作一条链表将直接导致闭链,死循环并占满 CPU。当然,jdk 1.8 以来,对 HashMap 的内部进行了很大的改进,采用数组+链表+红黑树来进行数据的存储。rehash 的过程也进

2017-12-13 09:26:03 363

原创 揭秘 HashMap 实现原理(Java 8)

HashMap 作为一种容器类型,无论你是否了解过其内部的实现原理,它的大名已经频频出现在各种互联网面试中了。从基本的使用角度来说,它很简单,但从其内部的实现来看(尤其是 Java 8 的改进以来),它又并非想象中那么容易。如果你一定要问了解其内部实现与否对于写程序究竟有多大影响,我不能给出一个确切的答案。但是作为一名合格程序员,对于这种遍地都在谈论的技术不应该不为所动。本篇文章主要从 jdk 1.

2017-12-07 09:14:19 255

原创 并发容器之写时拷贝的 List 和 Set

对于一个对象来说,我们为了保证它的并发性,通常会选择使用声明式加锁方式交由我们的 Java 虚拟机来完成自动的加锁和释放锁的操作,例如我们的 synchronized。也会选择使用显式锁机制来主动的控制加锁和释放锁的操作,例如我们的 ReentrantLock。但是对于容器这种经常发生读写操作的类型来说,频繁的加锁和释放锁必然是影响性能的,基于此,jdk 中为我们集成了很多适用于不同并发场景下的优秀

2017-12-02 11:29:57 213

原创 Maven 整合 SSH 框架

前面的一系列文章中,我们总结了三大框架:Struts2,Hibernate,Spring 的基本知识。本篇就姑且尝试着使用 Maven 这个项目构建工具来将这三个框架整合一起。说到这里,如果有对 Maven 还不熟悉的同学,此处推荐下面两个链接快速了解下,记得回来!Maven 是什么? 如何给小白说明 Maven 是什么? 我对 Maven 的理解就是,它是一个工具能提供两大主要功能,其一是依赖管

2017-11-25 10:10:29 401

原创 Hibernate框架学习之注解配置关系映射

上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下:单向的一对一关联关系映射单向的多对一的关联关系映射单向的一对多的关联关系映射单向的多对多的关联关系映射双向的一对一关联关系映射双向的一对多关联关系映射双向的多对多关联关系映射一、单向的一对一关联关系映射

2017-11-15 22:16:19 433

原创 Hibernate框架学习之注解映射实体类

前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射实体类的基本注解,此处做一点总结,后续文章将陆续更新使用注解的方式管理配置各种映射关联关系。本篇主要涉及以下内容:使用最基本的注解映射一个实体类使用注解映射属性使用注解映射主键其他特殊类型的属性映射一、

2017-11-13 15:40:57 417

原创 Spring框架学习之注解配置与AOP思想

上篇我们介绍了Spring中有关高级依赖关系配置的内容,也可以调用任意方法的返回值作为属性注入的值,它解决了Spring配置文件的动态性不足的缺点。而本篇,我们将介绍Spring的又一大核心思想,AOP,也就是面向切面编程。这是对面向对象编程的一个扩展,即便问世不长,但是已经成为当下最流行的编程思想之一。本篇主要涉及以下内容:Spring中的后置处理器“零配置”实现Bean的配置Spring

2017-11-08 20:44:46 235

原创 Spring框架学习之高级依赖关系配置(二)

紧接着上篇内容,本篇文章将主要介绍XML Schema的简化配置和使用SpEL表达式语言来优化我们的配置文件。一、基于XML Schema的简化配置方式 从Spring2.0以来,Spring支持使用XML Schema来简化配置。在以前的bean元素配置下,所有的属性注入都需要一个property元素,集合属性就需要更多的这样的元素,一旦项目庞大,整个配置文件将无法维护。XML Schema提供

2017-11-04 21:16:01 226

原创 Spring框架学习之高级依赖关系配置(一)

上篇文章我们对Spring做了初步的学习,了解了基本的依赖注入思想、学会简单的配置bean、能够使用Spring容器管理我们的bean实例等。但这还只是相对较浅显的内容,本篇将介绍bean的相关更高级的配置,主要涉及内容如下:三种方式配置Bean深入理解容器中的Bean管理Bean的生命周期高级的依赖关系配置使用XML Schema简化DTD配置使用SpEL表达式语言一、三种方式配置B

2017-11-04 11:02:15 296

原创 Spring框架学习之依赖注入

Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台。单从Spring的本身来说,它贯穿着整个表现层,业务层与持久层,它并没有取代其他框架的意思,而更多的是从整体上管理这些框架,降低系统的耦合性。系列文章将逐渐完成对Spring的学习,本篇首先学习它的一个核心机制:依赖注入,主要涉及内容如下:理解

2017-11-02 17:16:15 292 1

原创 面试中常用排序算法实现(Java)

当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果。所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容:排序相关的概念插入类排序交换类排序选择类排序归并排序算法实现一、排序相关的基本概念      排序其实是一个相当大的概念,主要分为两类:内部排序和外部排序。而我们通常所说的各种排序算法其实指的

2017-10-30 11:12:47 443

原创 Java并发编程之显式锁机制

我们之前介绍过synchronized关键字实现程序的原子性操作,它的内部也是一种加锁和解锁机制,是一种声明式的编程方式,我们只需要对方法或者代码块进行声明,Java内部帮我们在调用方法之前和结束时加锁和解锁。而我们本篇将要介绍的显式锁是一种手动式的实现方式,程序员控制锁的具体实现,虽然现在越来越趋向于使用synchronized直接实现原子操作,但是了解了Lock接口的具体实现机制将有助于我们对s

2017-10-26 10:57:37 208

原创 Java并发编程之原子变量

原子变量最主要的一个特点就是所有的操作都是原子的,synchronized关键字也可以做到对变量的原子操作。只是synchronized的成本相对较高,需要获取锁对象,释放锁对象,如果不能获取到锁,还需要阻塞在阻塞队列上进行等待。而如果单单只是为了解决对变量的原子操作,建议使用原子变量。关于原子变量的介绍,主要涉及以下内容:原子变量的基本概念通过AtomicInteger了解原子变量的基本使用

2017-10-22 13:04:59 174

原创 初识Hibernate之继承映射

前面的两篇文章中,我们介绍了两张表之间的各种相互关联映射关系,但往往我们也会遇到两张表甚至多张表之间共有着多个相同的字段。例如:如图,student表和teacher表共同具有id,name,age等字段,而我们的继承映射就是这样的一个思想,抽象出这些共有的字段为一张父表,让子表对其进行继承,这样就可以大大降低我们实体类代码的冗余性,增强其结构的完善。Hibernate支持以下三种数据表的生成策略:

2017-10-16 16:56:52 175

原创 初识Hibernate之关联映射(二)

上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多。本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种:基于外键的单向一对一关联映射基于主键的单向一对一关联映射单向多对多关联映射一、基于外键的单向一对一关联映射      具有一对一关联的表结构也是很常见的,比如:一个人对应于一张身份证。于是我们的person表会有一个外键关联到 idcard表的主键,只要这

2017-10-12 15:03:32 202

原创 初识Hibernate之关联映射(一)

上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作。但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本篇主要介绍的关联映射就是针对有着某种关联的多张表的各种操作,主要涉及内容如下:组合主键的映射组件的映射单向多对一的映射单向一对多的映射双向一对多的映射级联映射一、组合主键的映射操作

2017-10-07 10:51:50 234

原创 初识Hibernate之理解持久化类

上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射。但是至于其中的一些更加细节的地方并没有很详尽的解释,本篇则主要介绍Hibernate中的一个关键元素,持久化类。主要涉及以下一些内容:定义用作持久化类的基本要求持久化对象的几种不同状态及其相互之间的转换使用Hibernate完成对数据库的cru

2017-10-02 19:44:57 299

原创 Java并发之线程中断

前面的几篇文章主要介绍了线程的一些最基本的概念,包括线程的间的冲突及其解决办法,以及线程间的协作机制。本篇主要来学习下Java中对线程中断机制的实现。在我们的程序中经常会有一些不达到目的不会退出的线程,例如:我们有一个下载程序线程,该线程在没有下载成功之前是不会退出的,若此时用户觉得下载速度慢,不想下载了,这时就需要用到我们的线程中断机制了,告诉线程,你不要继续执行了,准备好退出吧。当然,线程在不同

2017-09-29 20:23:58 283

原创 初识Hibernate之环境搭建

相信所有做后端的程序员同行们,没有不知道Hibernate大名的。这是一个经典的轻量级Java EE持久层的解决方案,它使得我们程序员能以面向对象的思维操作传统的关系型数据库,这也是其存在的最大意义所在。当然也有很多人说Hibernate不就是封装了我们的JDBC实现对数据库的增删改查吗?,但其实Hibernate所做的事情远远不止于此,它是一个非常优秀的框架,甚至在目前依然占有很大一部分市场。下面

2017-09-25 17:33:36 331

原创 Java并发之线程间的协作

上篇文章我们介绍了synchronized关键字,使用它可以有效的解决我们多线程所带来的一些常见问题。例如:竞态条件,内存可见性等。并且,我们也说明了该关键字主要是一个加锁和释放锁的集成,所有为能获得锁的线程都将被阻塞在某个对象的阻塞队列上。而我们本篇将要介绍的线程间的协作则主要是对对象的另一个队列的使用(条件队列),所有因条件不满足而无法继续运行的线程都将在条件队列上进行等待。主要涉及内容如下:

2017-09-22 10:02:32 376

原创 Java并发之synchronized关键字

上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型的问题,针对它们,synchronized关键字可以很好的解决问题。对于synchronized的介绍主要包含以下一些内容:synchronized修饰实例方法synchronized修饰静态方法synchronized修饰代码块使用synch

2017-09-17 20:52:36 574

原创 Java并发之线程

在前面我们介绍的一些内容中,我们的程序都是一条执行流,一步一步的执行。但其实这种程序对我们计算机的资源的使用上是低效的。例如:我们有一个用于计算的程序,主程序计算数据,在计算的过程中每得到一个结果就需要将其保存到外部磁盘上,那么难道我们的主程序每次都要停止等待CPU将结果保存到磁盘之后,再继续完成计算工作吗?要知道磁盘的速度可是巨慢的(相对内存而言),我们如果能分一个线程去完成磁盘的写入工作,主线程

2017-09-14 17:11:35 182

原创 Git版本控制之多人协作

上篇文章我们主要简单的介绍了有关git的一些基本常识和一些简单的命令。但那终究是皮毛,我们使用git最主要的目的还是管理我们的项目,多人协作。本篇文章主要涉及以下两个大模块:分支的概念及原理远程仓库的使用一、分支      在介绍分支之前,我们首先先考虑为什么需要引入分支这个概念,究竟有哪些无法解决的问题,需要我们引入新的概念。在没有分支这个概念之前,我们对于一个项目的开发只有一个进度,但是

2017-08-17 14:54:05 533

原创 Git版本控制系统之基本使用

最早是通过接触著名的开源社区Github了解到Git的,但一直没有系统学习过。这次下定决心从头到尾系统的学一学,也将学习过程记录于此,供大家批驳。本篇文章先从以下几个方面简单了解一下Git:Git的简介以及Git与GitHub的关系Git的下载和初始化信息配置Git的基础指令及其含义一、Git的简介以及Git和GitHub的关系      首先Git是由Linux 的缔造者Linus To

2017-08-08 16:24:34 2068

原创 深入理解Java内部类

内部类就是定义在一个类中的另外一个类,是一种从属关系。在没有实际了解内部类之前,我始终困惑,为什么要在一个类中定义另外一个类,这不是增加代码结构复杂度么?现在才大致能知道这种设计的优势是大于其劣势的。比如,我们可以通过内部类解决类的单继承问题,外部类不能再继承的类可以交给内部类继承。我们可以通过定义内部类来实现一个类私属于一个类,实现更好的封装性。具体的我们接下来介绍,本文主要通过介绍内部类的四种不

2017-07-21 15:16:13 325

原创 详解Java API之正则表达式

正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的。在正则表达式中,主要有两种字符,一种描述的是普通的字符,另一种描述的是元字符。其中元字符是整个正则表达式的核心,并由它完成规则的制定工作。本篇文章主要从Java这门程序设计语言的角度理解正则表达式的应用,主要涉及以下内容:基本正则表达式的理论基础Java中用于正则表达式匹配的类几种常用的正则表达式使用实

2017-07-14 08:56:39 1091 2

原创 深入理解循环队列----循环数组实现ArrayDeque

我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势。此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构在频繁出队的情况下,会产生假溢出现象,导致数组使用效率降低,所以引入循环队列这种结构。本文将从以下两个大角度介绍循环队列这种数据结构:循环数组实现循环队列Java中具体实现容器类ArrayDeque

2017-06-09 21:29:18 5658 2

原创 深入理解Java常用类-----StringBuilder

上篇文章我们介绍过String这个常用类,知道了该类的内部其实是用的一个char数组表示一个字符串对象的,只是该字符数组被final修饰,一旦初始化就不能修改,但是对于经常做字符串修改操作的情况下,String类就需要不断创建新对象,性能极低。StringBuilder内部也是封装的一个字符数组,只不过该数组非final修饰,可以不断修改。所以对于一些经常需要修改字符串的情况,我们应当首选Strin

2017-06-01 11:08:48 307

使用 JSONObject 必备的所有 jar 包

使用 json 完成数据的格式化处理,这六个 jar 包是使用 json 所必备的。好用的话,点赞哈,各位老铁!

2018-01-22

空空如也

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

TA关注的人

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