设计模式之-单例模式

文章转自:https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/singleton.html

背景

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。

如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。

一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。

设计模式之-策略模式

文章转自:https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html

背景

  • 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
  • 在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。
  • 在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。
  • 除了提供专门的查找算法类之外,还可以在客户端程序中直接包含算法代码,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
  • 为了解决这些问题,可以定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法,在这里,每一个封装算法的类我们都可以称之为策略(Strategy),为了保证这些策略的一致性,一般会用一个抽象的策略类来做算法的定义,而具体每种算法则对应于一个具体策略类

java中HashMap的最大容量解析

这是一个面试题引起的。面试官问:Java中HashMap最多能存储多少个键值对?记得当时的回答是Integer.Max_VALUE.这是由于记得size()方法返回的值是int。那HashMap中究竟能存储多少个键值对呢?我们来一探究竟。

以下代码基于JDK7

素数相关

素数定义

素数(质数):只有1和它本身两个因数的正整数叫做素数(质数)。例如,7是一个素数因为它只有1和7两个因数. 注意:1不是素数,因为它只有一个因数.

求两个整数的最大公约数

最大公约数定义

最大公约数(最大公因数或最大公因子,英语:Greatest Common Divisor,简写为GCD)是几个大于0的整数公有约数中最大的一个。例如,16和40公约数有:1、2、4、8, 其中最大的是8,8就是16和40的最大公约数。找出最大公约数有助于将分数约简到最简形式。

ThreadLocal正解

写在前面的话

  1. 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的!一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。

  2. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,每个线程都有这样一个map,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。

  3. 如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。

  4. ThreadLocal的本意是用来解决当前线程的执行栈中参数传递问题的, 如果一个参数在当前线程调用栈的每个调用中都需要, 不需要将该参数层层传递到每个方法中.

java Reference 详解

概述

Java中一共有四种引用类型, 强引用(StrongReference), 软引用(SoftReference), 弱引用(WeakReference), 虚引用(PhantomReference); 每个引用对象内部都有一个对应的引用对象Referent和一个ReferenceQueue. 这四个引用类类型的父类是Reference. Reference 是一个抽象类,它定义了所有引用对象共同的操作方法,因为引用对象和垃圾回收操作关系密切,因此一般不需要直接实现该类.

|