深入理解 JVM(一)Java的内存区域

JVM 作为 Java 学习的核心概念,承载了 Java,compile once run everywhere 的理念。理解 JVM 是每一个 Java DEV 的必修课。
Java 的虚拟机会在执行 Java 程序的过程中,把其所管理的内存划分为若干不同的数据区域。在本篇文章中,通过对《深入理解Java虚拟机 JVM高级特性与最佳实践》一书的阅读,做以下知识点的梳理与总结。

阅读更多

Java 8 中的函数式编程与流之总结

还记得在上一份工作面试时,被问到了是否熟练 Java8Scala, 我说不会。

Java 8 本已是一项不新的技术,虽然不复杂,却没掌握,的确是我不该。入职新东家后,纯正的互联网基因给了我短时间掌握和使用的机会。在学习了 《Java 8 in Action》,并经过一段时间实践后,在此做一次后知后觉的总结。

Java 8 于 2014年 3月发布,主要的新特性我认为就是两个:流处理、函数式编程。

函数式编程是一个古老而久远的话题。一句话总结,就是函数被作为一等公民,方法可以直接传递函数,函数只有输入输出,而不对外界造成影响(无共享的可变数据)。例如方法 getBetterApple(Apple A, Apple B, Comparator<Apple> comp) 中的 Comparator<Apple> 就是一个函数,此处定义了一个方法实现获得一个更好的苹果,但具体什么是“好”的这个评判标准,则可以通过传入函数来改变,例如按照大小、颜色、水分等等来比较。为了适应函数式编程,Java 8 对原有的接口做了相应改变,允许了在 interface 中定义 default 默认方法

,是针对日常工程中最为常见的集合制造与处理过程,其基础是函数式编程。Java8 提供了过滤、映射、循环等常用操作的 Stream API,并支持开发者自定义实现。并在流基础上,提供了多线程封装,只需要将 stream() 改为 parallelStream() 就完成了从单线程向多线程的转变,非常简单,不过其中也有些细节(坑),下文会展开介绍。

除了以上两点,Java 8 还提供了 Optional 、异步 API、新的时间处理API 等。

阅读更多

关于 Maven (三) POM.xml 配置详解

POM 代表项目对象模型。它是工作在 Maven 的基本单位。这是一个 XML 文件。它始终保存在该项目基本目录中的 pom.xml 文件。
POM 包含的项目是使用 Maven 来构建的,以及它也包含各种配置信息。
POM 也包含了目标和插件。在执行任务或目标时,Maven 会使用当前目录中的 POM。它读取POM,得到所需要的配置信息,然后执行目标。

阅读更多

关于 Maven (一)介绍入门与安装

每次对一项新技术,都是从一个陌生名词开始的。记不起什么时候看到的 Maven 这词,觉得高大上(在IT这行混久了,一旦不学习,看什么都觉得高大上了),后来终于运用到了实践当中,问了下厂,发觉自己落伍太久了。抽个没加班的日子,把这个给梳理一下。

阅读更多

聊聊几种常用的 Java 构建工具: Maven, Ant+ivy 与 Gradle 之比较

在前公司开发时,为公司项目引入了 Maven,摆脱了无止境的 jar 管理,方便了工程打包和发布。当时的项目,由于我拥有着绝对的主导权,并且项目本身工程量不大。Maven 运行的非常好,迁移转交给同事,基本上能克服原有的复杂的环境配置和依赖管理,实现顺利的交接。
近了新的公司,发现这边对于项目构建,采用的是 Ant+ivy 方案,这么选择固然有其历史原因,作为后来者,想要改变原有的技术方案,是十分困难的(由于变更风险巨大,基本不可能实现),因此,我不得不去学习这种新的构建方案。

之前仅学习过使用过 Maven,在了解了 Ant 后发现了其诸多的优点。由于对 Maven、Ant+ivy、Gradle 这几种构建又存在着一些困惑,故在此做一个梳理,区分下优劣,仔细了解下应用场景。
几种构建方法,没有绝对的好坏之分,必须要针对引用场景具体问题具体分析

阅读更多

探索 Java 中 String 的本质,从 char 说起

String 类可以认为是 Java 语言中最为常用的类了,对于 String 的理解更是 Java 面试题的常客。
但作为一个 Java 程序员,对于 String 是否足够了解了呢?
本篇文章将对 String的存储,使用做一个详细的探讨。


先来简单介绍下 StringString是 JDK 提供的位于 java.lang 中的基础类,但区别于 byte,short,int,long,char,boolean,float,double这些基本类型,String不是基本数据类型,而是一个类。
因为是类,实例化的String 对象的空值为 null,但String是如此常用,于是 JDK 对其有特殊的优化。

阅读更多

Java 异常踩坑总结与最佳实践


static final 实例

enum 的构造

构造方法

初始化顺序

EnumMap 和 EnumSet

总结


参考资料

[1] 《Java 编程思想》

Java 异常踩坑总结与最佳实践

Java 编程时,总会遇到可预见或不可预知的异常情况,程序如何处理好这些异常是保证程序稳定健壮的无比重要。对于 Java,通过 Throwable 类的众多子类来描述程序遇到的各类异常,主要分为 ExceptionError

  • Error: 一般指虚拟机相关问题,如系统崩溃,内存不足,调用栈溢出等严重问题,需要程序终止解决。
  • Exception:程序可预测解决的异常,如访问异常文件导致的 IO 异常,或者用户自定义的异常,此类异常通过合理处理,可不造成程序中断,保障了程序健壮性。Exception 中最主要的,又分为:
    • 检查异常(checked exception):若抛出此异常,方法后必须强制以 throws 关键字进行抛出声明,例如 IOException
    • 非检查异常(unchecked exception):无需抛出声明,**RuntimeException 均属于非检查异常**,例如 NullPointerException, IndexOutOfBoundsException 等。

对于如何处理异常,Java 采用的方法就是 try...catch...finallytry 所括代码,称为监控区域(guarded region),该区域内所有代码抛出的异常,会被 catch 中匹配的 Exception 分支所捕获,此处父类可捕获子类异常,最后在 finally 中处理收尾。

try...catch...finally 本身不难理解,但原理上也有一些需要注意的地方,下文也总结了些使用技巧。

阅读更多

JDK 容器深入解析

在 Java 编程中,常常需要一些数据结构用来保存我们所需要的数据。在 C /CPP 中,只提供数组和链表的实现,但诸如一些常用的稍复杂的数据结构,例如HeapStackQueueHash 表等,都需要自己编码实现,虽然灵活度很高,但在一些常用的结构上再浪费时间,就没有必要了。而 JDK ,则提供了一个不少实用的容器,供开发者使用,本文将详细解析一下 JDK 中提供的容器。

阅读更多