一周一篇Java概念
文章平均质量分 77
学好java基础,学好java的语言特性,无论什么代码都能看的清清楚楚。
QuinnNorris
蚂蚁金服 - 开发工程师
展开
-
JUnit和mockito
我们都希望写出没bug的代码,那么测试就是必不可少的一个环节。在CI持续集成并发布我们的代码的过程中,有很多测试方法,可以提高我们代码的覆盖率,查缺补漏。单元测试单元测试用于测试最小的功能单元,这是各种测试中范围最小的一种。在单元测试中,我们一般会测试一个方法以其为单位,检测是否能返回我们期望的结果。理论上,单元测试应该在内存中进行,被测试的代码在理论上不应该和其他外部信息进行交互,这些外...原创 2018-12-03 22:15:15 · 3440 阅读 · 0 评论 -
代码覆盖率
代码覆盖率指我们运行所有项目中的测试方法后,能够执行的语句和所有语句的比值。更具体一些,我们用行覆盖率举例,行覆盖率应该等于运行所有测试方法能够执行到的行数除以代码所有能够执行的行数。客观看待代码覆盖率简单的说,覆盖率是指我们代码在测试中能够被覆盖的程度。所以,覆盖率理论上来说越高越好,代码覆盖率高说明我们的每一段代码都经过了测试,得到了预期的答案。但我们也不应该太纠结于代码覆盖率的高低,...原创 2018-11-28 17:15:35 · 8302 阅读 · 0 评论 -
JVM内存管理调优
运行时数据区是JVM把自己管理的内存部分抽象出来的模型,抽象出来的不同的数据区域,以便于管理,具体有程序计数器、堆、栈、本地方法栈和方法区这几个区域。这几个区域有的会产生内存溢出的问题,在实际生产中会导致服务不可用,所以确保机器的鲁棒性,JVM调优是不可忽视的一环。对象回收判断在进行JVM调优之前,我们要先对对象回收判断和垃圾回收方式有所了解,才能针对他们的特点考虑如何进行回收。如何判断对...原创 2018-08-21 13:00:57 · 650 阅读 · 0 评论 -
如何设计大量数据的查重和去重
至少在现阶段内存和CPU的执行效率在固定时间内是有限的,大量的数据的查重和去重处理不可能同时在内存中进行。就像外部排序算法和内部排序算法差别很大,遇到此类大量数据查重问题对算法进行设计是有必要的。ConcurrentHashMap数据量不大的时候可以采用concurrentHashMap来操作,在内存中对数据进行同步的CRUD操作。这种做法的好处是很明显的,逻辑处理很简单易懂。但是会产...原创 2018-08-13 19:45:56 · 8246 阅读 · 1 评论 -
对于不同任务的线程池设计方案
池化技术的应用很广泛,比如线程池、连接池等。在业务有需要的地方建池,将宝贵的资源重复利用,从而提升效率和性能。ThreadPoolExecutor是JAVA提供的一种线程池技术,通过使用它,我们可以很方便的建立池化技术的应用很广泛,比如线程池、连接池等。在业务有需要的地方建池,将宝贵的资源重复利用,从而提升效率和性能。ThreadPoolExecutor是JAVA提供的一种线程池技术,通过使用...原创 2018-08-13 19:48:01 · 3127 阅读 · 1 评论 -
JAVA知识点全总结——(九)系统业务开发
上一篇:JAVA知识点全总结——(八)算法与数据结构9. 系统业务开发9.1 设置系统缓存可以使用缓存做数据库的一个缓冲,如果有大量的数据直接连进数据库肯定导致异常,先把数据存放在缓存中,在用一些算法进行处理,确保安全性,可靠性。9.2 进行应用降级降级是指将一些非核心的服务端功能有限制的降级,这样可以释放计算机的资源,用来保证核心的业务能够顺利进行。降级的话可以有很多个级别,...原创 2018-07-25 18:25:19 · 766 阅读 · 0 评论 -
JAVA知识点全总结——(八)算法与数据结构
上一篇:JAVA知识点全总结——(七)设计模式8. 算法与数据结构8.1 排序算法冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序8.2 查找算法遍历查找 二分查找 二叉树查找 红黑树查找 跳表查找8.3 拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,...原创 2018-07-25 18:24:00 · 1049 阅读 · 1 评论 -
JAVA知识点全总结——(七)设计模式
上一篇:JAVA知识点全总结——(六)框架工具7. 设计模式7.1 单例模式//线程安全,惰性加载public class Singleton { private static volatile Singleton singleton; private Singleton() { } public Singleton ...原创 2018-07-25 18:10:34 · 670 阅读 · 0 评论 -
JAVA知识点全总结——(六)框架工具
上一篇:JAVA知识点全总结——(五)网络6. 框架工具6.1 springSpring是一个开源框架,主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring的核心是控制反转(IoC)和面向切面(AOP),用这两种技术完成了事务管理,对象配置等工作,而且对一些其他开源框架提供了很好的支持。简单的说,springB...原创 2018-07-25 17:29:46 · 736 阅读 · 0 评论 -
JAVA知识点全总结——(五)网络
上一篇:JAVA知识点全总结——(四)数据库5. 网络5.1 OSI七层协议OSI七层协议分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。物理层是我们传输信息的一些介质,比如双绞线、网线等 数据链路层是对数据传输最基本的协议,比如数据传输的0和1按照什么方式进行理解,传输机制是全双工还是半双工 网络层是定义IP的选址,和一些路由的规则,怎么讲信息发送给网络上...原创 2018-07-25 15:42:41 · 746 阅读 · 0 评论 -
JAVA知识点全总结——(四)数据库
上一篇:JAVA知识点全总结——(三)多线程与并发4. 数据库4.1 MySQL数据库原理mysql顶层有连接池,这个类似于线程池,用来在并发的时候进行数据库的操作。当sql语句读取到Mysql中时,有一层封装层用来拆分sql语句,比在处理之后将结果返回提供给上层,做了一层封装层;在这层封装层下面是语句的过滤器,会将分段的语句过滤,如果有的地方不和语法就会报错返回;再下面是优化器,一条...原创 2018-07-25 14:09:02 · 1868 阅读 · 1 评论 -
JAVA知识点全总结——(一)JVM
1. JVM1.1 运行时数据区内存模型运行时数据区是JVM把自己管理的内存部分抽象出来的模型,抽象出来的不同的数据区域,以便于管理,具体有如下几个区域。1.1.1 分类程序计数器,堆,栈,本地方法栈,方法区1.1.2 程序计数器在线程中,记录每个线程当前执行的语句行数,不会发生OOM,每个线程都有。1.1.3 栈栈是描述方法,描述线程的一块区域,每个线程都拥有一个...原创 2018-07-24 10:45:48 · 1358 阅读 · 0 评论 -
JAVA知识点全总结——(二)JAVA基础知识
上一篇:JAVA知识点全总结——(一)JVM2. JAVA基础知识2.1 集合类库2.1.1 ArrayList数组列表,优点是查询快速,缺点是中、前数据的删除会导致大量的数据移位,从而效率变低。如果插入和删除的点在末尾,实际上效率并不是很差。默认的大小是10,如果每次add或者构造函数创建了一个很大的数值时会对结构有变化,会调用核心的grow方法,这个方法会判断是否超出了范围,如...原创 2018-07-24 11:30:18 · 3041 阅读 · 0 评论 -
JAVA知识点全总结——(三)多线程与并发
上一篇:JAVA知识点全总结——(二)JAVA基础知识3. 多线程与并发3.1 多线程状态多线程状态:开始、可运行、等待、阻塞、结束。开始状体在调用了start方法之后进入可运行状体,可运行状态调用wait、await、park后进入等待状态。等待其他线程调用notify、signal、unpark将其唤醒,这是一种线程间的通信方式。阻塞表示的是某些线程因为没有符合要求无法进入同步区,...原创 2018-07-24 18:59:31 · 1179 阅读 · 0 评论 -
NIO
NIO和BIO的区别IO: 面向流 单向的 阻塞同步IONIO:面向缓冲区 通道可以是单向的,也可以是双向的 非阻塞同步IONIO的核心在于:通道和缓冲区(Buffer),获取IO设备中的通道以及用于容纳的数据缓冲区,对数据进行处理.缓冲区底层就是数组Channel负责传输,Buffer负责存储。Buffer属性buffer作为缓冲区,一次读取一些数据,可以减少磁盘的IO次...原创 2018-07-20 11:51:42 · 423 阅读 · 0 评论 -
四类通用算法比较
分治算法分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小...原创 2018-07-20 14:31:54 · 1733 阅读 · 0 评论 -
spring事务
spring事务简介Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执...原创 2018-07-19 20:56:20 · 309 阅读 · 0 评论 -
java——Unsafe
JAVA如何实现CAS?前一阵子在看AQS的时候发现用了很多CAS操作,毕竟AQS本身是没有进行显示的上锁,采用CAS同步无可厚非。那CAS是如何实现的呢?在JAVA中CAS调用的方法是Unsafe类的native方法。Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cas...原创 2018-07-18 13:59:07 · 483 阅读 · 0 评论 -
RDB & AOF
一种是RDB持久化,原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化,另外一种是AOF(append only file)持久化,原理是将Reids的操作日志以追加的方式写入文件。RDB 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的...原创 2018-07-18 16:51:40 · 276 阅读 · 0 评论 -
Thread Dump & jstack
什么是Thread Dump?Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。可以...原创 2018-07-17 12:12:01 · 988 阅读 · 0 评论 -
序列化
序列化关注点实现一个序列化会关注以下这些方面的性能:无关性,是否具有平台无关,语言无关的特性 通用性,能否序列化所有可用字符,还是其中的一个子集 压缩性,空间占用是否小?序列化时间是否快速? 可读性,是否易于直接理解,如果不能直接理解的话是否有文档 扩展性,是否能够在增加序列化字段时表现出较好的性能 安全性,这种序列化方式是否能够基于http/https的安全连接序列化组件...原创 2018-07-17 13:03:23 · 242 阅读 · 0 评论 -
各类工厂方法总结
各类工厂方法总结很久之前就对工厂方法有过了解了,但是当时一直有个问题,感觉工厂方法让代码的结构更加复杂,不是很清楚它存在的意义,对于“why”没有搞明白自然就学不好。如今重新看一下工厂方法。概念简单工厂:工厂类中,根据条件决定一个接口由哪个具体产品类来实现。工厂方法:创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法。用户决定使用哪个工厂。抽象工厂:对工厂方法进行扩展...原创 2018-07-17 15:31:09 · 546 阅读 · 0 评论 -
大数据查重
大数据去重复/查重经常会有大量的数据比如100G,要在内存为4G的处理器上进行查重和去重操作。ConcurrentHashMap数据量不大的时候可以采用concurrentHashMap来操作。布隆过滤器布隆过滤器是一种采用hash法进行查重的工具,它不是简单的做hash操作,而是将数据进行n次hash处理得到n个整数,将一个很长的数组的这n位从0设置为1。下次查找的时候经过同...原创 2018-07-17 17:52:31 · 2975 阅读 · 0 评论 -
IoC AOP
BeanFactoryBeanFactory 是一个接口,提供了获取容器中Bean的相关方法。BeanDefinitionRegistry 它才是IoC的容器,用于存储、管理所有的Bean对象。DefaultListableBeanFactory 它是IoC容器的一个具体实现,实现了BeanFactory和BeanDefinitionRegistry接口,因此既拥有管理Bean的容器,...原创 2018-07-15 13:06:24 · 301 阅读 · 0 评论 -
装饰器模式
为什么需要装饰器模式?我们要买奶茶,希望加红豆和布丁。考虑如何实现这个对象的构造:把红豆和布丁作为两个成员变量:无法动态的添加成员变量 创建一个成员变量表示“添加列表”,添加红豆和布丁作为元素:我们的奶茶需要一些修饰方法与红豆和布丁有关 红豆和布丁作为两个独立的类,继承奶茶:如果一杯奶茶既添加了红豆又添加了布丁则无法实现这种效果可见普通的组合和继承都无法很好的实现我们的要求。装饰...原创 2018-07-17 10:09:23 · 423 阅读 · 0 评论 -
LongAdder
为什么需要LongAdder?理论上,我们已经拥有了原子性数据的AtomicLong,但是AtomicLong在很高并发的情况下,使用CAS的效率不是很高,LongAdder内部将一个long分成多个cell,每个线程可以对一个cell操作,如果需要取出long数据则求和即可,这样增强了在高并发情况下的效率。内部实现只能做累加,或者自增自减操作,不能做其他操作 用一个Cell数组来存...原创 2018-07-17 10:43:44 · 810 阅读 · 0 评论 -
单例模式
为什么需要单例模式?一个对象的创建非常耗费资源,或者这个对象在全局中只需要用到一个而且没有状态的变化。在这种情况下如果我们每次都要创建很浪费资源,先创建出一个对象,当需要用到的时候进行复用即可。具体实现模式懒汉模式: 惰性加载,在类加载的时候并不初始化,当有类需要用到的时候再进行初始化,推荐。 饿汉模式:非惰性加载,类加载的时候直接进行初始化,开始会耗费时间,但也只是仅加载一次。...原创 2018-07-17 11:03:43 · 236 阅读 · 0 评论 -
JAVA排序算法
public class Sort { public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < 10; i++) arr[i] = (int) (Math.random() * 100); h...原创 2018-07-14 22:39:03 · 218 阅读 · 0 评论 -
ReentrantLock原理——AQS
AQS原理AQS,AbstractQueuedSynchronizer,抽象同步器队列,用来处理多线程访问资源的工具队列,具体依赖他的类有:ReentrantLock、Semaphore、CountDownLatch、CycilBarrier等。虽然叫做abstract也是一个抽象类,但是类中所有的方法都是实现的,在需要的时候我们只重写需要的方法即可。工作机制:维护一个链表队列,这些队列的结点通过...原创 2018-07-14 11:56:17 · 383 阅读 · 0 评论 -
红黑树
普通红黑树过于复杂,这里采用一种比较简单的左倾红黑树,定义略有不同,实现效果更好。规定所有红链接均为左链接没有任何一个结点连着两个红链接该树是完美黑色平衡的操作插入结点的链接颜色均为红色如果右结点链接为红色,左旋转如果左节点和左左节点链接均为红色,右旋转如果同层左右结点链接均为红色,它们同时变黑,父节点变红色根结点永远设置为黑色,如果由红变黑一次,说明树的高度增加插入-伪代码实现 ...原创 2018-07-14 12:21:29 · 230 阅读 · 0 评论 -
concurrentHashMap 1.8原理
sizeCtl负数代表正在进行初始化或扩容操作1代表正在初始化N 表示有N-1个线程正在进行扩容操作0代表hash表还没有被初始化正数值始终是当前ConcurrentHashMap容量的0.75倍,这与loadfactor是对应的CAS同步操作获取值设置值(CAS、voliate)get与hashmap相同,不控制读的同步put如果当前结点为forwarding则帮助扩容如果非forwarding...原创 2018-07-14 16:09:18 · 2002 阅读 · 0 评论 -
偏向锁-轻量锁-重量锁-自旋锁
自旋锁自选锁其实就是在拿锁时发现已经有线程拿了锁,一般情况下需要阻塞自己,但是这种挂起和唤醒需要切换至核心进程耗费资源,这个时候会选择进行忙等循环尝试。也就是不停循环看是否能等到上个线程自己释放锁。这个问题是基于一个现实考量的:很多拿了锁的线程会很快释放锁。因为一般敏感的操作不会很多。当然这个是一个不能完全确定的情况,只能说总体上是一种优化。自旋适应锁自旋的次数不固定,它是由前一次在同一个锁上的自...原创 2018-07-13 21:25:18 · 1029 阅读 · 0 评论 -
类加载器机制&双亲委派模型
类加载器机制JAVA允许类从不同的地方被加载,只要得到的是二进制的class文件即可进行运行,所以需要一个管理加载类文件的工具,这个工具就是类加载器。类加载器负责加载类文件到JVM中。JAVA中有多个系统自己定义的类加载器:启动类加载器Bootstrap ClassLoader,负责加载\lib目录下核心库(rt.jar目录)扩展类加载器Extension ClassLoader,负责加载\lib...原创 2018-07-13 10:10:21 · 319 阅读 · 0 评论 -
JDBC
概念Java Database Connectivity。JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。 JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。c3p0c3p0是一种数据库连接池,它扩展了传统的jdbc数据库连接池,底层的连接还是J...原创 2018-07-13 10:27:53 · 230 阅读 · 0 评论 -
synchronized&ReentrantLock
保证线程安全的方法有很多,但是实际上我们要做的就是保证堆空间也就是JMM中的主内存的数据的安全性,这才是并发的关键。首先确保其安全,其次考虑是否有死锁、饥饿、活锁等情况会发生,进行优化。synchronized使用在修饰非static方法的时候,synchronized只能确保当前修饰的this对象不会被同时修改。这个概念理解错的或不能理解的人都是对并发本身的理解有问题,并发的同步就是确保线程间修...原创 2018-07-13 16:25:26 · 234 阅读 · 0 评论 -
java多线程部分概念整理
concurrentHashMap中的size、isEmpty方法使用情况并不多,而且尽可能是一个当前情况的估计值当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。CopyOnWriteArrayList用于代替同步List,BlockingQueue也可以Blocking...原创 2018-07-13 16:31:37 · 216 阅读 · 0 评论 -
线程池概念
概念我们可以把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。在线程池的内部,任务被插入一个阻塞队列(Blocking Queue ),线程池里的线程会去取这个队列里的任务。当一个新任务插入队列时,一个空闲线程就会成功的从队列中取出任务并且执行它。合理的配置线程池要想合理的配置线程池,就必须首先分析任务特性,可以从以下...原创 2018-07-11 16:36:50 · 860 阅读 · 0 评论 -
HashMap的线程安全解决方案
SynchronizedMapCollections.synchronizedMap,直接给集合中所有方法上锁。低效。Hashtable直接给集合中所有方法上锁。低效。1.7 ConcurrentHashMapconcurrentHashMap是弱一致性,hashTable是强一致性。分段锁SegmentConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构...原创 2018-07-11 18:24:19 · 1329 阅读 · 0 评论 -
happen-before
happen-beforeJVM有一个“先行发生”(happen—before)的规则,它是内存模型中定义的两项操作之间的偏序关系,如果操作A - HB - B,其意思就是说:A这个操作对于B是可见的。通俗地说:只要A发生了变化,B一定能观察到。可以对比强一致性和弱一致性的概念对比。程序顺序原则:一个线程内保证语义的串行性volatile规则:volatile变量的写 - HB - volatil...原创 2018-07-11 18:43:26 · 292 阅读 · 0 评论 -
一句话解释JAVA线程间通信
网上总结了10多种线程间通信的方式,看得我有些头晕,有的人说while轮询也是一种线程通信方式,我想问个问题,那我for轮询是不是也算一种轮询方式呢?问题的关键在于,怎样总结这些线程通信的模型。我认为,线程通信只有两种,1.共享内存;2.线程间直接通信。再多的都是从这两种演化出来的实现方法。## 共享内存通信1. await,notify2. join3. volatile4. cyclicBar...原创 2018-07-11 19:32:58 · 279 阅读 · 0 评论