
Java SE 进阶之路
Java SE 进阶之路专栏主要研究Java基础知识、Java源码和设计模式,从初级到高级不断总结、剖析内中逻辑,贯穿、覆盖整个Java知识面,在一步步完善、提高把自己的同时,把对Java的所学所思分享给大家。万丈高楼平地起,基础决定你的上限,让我们携手一起勇攀Java之巅...
书呆子Rico
不着急,慢慢来。
展开
-
双亲委派模型与线程上下文类加载器
SPI机制是什么,有哪些应用场景,又带来了哪些问题?双亲委派模型是Java推荐的类加载模型,但违背该模型的案例有哪些?为什么会违背,又是怎么解决这种case的?JDBC驱动加载的案例有哪些,SPI机制为它带来了哪些方便?线程上下文类加载器的作用与应用场景?原创 2019-04-14 11:39:54 · 16208 阅读 · 7 评论 -
Java8函数式接口与Lambda表达式
何为函数式接口?什么是lambda表达式,lambda表达式的本质?函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例。常用Java8内置的函数式接口 Function、Predicate、Consumer 和 Supplier 介绍。原创 2019-04-07 17:14:10 · 7935 阅读 · 4 评论 -
深入理解代理模式:静态代理与JDK动态代理
摘要: 代理模式为其他对象提供了一种代理以控制对这个对象的访问,具体实现包括两大类:静态代理和动态代理。Java动态代理机制的出现使得Java开发人员只需要简单地指定一组接口及委托类对象便能动态地获得代理类,并且其所生成的代理类在将所有的方法调用分派到委托对象上反射执行的同时,还可以对方法进行增强,这也正是Spring AOP的实现基础。通过阅读本文,读者将会对代理模式和Java动态...原创 2018-03-01 00:22:11 · 14225 阅读 · 4 评论 -
策略模式:封装变化与面向接口编程
在使用Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,这其实就是策略模式的应用。策略模式是封装变化和面向接口编程两个基本的面向对象设计思想具体应用,其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以灵活替换,使程序具有良好可扩展性。策略模式的灵魂就是策略算法是相同行为的不同实现。原创 2017-11-28 14:59:37 · 2485 阅读 · 0 评论 -
面试/笔试第五弹 —— Java面试问题集锦(下篇)
本文对面试过程中经常会被问到的一些关于Java基础问题进行了梳理和总结,包括 JVM虚拟机、常用容器、设计原则与模式以及Java语言特性等基础知识点,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。考虑到篇幅太长,现将 《Java面试问题集锦》 一文分为上下两篇:《面试/笔试第五弹 —— Java面试问题集锦(上篇)》和《面试/笔试第五弹 —— Java面试问题集锦(下篇)》。原创 2017-11-28 13:12:16 · 14940 阅读 · 15 评论 -
面试/笔试第五弹 —— Java面试问题集锦(上篇)
本文对面试过程中经常会被问到的一些关于Java基础问题进行了梳理和总结,包括 JVM虚拟机、常用容器、设计原则与模式以及Java语言特性等基础知识点,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。考虑到篇幅太长,现将 《Java面试问题集锦》 一文分为上下两篇:《面试/笔试第五弹 —— Java面试问题集锦(上篇)》和《面试/笔试第五弹 —— Java面试问题集锦(下篇)》。原创 2017-11-28 12:13:56 · 22926 阅读 · 9 评论 -
优雅地创建复杂对象 —— Builder 模式
当我们需要创建一个复杂的对象时,使用静态工厂或者构造器的方式就显得特别笨拙和丑陋,因为它们有个共同的局限性:它们都不能很好地扩展到大量的可选参数,也就是说,灵活性很差。那么,对于这样的类,我们应该如何创建对象呢?本文列举了三种解决办法:重叠构造器模式、JavaBeans模式和Builder模式,并通过具体实例对上述三种方法进行铺垫和对比,从而真正帮助读者理解Builder模式。原创 2017-10-20 18:52:50 · 22010 阅读 · 33 评论 -
Java代理模式及其应用
代理根据代理类的产生方式和时机分为静态代理和动态代理两种。代理类不仅可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部,而且还可以在符合开闭原则的前提下,对目标类进行进一步的增强。典型地,Spring AOP 是对JDK动态代理的经典应用。原创 2017-07-03 16:01:17 · 20035 阅读 · 5 评论 -
Map 综述(四):彻头彻尾理解 HashTable
Hashtable与HashMap都是Map族中较为常用的实现,也都是Java Collection Framework 的重要成员,它们的本质都是链表数组。本文深入JDK源码并从定义、构造、结构、存取等四个方面深入解读了Hashtable的底层结构与存储逻辑,并阐述了HashMap、Hashtable与ConcurrentHashMap三者间的联系与区别。原创 2017-06-04 22:55:42 · 10485 阅读 · 5 评论 -
Map 综述(三):彻头彻尾理解 ConcurrentHashMap
ConcurrentHashMap是J.U.C的重要成员,它是HashMap的一个线程安全的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。本文将结合Java内存模型和JDK源代码,剖析其高并发的具体实现机制,包括在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁的内在奥秘和原理。原创 2017-05-27 17:03:10 · 140887 阅读 · 68 评论 -
深入理解Java对象的创建过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。原创 2017-05-18 14:17:45 · 188350 阅读 · 86 评论 -
JVM类生命周期概述:加载时机与加载过程
一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述的类的各种信息,最终都需要加载到虚拟机中之后才能被运行和使用。事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制。本文概述了JVM加载类的时机和过程,并结合典型案例分析了类的初始化阶段,揭开了JVM类加载机制的神秘面纱。原创 2017-05-18 13:48:22 · 63915 阅读 · 61 评论 -
深入理解Java类加载器(一):Java类加载原理解析
每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。转载 2017-05-15 20:47:44 · 66510 阅读 · 44 评论 -
Map 综述(二):彻头彻尾理解 LinkedHashMap
HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap。由于LinkedHashMap是HashMap的子类,所以LinkedHashMap会拥有HashMap的所有特性。此外,LinkedHashMap可以很好的支持LRU算法。原创 2017-05-12 11:52:49 · 192347 阅读 · 52 评论 -
算法实战:根据Key或Value对Map进行排序及其应用
我们知道,Map是 Java Collection Framework 的重要成员,也是我们最常用的容器类之一。Map的实现多种多样,包括HashMap、LinkedHashMap等。但是,无论实际中使用哪种实现,我们在编程过程中常常会遇到诸如根据Key或Value对Map进行排序、保持Map插入顺序等问题,本文特别针对以上几个问题给出了具体解法,并分享华为一道与我们主题极为相关的笔试题。原创 2017-05-11 18:13:19 · 9556 阅读 · 6 评论 -
图解Java 垃圾回收机制
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。垃圾回收机制的引入有效地解决了内存的回收问题使得他们在编写程序的时候不再需要考虑内存管理。本文首先着重介绍了判断一个对象是否可以被回收的两种经典算法,并详述了四种典型的垃圾回收算法的基本思想及其直接应用——垃圾收集器,最后结合内存回收策略介绍了内存分配规则。原创 2017-05-05 17:11:17 · 84482 阅读 · 73 评论 -
JVM 内存模型概述
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些数据区域都有各自的用途,以及创建和销毁的时间,并且它们可以分为两种类型:线程共享的方法区和堆,线程私有的虚拟机栈、本地方法栈和程序计数器。在此基础上,我们探讨了在虚拟机中对象的创建和对象的访问定位等问题,并分析了Java虚拟机规范中异常产生的情况。原创 2017-05-04 21:29:46 · 58050 阅读 · 49 评论 -
Java中的 Scanner简述(企业笔试在线编程的输入控制)
最近进行企业在线笔试时,发现企业的笔试平台大都使用赛码网(虽然槽点很多),而且在线编程都需要使用Scanner来读取程序的输入,因此,笔者就在先辈们的成果上对Scanner做了一份全新的、详细的总结。我们知道,Scanner是Java5的新特征,主要功能是简化文本扫描。这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地,特此简述。原创 2017-04-05 16:55:04 · 5719 阅读 · 0 评论 -
Java知识图谱(附:阿里Java学习计划)
本文主要描绘了Java基础学习过程,给出Java知识结构图,以及阿里Java岗学习计划,对Java学习爱好者、准备及将要从事Java开发方面的同学大有裨益。转载 2017-04-04 11:06:41 · 29076 阅读 · 2 评论 -
与MVC框架解耦的OGNL:前世今生及其基本用法
虽然我们通过MVC框架而结缘OGNL,但它并未与MVC框架耦合在一起,而是一个以独立的库文件出现的功能强大的表达式语言,是字符串与Java对象之间沟通的桥梁。它通过简单一致的语法,可以存取Java对象树中的任意属性、调用Java对象树的方法,并自动实现必要的类型转化。本文首先概述了Ognl的前世今生,介绍了对Java对象属性的访问,静态、实例和构造方法的调用,容器的访问以及集合操作等内容,奠定学习OGNL的基础。原创 2017-04-03 08:11:17 · 7079 阅读 · 2 评论 -
责任链模式综述(基础篇)
本篇综述责任链模式的提出动机、原理结构、典型实现和应用场景,并结合实例展现了其灵活性和可插拔性。首先,结合生活中“打扑克”的例子引出了责任链模式动机和应用场景,然后我们概述了责任链模式的内涵和结构,即通过建立一条责任链来组织请求的处理者,请求将沿着链进行传递,而请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。最后给出了责任链模式的典型实现和并结合具体实例介绍其使用方式,以便体会其优点原创 2017-03-30 16:28:36 · 11675 阅读 · 14 评论 -
彻头彻尾理解单例模式与多线程
本文概述了单例模式产生动机,揭示了单例模式的本质和应用场景。然后我们给出了单例模式在单线程环境下的两种经典实现:饿汉式和懒汉式,但是饿汉式是线程安全的,而懒汉式是非线程安全的。在多线程环境下,我们特别介绍了五种方式来在多线程环境下创建线程安全的单例,使用synchronized方法、synchronized块、静态内部类、双重检查和ThreadLocal实现懒汉式单例,并给出实现效率高且线程安全的单例所需要注意的事项原创 2017-03-20 16:26:03 · 32836 阅读 · 33 评论 -
Map 综述(一):彻头彻尾理解 HashMap
摘要: HashMap是Map族中最为常用的一种,也是 Java Collection Framework 的重要成员。本文首先给出了 HashMap 的实质并概述了其与 Map、HashSet 的关系,紧接着给出了 HashMap 在 JDK 中的定义,并结合源码分析了其四种构造方式。最后,通过对 HashMap 的数据结构、实现原理、源码实现三个方面的剖析,深入到它底层 Hash 存储机...原创 2017-03-17 17:54:18 · 95493 阅读 · 77 评论 -
Java 访问权限控制:你真的了解 protected 关键字吗?
摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词;而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词。在Java中,类成员访问权限修饰词有四类:private,无(包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外)。特别地,很多Java书籍对protected可见性的介绍都比较笼统,本文重点说明了p...原创 2017-03-12 22:54:47 · 85891 阅读 · 79 评论 -
Java String 综述(下篇)
Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情。笔者为了还原String类的真实全貌,先分为上、下两篇博文来综述String类。笔者从Java内存模型展开,结合 JDK中String类的源码,特别就 String类的常量池、不可变性、对象的创建方式,String类与享元模式、正则表达式、克隆的关系和三大字符串类等几个方面进行全面、准确的阐述。原创 2017-03-09 23:02:48 · 8469 阅读 · 24 评论 -
深入理解享元模式
面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式通过共享技术实现相同或相似对象的重用提高系统资源的利用率。本文首先阐述了享元模式要解决的问题和解决问题的理念,然后从实现角度重点说明了该模式的本质,并进一步给出了其所包含的角色和组织结构。最后,给出了共享模式的应用实例和使用场景。原创 2017-02-13 10:37:26 · 26873 阅读 · 13 评论 -
Java 迭代器综述
迭代器模式是与集合共生共死的。一般来说,我们只要实现一个容器,就需要同时提供这个容器的迭代器。使用迭代器的好处是:封装容器的内部实现细节,对于不同的集合,可以提供统一的遍历方式,简化客户端的访问和获取容器内数据。在此基础上,我们可以使用 Iterator 完成对集合的遍历,此外,for 循环和foreach 语法也可以用于遍历集合类。ListIterator 是容器 List容器族特有的双向迭代器。原创 2016-12-06 15:40:27 · 3828 阅读 · 9 评论 -
Java Comparator Vs. Comparable
Comparable 和 Comparator 两个接口都是用来实现集合中元素的比较、排序的,其中,Comparable 位于包 java.lang 下,而 Comparator 位于包 java.util 下。此外,就代码可扩展性角度而言,使用实现 Comparator 接口的方式去实现容器内元素的排序会更好一些。原创 2016-12-05 22:09:22 · 1915 阅读 · 2 评论 -
Java 数组综述
本文主要阐述了 Java 中与数组的知识,主要从 数组与容器、数组的创建与初始化、数组与泛型、数组与可变参数列表、Arrays 工具类的实用功能 五个方面来对数组进行详细说明和总结。原创 2016-12-05 21:44:59 · 3053 阅读 · 1 评论 -
Java 内部类综述
多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承。但有时候,我们确实是需要实现多重继承。可幸的是,Java 提供了两种方式让我们曲折地来实现多重继承:接口和内部类。其中,内部类的一个及其重要的作用就是实现多重继承。除此之外,内部类还可以很好的实现隐藏(私有成员内部类)。内部类共有四种类型,即成员内部类、静态内部类、局部内部类和匿名内部类。原创 2016-11-20 22:07:18 · 11655 阅读 · 17 评论 -
Java Collection Framework : List
List 包括 List接口以及List接口的所有实现类。因为 List 接口实现了 Collection 接口,所以 List 接口拥有 Collection 接口提供的所有方法,同时又因为 List 是列表类型,所以 List 接口还提供了一些适合自身的方法。ArrayList 是一个动态数组,实现了数组动态扩容,随机访问效率高;LinkedList是一个双向链表,随机插入、随机删除效率高,可用作队列的实现。原创 2016-10-28 13:43:22 · 8589 阅读 · 10 评论 -
Java Collection Framework : Collection 接口
Java 容器类根接口Collection 的详细描述。原创 2016-10-27 18:58:48 · 5045 阅读 · 2 评论 -
Java 的抽象特性:抽象类与接口深度解析
对于面向对象编程来说,抽象是它的四大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。接口和抽象类为我们提供了一种将接口与实现分离的更加结构化的方法。总的来说,抽象类是一种模板,而接口是一种契约。原创 2016-10-27 11:56:48 · 6165 阅读 · 14 评论 -
Java 继承、多态与类的复用
本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍。首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同。紧接着,我们根据继承引入了多态,介绍了它的实现机制和具体应用。此外,为了更好地理解继承和多态,我们对final关键字进行了全面的介绍。在此基础上,我们介绍了Java中类的加载及初始化顺序。最后,我们对面向对象设计中三个十分重要的概念-重载、覆盖与隐藏进行了详细的说明。原创 2016-10-12 17:09:30 · 12828 阅读 · 8 评论 -
Java 原生类型与包装器类型深度剖析
本文对 Java 原生类型与包装器类型进行深度剖析,主要涉及以下四个方面:原生类型与包装器类型基础、字面值概念和种类、 基本类型的自动转型与强制转型和自动装箱与拆箱机制。原创 2016-09-24 16:05:33 · 5097 阅读 · 3 评论 -
Java String 综述(上篇)
Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情。笔者为了还原String类的真实全貌,先分为上、下两篇博文来综述String类。笔者从Java内存模型展开,结合 JDK中String类的源码,特别就 String类的常量池、不可变性、对象的创建方式,String类与享元模式、正则表达式、克隆的关系和三大字符串类等几个方面进行全面、准确的阐述。原创 2016-09-16 16:43:52 · 12003 阅读 · 32 评论 -
Java 异常模型综述
发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间编译器并不能找出所有的错误,余下的错误只有在运行期才能发现和解决,这类错误就是 Throwable。 这就需要错误源能够通过某种方式,把适当的信息传递给某个接收者,该接收者将知道如何正确的处理这个问题,这就是Java的错误报告机制 —— 异常机制。原创 2016-09-15 23:57:11 · 5440 阅读 · 13 评论 -
Java 中的 ==, equals 与 hashCode 的区别与联系
本文给出 Java 中关于判断相等的三种不同方式( ==, equals 与 hashCode )的区别与联系。原创 2016-09-07 23:10:46 · 38397 阅读 · 33 评论 -
Java 泛型(Generics) 综述
一. 引子一般的类和方法,只能使用具体类型:要么是基本类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。多态 算是一种泛化机制,但对代码的约束还是太强(要么继承父类,要么实现接口)。有许多原因促成了泛型的出现,而最重要的一个原因,就是为了 更安全友好的使用容器类 : 用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。...原创 2016-09-02 22:59:09 · 8387 阅读 · 18 评论