随笔分类 - Java
摘要:布隆过滤器主要用于判断一个元素是否在一个集合中,它可以使用一个位数组简洁的表示一个数组。它的空间效率和查询时间远远超过一般的算法,但是它存在一定的误判的概率,适用于容忍误判的场景。如果布隆过滤器判断元素存在于一个集合中,那么是可能存在在集合中(称之为误判);如果它判断元素不存在一个集合中,那么一定不
阅读全文
摘要:线程池优势 降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗; 提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行; 方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程
阅读全文
摘要:ReentrantLock VS ReentrantReadWriteLock VS StampedLock 锁 特性 是否支持重入 是否支持锁升级 是否支持Condition 适合场景 ReentrantLock 独占可重入 是 无 是 纯写入 ReentrantReadWriteLock 非独占
阅读全文
摘要:ThreadLocal类顾名思义可以理解为线程本地变量。也就是说如果定义了一个ThreadLocal,每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的。它提供了一种将可变数据通过每个线程有自己的独立副本从而实现线程封闭的机制。Thread类有一个类型为ThreadLocal.
阅读全文
摘要:并发编程中的三个概念 原子性:即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 可见性:可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 有序性:即程序执行的顺序按照代码的先后顺序执行。 内存模型JMM以及共享变
阅读全文
摘要:synchronized是Java中的关键字,是一种同步锁,按类型可以分为同步方法和同步代码块。 非同步实例方法&同步实例方法: 非同步实例方法: public class TestSync { public static void main(String[] args) throws Interr
阅读全文
摘要:进程vs线程 在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。 某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
阅读全文
摘要:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。 1.责任链模式(Chain of Responsibility) 为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。
阅读全文
摘要:用于描述如何将类或对象按某种布局组成更大的结构,关注类和对象的组合。 1.适配器模式(Adapter) 作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器,将内存卡
阅读全文
摘要:创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵
阅读全文
摘要:单字符匹配 字符 作用 描述 . 任意字符匹配 \. 匹配除换行符 \n 之外的任何单字符 例如a.c可以匹配"abc",但不能匹配"ac"、"a&&c" s 空格字符匹配 \s 匹配一个空格字符,包括空格、制表符、换页符等等,等价于 [ \f\n\r\t\v] 例如 a\sc 可以匹配"a c",
阅读全文
摘要:注解分类 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以
阅读全文
摘要:1.反射概念 Java中的反射机制是指在运行状态中,对于任意一个类,能够动态获取这个类中的属性和方法;对于任意一个对象,都能够任意调用它的属性和方法。这种动态获取类的信息以及动态调用对象方法的功能称为Java的反射机制。 2.反射的实现方式 方法一:直接通过一个class的静态变量class获取 C
阅读全文
摘要:语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。 语法糖的存在主要是方便开发人员使用。但其实
阅读全文
摘要:线程安全 当多个线程同时访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。 按照线程安全的强弱排序,java语言中各种操作共享的数据分为以下五类:不可变,绝对线
阅读全文
摘要:泛型定义 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 一些常用的泛型类型变量: E:元素(Element
阅读全文
摘要:旧版API缺陷 1.设计缺陷 :比如Calendar类的月份是从0开始计算 2.非线程安全:java.util.Date 是非线程安全的,所有的日期类都是可变的 3.时区处理麻烦:日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.Time
阅读全文
摘要:创建Optional对象 1.声明一个空的Optional:通过静态工厂方法Optional.empty,创建一个空的Optional对象 2.依据一个非空值创建Optional:Optional.of(obj)要求传入的 obj 不能是 null,否则会抛出NullPointerException
阅读全文
摘要:Future Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。要使用Future,通只需要将耗时操作封装在一个Callable对象中,再将它提交给ExecutorService。 ExecutorService(线程池)体系结构: 一、线程
阅读全文
摘要:流与集合 集合是一个内存中的数据结构,集合中的每个元素都得先计算出来才能添加到集合中。流与集合有以下不同: 无存储. stream不是一种数据结构,它只是某种数据源的一个视图 不可修改.对stream的任何修改都不会影响背后的数据源 可消费性.stream只能被消费一次. Collection:集合
阅读全文