Java ABC
文章平均质量分 96
书呆子Rico
不着急,慢慢来。
展开
-
Java 异常模型综述
发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间编译器并不能找出所有的错误,余下的错误只有在运行期才能发现和解决,这类错误就是 Throwable。 这就需要错误源能够通过某种方式,把适当的信息传递给某个接收者,该接收者将知道如何正确的处理这个问题,这就是Java的错误报告机制 —— 异常机制。原创 2016-09-15 23:57:11 · 5166 阅读 · 13 评论 -
Map 综述(三):彻头彻尾理解 ConcurrentHashMap
ConcurrentHashMap是J.U.C的重要成员,它是HashMap的一个线程安全的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。本文将结合Java内存模型和JDK源代码,剖析其高并发的具体实现机制,包括在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁的内在奥秘和原理。原创 2017-05-27 17:03:10 · 136384 阅读 · 68 评论 -
图解Java 垃圾回收机制
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。垃圾回收机制的引入有效地解决了内存的回收问题使得他们在编写程序的时候不再需要考虑内存管理。本文首先着重介绍了判断一个对象是否可以被回收的两种经典算法,并详述了四种典型的垃圾回收算法的基本思想及其直接应用——垃圾收集器,最后结合内存回收策略介绍了内存分配规则。原创 2017-05-05 17:11:17 · 83649 阅读 · 73 评论 -
Java Comparator Vs. Comparable
Comparable 和 Comparator 两个接口都是用来实现集合中元素的比较、排序的,其中,Comparable 位于包 java.lang 下,而 Comparator 位于包 java.util 下。此外,就代码可扩展性角度而言,使用实现 Comparator 接口的方式去实现容器内元素的排序会更好一些。原创 2016-12-05 22:09:22 · 1829 阅读 · 2 评论 -
Java代理模式及其应用
代理根据代理类的产生方式和时机分为静态代理和动态代理两种。代理类不仅可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部,而且还可以在符合开闭原则的前提下,对目标类进行进一步的增强。典型地,Spring AOP 是对JDK动态代理的经典应用。原创 2017-07-03 16:01:17 · 19675 阅读 · 5 评论 -
JVM类生命周期概述:加载时机与加载过程
一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述的类的各种信息,最终都需要加载到虚拟机中之后才能被运行和使用。事实上,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的类加载机制。本文概述了JVM加载类的时机和过程,并结合典型案例分析了类的初始化阶段,揭开了JVM类加载机制的神秘面纱。原创 2017-05-18 13:48:22 · 62414 阅读 · 61 评论 -
优雅地创建复杂对象 —— Builder 模式
当我们需要创建一个复杂的对象时,使用静态工厂或者构造器的方式就显得特别笨拙和丑陋,因为它们有个共同的局限性:它们都不能很好地扩展到大量的可选参数,也就是说,灵活性很差。那么,对于这样的类,我们应该如何创建对象呢?本文列举了三种解决办法:重叠构造器模式、JavaBeans模式和Builder模式,并通过具体实例对上述三种方法进行铺垫和对比,从而真正帮助读者理解Builder模式。原创 2017-10-20 18:52:50 · 20775 阅读 · 33 评论 -
Map 综述(二):彻头彻尾理解 LinkedHashMap
HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap。由于LinkedHashMap是HashMap的子类,所以LinkedHashMap会拥有HashMap的所有特性。此外,LinkedHashMap可以很好的支持LRU算法。原创 2017-05-12 11:52:49 · 190400 阅读 · 52 评论 -
面试/笔试第四弹 —— 多线程面试问题集锦
本文对面试/笔试过程中经常会被问到的一些关于并发编程的问题进行了梳理和总结,包括线程池、并发控制锁、并发容器和队列同步器等基础知识点,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。关于这块内容的初步了解和掌握,大家可以阅读《Java并发编程的艺术》、《《Java多线程编程核心技术》和《Java并发编程实战》三本书,重点掌握J.U.C并发框架。原创 2017-10-22 20:55:14 · 20375 阅读 · 13 评论 -
面试/笔试第五弹 —— Java面试问题集锦(上篇)
本文对面试过程中经常会被问到的一些关于Java基础问题进行了梳理和总结,包括 JVM虚拟机、常用容器、设计原则与模式以及Java语言特性等基础知识点,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。考虑到篇幅太长,现将 《Java面试问题集锦》 一文分为上下两篇:《面试/笔试第五弹 —— Java面试问题集锦(上篇)》和《面试/笔试第五弹 —— Java面试问题集锦(下篇)》。原创 2017-11-28 12:13:56 · 22757 阅读 · 9 评论 -
面试/笔试第五弹 —— Java面试问题集锦(下篇)
本文对面试过程中经常会被问到的一些关于Java基础问题进行了梳理和总结,包括 JVM虚拟机、常用容器、设计原则与模式以及Java语言特性等基础知识点,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。考虑到篇幅太长,现将 《Java面试问题集锦》 一文分为上下两篇:《面试/笔试第五弹 —— Java面试问题集锦(上篇)》和《面试/笔试第五弹 —— Java面试问题集锦(下篇)》。原创 2017-11-28 13:12:16 · 14782 阅读 · 15 评论 -
Java8中的Stream API详解:Stream的背景及使用
摘要: Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来...转载 2018-03-15 02:47:54 · 77328 阅读 · 21 评论 -
Java 泛型(Generics) 综述
一. 引子一般的类和方法,只能使用具体类型:要么是基本类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。多态 算是一种泛化机制,但对代码的约束还是太强(要么继承父类,要么实现接口)。有许多原因促成了泛型的出现,而最重要的一个原因,就是为了 更安全友好的使用容器类 : 用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。...原创 2016-09-02 22:59:09 · 8216 阅读 · 18 评论 -
深入理解代理模式:静态代理与JDK动态代理
摘要: 代理模式为其他对象提供了一种代理以控制对这个对象的访问,具体实现包括两大类:静态代理和动态代理。Java动态代理机制的出现使得Java开发人员只需要简单地指定一组接口及委托类对象便能动态地获得代理类,并且其所生成的代理类在将所有的方法调用分派到委托对象上反射执行的同时,还可以对方法进行增强,这也正是Spring AOP的实现基础。通过阅读本文,读者将会对代理模式和Java动态...原创 2018-03-01 00:22:11 · 13931 阅读 · 4 评论 -
RPC框架原理简述:从实现一个简易RPCFramework说起
摘要: 本文阐述了RPC框架与远程调用的产生背景,介绍了RPC的基本概念和使用背景,之后手动实现了简易的RPC框架并佐以实例进行演示,以便让各位看官对RPC有一个感性、清晰和完整的认识,最后讨论了RPC框架几个较为重要问题。总之,RPC框架的精髓在于动态代理和反射,通过它们使得远程调用“本地化”,对用户透明且友好。版权声明:本文原创作者:书呆子Rico 作者博客地址:http:...原创 2018-03-05 00:57:35 · 10801 阅读 · 11 评论 -
深入剖析Java线程池与Executor框架(一) : 任务的抽象
摘要: 在《Java 并发:并发背景》一文中,从操作系统演进的角度解释了进程与线程出现的背景与原因。简单地说,进程实现了操作系统级别的并发,线程实现了进程级别的并发。通过使用多个线程来执行任务,不仅可以极大提高资源的利用率,而且可以满足很多场景下的实时性要求,实现任务并发、异步执行的效果。 事实上,线程扮演的是Worker的角色,是Task的执行者。从Java的角度来看,Thread实...原创 2018-04-07 23:04:41 · 4064 阅读 · 6 评论 -
Map 综述(四):彻头彻尾理解 HashTable
Hashtable与HashMap都是Map族中较为常用的实现,也都是Java Collection Framework 的重要成员,它们的本质都是链表数组。本文深入JDK源码并从定义、构造、结构、存取等四个方面深入解读了Hashtable的底层结构与存储逻辑,并阐述了HashMap、Hashtable与ConcurrentHashMap三者间的联系与区别。原创 2017-06-04 22:55:42 · 10260 阅读 · 5 评论 -
深入理解Java对象的创建过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。原创 2017-05-18 14:17:45 · 184896 阅读 · 85 评论 -
Java 内部类综述
多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承。但有时候,我们确实是需要实现多重继承。可幸的是,Java 提供了两种方式让我们曲折地来实现多重继承:接口和内部类。其中,内部类的一个及其重要的作用就是实现多重继承。除此之外,内部类还可以很好的实现隐藏(私有成员内部类)。内部类共有四种类型,即成员内部类、静态内部类、局部内部类和匿名内部类。原创 2016-11-20 22:07:18 · 11376 阅读 · 17 评论 -
Java 继承、多态与类的复用
本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍。首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同。紧接着,我们根据继承引入了多态,介绍了它的实现机制和具体应用。此外,为了更好地理解继承和多态,我们对final关键字进行了全面的介绍。在此基础上,我们介绍了Java中类的加载及初始化顺序。最后,我们对面向对象设计中三个十分重要的概念-重载、覆盖与隐藏进行了详细的说明。原创 2016-10-12 17:09:30 · 12414 阅读 · 8 评论 -
Java 数组综述
本文主要阐述了 Java 中与数组的知识,主要从 数组与容器、数组的创建与初始化、数组与泛型、数组与可变参数列表、Arrays 工具类的实用功能 五个方面来对数组进行详细说明和总结。原创 2016-12-05 21:44:59 · 2984 阅读 · 1 评论 -
Java 原生类型与包装器类型深度剖析
本文对 Java 原生类型与包装器类型进行深度剖析,主要涉及以下四个方面:原生类型与包装器类型基础、字面值概念和种类、 基本类型的自动转型与强制转型和自动装箱与拆箱机制。原创 2016-09-24 16:05:33 · 4958 阅读 · 3 评论 -
Java 的抽象特性:抽象类与接口深度解析
对于面向对象编程来说,抽象是它的四大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。接口和抽象类为我们提供了一种将接口与实现分离的更加结构化的方法。总的来说,抽象类是一种模板,而接口是一种契约。原创 2016-10-27 11:56:48 · 5921 阅读 · 14 评论 -
Java 中的 ==, equals 与 hashCode 的区别与联系
本文给出 Java 中关于判断相等的三种不同方式( ==, equals 与 hashCode )的区别与联系。原创 2016-09-07 23:10:46 · 37728 阅读 · 33 评论 -
Java 迭代器综述
迭代器模式是与集合共生共死的。一般来说,我们只要实现一个容器,就需要同时提供这个容器的迭代器。使用迭代器的好处是:封装容器的内部实现细节,对于不同的集合,可以提供统一的遍历方式,简化客户端的访问和获取容器内数据。在此基础上,我们可以使用 Iterator 完成对集合的遍历,此外,for 循环和foreach 语法也可以用于遍历集合类。ListIterator 是容器 List容器族特有的双向迭代器。原创 2016-12-06 15:40:27 · 3744 阅读 · 9 评论 -
Java String 综述(下篇)
Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情。笔者为了还原String类的真实全貌,先分为上、下两篇博文来综述String类。笔者从Java内存模型展开,结合 JDK中String类的源码,特别就 String类的常量池、不可变性、对象的创建方式,String类与享元模式、正则表达式、克隆的关系和三大字符串类等几个方面进行全面、准确的阐述。原创 2017-03-09 23:02:48 · 8308 阅读 · 24 评论 -
Java 访问权限控制:你真的了解 protected 关键字吗?
摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词;而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词。在Java中,类成员访问权限修饰词有四类:private,无(包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外)。特别地,很多Java书籍对protected可见性的介绍都比较笼统,本文重点说明了p...原创 2017-03-12 22:54:47 · 83478 阅读 · 79 评论 -
Java知识图谱(附:阿里Java学习计划)
本文主要描绘了Java基础学习过程,给出Java知识结构图,以及阿里Java岗学习计划,对Java学习爱好者、准备及将要从事Java开发方面的同学大有裨益。转载 2017-04-04 11:06:41 · 28696 阅读 · 2 评论 -
Java中的 Scanner简述(企业笔试在线编程的输入控制)
最近进行企业在线笔试时,发现企业的笔试平台大都使用赛码网(虽然槽点很多),而且在线编程都需要使用Scanner来读取程序的输入,因此,笔者就在先辈们的成果上对Scanner做了一份全新的、详细的总结。我们知道,Scanner是Java5的新特征,主要功能是简化文本扫描。这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地,特此简述。原创 2017-04-05 16:55:04 · 5644 阅读 · 0 评论 -
Java String 综述(上篇)
Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情。笔者为了还原String类的真实全貌,先分为上、下两篇博文来综述String类。笔者从Java内存模型展开,结合 JDK中String类的源码,特别就 String类的常量池、不可变性、对象的创建方式,String类与享元模式、正则表达式、克隆的关系和三大字符串类等几个方面进行全面、准确的阐述。原创 2016-09-16 16:43:52 · 11869 阅读 · 32 评论 -
JVM 内存模型概述
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些数据区域都有各自的用途,以及创建和销毁的时间,并且它们可以分为两种类型:线程共享的方法区和堆,线程私有的虚拟机栈、本地方法栈和程序计数器。在此基础上,我们探讨了在虚拟机中对象的创建和对象的访问定位等问题,并分析了Java虚拟机规范中异常产生的情况。原创 2017-05-04 21:29:46 · 57452 阅读 · 49 评论 -
双亲委派模型与线程上下文类加载器
SPI机制是什么,有哪些应用场景,又带来了哪些问题?双亲委派模型是Java推荐的类加载模型,但违背该模型的案例有哪些?为什么会违背,又是怎么解决这种case的?JDBC驱动加载的案例有哪些,SPI机制为它带来了哪些方便?线程上下文类加载器的作用与应用场景?原创 2019-04-14 11:39:54 · 15885 阅读 · 7 评论 -
深入理解Java类加载器(一):Java类加载原理解析
每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。转载 2017-05-15 20:47:44 · 65881 阅读 · 44 评论 -
Java8函数式接口与Lambda表达式
何为函数式接口?什么是lambda表达式,lambda表达式的本质?函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例。常用Java8内置的函数式接口 Function、Predicate、Consumer 和 Supplier 介绍。原创 2019-04-07 17:14:10 · 7356 阅读 · 4 评论