摘要: java Exception#fillInStackTrace:将当前调用栈信息填入到原来异常对象,相当于更新最新的抛出点(catch异常后又抛出的点). try-finally某些情况下会吃掉抛出的异常. try { throw new RuntimeException(); } finally 阅读全文
posted @ 2020-12-21 22:55 zliawk 阅读(51) 评论(0) 推荐(0)
摘要: java javadoc只能为public和protected成员进行文档注释,private和默认权限的注释则会被忽略掉,不过可以用-private进行标记,以便把private成员的注释耶包括在内. int x = Character.digit('c', 16):是把16进制的c转为10进制, 阅读全文
posted @ 2020-12-21 22:47 zliawk 阅读(67) 评论(0) 推荐(0)
摘要: java java Test < 1.txt表示将1.txt中的内容作为其前面命令的输入. java Test > 1.txt表示将Test的结果输出到1.txt中. 双端队列,可以在头部和尾部添加或删除元素,但不支持在队列中间添加元素. coll1.retainAll(coll2):会从coll1 阅读全文
posted @ 2020-12-21 22:44 zliawk 阅读(54) 评论(0) 推荐(0)
摘要: java String v = map.putIfAbsent("a", "1"):若map中不存在指定的key值(a),则使用指定的key(a)和指定的value(1)进行填充,但此时返回的数据是旧值,所以是null,即v=null,当你真正调用map.get("a")时才返回指定的value值, 阅读全文
posted @ 2020-12-21 22:38 zliawk 阅读(65) 评论(0) 推荐(0)
摘要: java 在同一个catch语句中可以捕获多个不存在子类关系的异常 try{ // }catch(FileNotFoundException | UnknowHostException e){ // } java中原来有提供断言,学到了学到了. 泛型类、泛型方法 一个类型变量或通配符可以有多个限定. 阅读全文
posted @ 2020-12-21 22:32 zliawk 阅读(60) 评论(0) 推荐(0)
摘要: java s.substring(a,b)的长度:b-a. String.join("/","a","b","c"):a/b/c. 字符串常量是共享的,而+或substring等操作产生的结果并不是共享的,所以会导致拼接后的结果随便相同,但引用的地址却不是同一个. Scanner in = new 阅读全文
posted @ 2020-12-21 22:31 zliawk 阅读(53) 评论(0) 推荐(0)
摘要: java Arrays.deepToString(a):打印二维数组. Java8开始时间使用Date类,日期使用LocalDate类. 包内的类不能引用默认包中的类. 内部类可以是私有类(private),而常规类只可以具有包可见性(default)或公有可见性(public). 内部类不能有st 阅读全文
posted @ 2020-12-21 22:29 zliawk 阅读(54) 评论(0) 推荐(0)
摘要: java jdk-8u191-windows-x64:Java SE 8的第191次更新. OpenJDK:Java SE的一个免费的开源实现,不包含浏览器集成或JavaFX(用于图形化界面). 从Java 7开始,数字字面量加下划线:1_000_000,Java编译器会去除这些下划线. Doubl 阅读全文
posted @ 2020-12-21 22:23 zliawk 阅读(50) 评论(0) 推荐(0)
摘要: 简单介绍 由于CopyOnWriteArrayList的注释并不是很多,所以在这里简单的说明下,它属于线程安全,底层是通过生成数组的新副本来实现的,也就是在修改列表元素/结构的情况会生成新副本。简单地说,它是ArrayList的一个变体!探索CopyOnWriteArrayList源代码是基于JDK 阅读全文
posted @ 2020-12-21 22:14 zliawk 阅读(144) 评论(0) 推荐(0)
摘要: 前言 EnumMap初次见面,请多多关照!对于该类的注释直接上总结: 专门用于枚举类型的键的Map实现。EnumMap内部的数据结构是数组,按枚举常量的声明顺序排列它的键,与其他Map实现类不同的是,它的迭代器并不会抛出快速失败错误! 该类的代码不到1000行,速速解决掉,探索EnumMap底层实现 阅读全文
posted @ 2020-12-21 22:09 zliawk 阅读(94) 评论(0) 推荐(0)
摘要: 前奏 Executor是家族中的老大,其下还有ExecutorService、Executors、ThreadPoolExecutor、ScheduledThreadPoolExecutor和ForkJoinPool,对于ForkJoinPool是在JDK1.7中新增的,其中可能还涉及到诸多理论,故 阅读全文
posted @ 2020-12-21 22:06 zliawk 阅读(79) 评论(0) 推荐(0)
摘要: 概念 ForkJoin框架将一个大问题分解成若干个相互独立且容易解决的小问题,为了让这些小问题能够并行执行,同时减少线程间对资源的竞争,将这些小问题分别放入到不同的队列中,并为每个队列创建一个线程来执行队列中的小问题,这个过程就叫做Fork,中文称作分支,当所有的小问题都解决完之后,需要将每个结果进 阅读全文
posted @ 2020-12-21 22:01 zliawk 阅读(201) 评论(0) 推荐(0)
摘要: 前言 探索HashMap底层实现是基于JDK1.8,看代码之前翻了一下别人写的博客我才知道JDK1.7版本的HashMap是由数组 + 链表的数据结构组成,而对于JDK1.8是由数组 + 链表 + 红黑树的数据结构组成,所以我又去了解了什么是二叉树、平衡二叉树、红黑树,为的就是能做个铺垫。既然是由数 阅读全文
posted @ 2020-12-21 21:58 zliawk 阅读(69) 评论(0) 推荐(0)
摘要: 前言 HashSet的底层实现依赖于HashMap,所以它的数据结构也是数组 + 链表 + 红黑树,而对于它的类注释也没什么好总结的,探索HashSet底层实现是基于JDK1.8。仔细一想,HashSet存在的意义是什么?有时候需要添加元素时,也就是只有单个对象,并没有所谓的键值对,或许还有些用处, 阅读全文
posted @ 2020-12-21 21:56 zliawk 阅读(311) 评论(0) 推荐(0)
摘要: 前言 探索Hashtable底层实现是基于JDK1.8,它的数据结构是数组 + 链表。在不考虑线程是否安全的前提下,它的很多细节处理都不如HashMap,何况如今的HashMap又加了红黑树,查询修改肯定比不上,因为红黑树的时间复杂度是O(logN),而链表的时间复杂度是O(N),新增与删除无法比较 阅读全文
posted @ 2020-12-21 21:53 zliawk 阅读(384) 评论(0) 推荐(1)
摘要: 前沿 我也是第一次认识IdentityHashMap,在工作中从未使用过它,所以对它的使用场景可能并不是很了解,本文也仅仅针对基于JDK1.8的源码进行探索。IdentityHashMap的数据结构应该是如图所示: 这个数据结构是我在看源码之前看了几篇别人写的文章所了解到的,个人喜欢在看源码对目标有 阅读全文
posted @ 2020-12-21 21:50 zliawk 阅读(103) 评论(0) 推荐(0)
摘要: 前言 探索LinkedBlockingQueue是基于JDK1.8,由注释可知是基于单链表的阻塞队列,至于其队列是否有界取决于其队列的容量大小,从严格意义上来说,它是有界队列,按照先进先出的顺序访问,新元素被插入到队列的尾部,从队列头部获取元素,提供在将新元素放入到饱满的队列中会导致阻塞,直到队列出 阅读全文
posted @ 2020-12-21 21:49 zliawk 阅读(82) 评论(0) 推荐(0)
摘要: 前言 印象中对LinkedHashMap的使用次数好像也不多,参考了几篇文章发现它依赖于HashMap而存在,也就是说它在HashMap的基础上又增加了某些特性,比如说有序。既然是基于HashMap,那么它内部的数据结构也应该有数组 + 链表 + 红黑树,而刚才说它又加上了自己的有序特性,那么应该还 阅读全文
posted @ 2020-12-21 21:45 zliawk 阅读(217) 评论(0) 推荐(0)
摘要: 前言 额... 底层实现了LinkedHashMap,它的数据结构是数组 + 链表 + 红黑树,内部通过一条链表来维护有序性,按照插入顺序进行排列。代码只有100行... 数据结构 public class LinkedHashSet<E> extends HashSet<E> implements 阅读全文
posted @ 2020-12-21 21:44 zliawk 阅读(357) 评论(0) 推荐(0)
摘要: 前言 老样子,还是先看注释!本来以为能收获点什么干货,结果注释与ArrayList的注释基本相同,有点尴尬...LinkedList的源码是基于JDK1.8。 开干 先上LinkedList类的注释,在深入到类中详细说明属性与方法。 阅读注释 它的意思是:通过索引来操作LinkedList的话,每次 阅读全文
posted @ 2020-12-21 21:35 zliawk 阅读(130) 评论(0) 推荐(0)
摘要: 前言 我们都知道ArrayList适合查询/替换、LinkedList适合添加/删除,造成这样子的原因也在于它们底层的实现。光说这些理论似乎大家都会,所以准备用更加具体的例子来证明它,也能更好地比较这两者之间的性能关系。在测试具体场景前,简单说明下环境配置,window环境下:内存8个G;JDK8; 阅读全文
posted @ 2020-12-21 21:28 zliawk 阅读(188) 评论(0) 推荐(0)
摘要: 前言 在阅读TreeMap源码时发现了Comparable与Comparator,光是名字看起来就很像,既然都是比较器,那有何区别呢?实际上我对于比较器的使用场景并不是很多,所以这篇还是借鉴了别人的想法。 比较 通过下面的这段代码来说明问题。 public class Test { public s 阅读全文
posted @ 2020-12-21 21:24 zliawk 阅读(78) 评论(0) 推荐(0)
摘要: 前言 通常情况下,每学习一块知识点我都会先找相应的文章来作铺垫,今天轮到锁相关介绍了,发现了一篇好文章,本想着直接贴个链接就完事了,想想自己还是好好总结下,下面的内容可能大部分摘自该文章锁的详细介绍,对本文没兴趣的读者直接移至该链接即可,速速开始吧。 进入正题 Java中有好几种锁,什么悲观锁、乐观 阅读全文
posted @ 2020-12-21 21:20 zliawk 阅读(321) 评论(0) 推荐(0)
摘要: 前言 探索PriorityBlockingQueue是基于JDK1.8,它是基于二叉堆的无界阻塞队列,二叉堆又可以分成最大堆与最小堆,很显然,既然是优先级队列,那么优先级高者自然比优先级低者优先出队列,PriorityBlockingQueue采用的是数值越小优先级越高,即最小堆,利用每个元素的优先 阅读全文
posted @ 2020-12-21 21:17 zliawk 阅读(106) 评论(0) 推荐(0)
摘要: 自我介绍 QPS,query per second,每秒的请求数。当我看到这里的时候很不明白,每秒?按照我的理解应该是计算开始的时间到1秒钟这中间的请求数,但是怎么算是开始的时间,是指服务启动的时间还是第一次请求开始的时间,至少对于我来说讲述的并不是很明确。在比如,有一个时间线,第二秒的后500ms 阅读全文
posted @ 2020-12-21 20:46 zliawk 阅读(58) 评论(0) 推荐(0)
摘要: 自我介绍 Spi,Service Provider Interface,是java提供的一套用来被第三方实现或扩展的API,它可以用来启用框架扩展或替换相应的组件。简单来说就是我提供标准,你按照我的标准提供实现就可以了,当然了,这个实现可以是可以有多个,你想选择哪个都可以,不过前提是你要知道所有的实 阅读全文
posted @ 2020-12-21 20:45 zliawk 阅读(75) 评论(0) 推荐(0)
摘要: 简单介绍 Stack类就一百多行代码,简单说明下。它的特性是后进先出(LIFO),继承了Vector类,大部分的操作都是使用Vector中的方法。在注释中,作者提醒我们若要使用后进先出的栈操作,应该优先使用Deque,这么说来,该类已经被放弃了,早在JDK1.0的时候它就出现了,是有点老了!我们说过 阅读全文
posted @ 2020-12-21 20:44 zliawk 阅读(217) 评论(0) 推荐(0)
摘要: 前言 synchronized是很早就有的关键字,很多人都称呼它为重量级锁,因为阻塞或唤醒一个线程会发生上下文切换,如果同步方法中的内容过于简单,那么频繁的上下文切换所带来的开销可能会使得系统的性能下降,所以为了减少获取锁和释放锁带来的性能消耗便作了优化,因为synchronized跟锁有很大关系, 阅读全文
posted @ 2020-12-21 20:43 zliawk 阅读(188) 评论(0) 推荐(0)
摘要: 前言 探索SynchronousQueue是基于JDK1.8,属于特殊的阻塞队列,内部并无容量,是典型的生产者/消费者模式,只含有生产者或消费者的场景下会发生阻塞,当既有生产者也有消费者下会发生匹配从而完成交易。SynchronousQueue有一个fair属性用于配置使用哪种内部类,fair为tr 阅读全文
posted @ 2020-12-21 20:41 zliawk 阅读(123) 评论(0) 推荐(0)
摘要: 前言 接下来的这一段时间都将探索跟线程有关的内容,包括各种锁,对Thread的总结如下: 线程具有优先级,高优先级的线程优先于低优先级的线程执行,当在某个线程中创建新线程时,新线程的优先级被设置成当前线程的优先级;JVM启动时,默认有一个非守护线程(调用某个类的main方法);线程能被标记为守护线程 阅读全文
posted @ 2020-12-21 20:39 zliawk 阅读(94) 评论(0) 推荐(0)
摘要: 前言 探索TreeMap底层实现是基于JDK1.8,通过该类的注释可以了解它的数据结构是红黑树,默认是按照自然顺序进行排序(所有的键都必须去实现Comparable),当然也可以通过指定比较器进行排序(所有的键都必须实现Comparator)。至于什么是红黑树,读者最好有一定的了解,那看懂它的源码也 阅读全文
posted @ 2020-12-21 20:38 zliawk 阅读(318) 评论(0) 推荐(0)
摘要: 开门见山 ThreadGroup在实际开发中很少用到,不过由于它跟Thread的关系比较密切,所以还是了解下为妙,揭开ThreadGroup的面纱是基于JDK1.8。通过阅读注释及相关文章,可以知道ThreadGroup的结构如下: 除了初始线程组(JVM所属)以外,每个线程组都有一个父线程组及子线 阅读全文
posted @ 2020-12-21 20:37 zliawk 阅读(129) 评论(0) 推荐(0)
摘要: 前言 TreeSet的内部实现基于TreeMap,所以它的数据结构是红黑树。注释也不总结了,此探索是基于JDK1.8,直接进入正题。 数据结构 public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Clo 阅读全文
posted @ 2020-12-21 20:33 zliawk 阅读(678) 评论(0) 推荐(0)
摘要: 背景 上周发布了探索ArrayList的底层实现,趁热打铁!实际上ArrayList与Vector的实现上非常相似,代码基本上都是一样的,还是老样子,先看注释,我能说注释都差不多一样吗。探索Vector源代码是基于JDK1.8的。 阅读注释 Vector内部是通过动态数组实现的。 Vector可自定 阅读全文
posted @ 2020-12-21 19:37 zliawk 阅读(313) 评论(0) 推荐(0)
摘要: 前言 在多线程并发编程中volatile扮演者重要的角色,它是轻量级的synchronized,在多处理器中保证了共享变量的可见性,执行成本更低,因为它不会引起线程的上下文切换和调用,简单来说就是多线程对共享变量的修改能让其他线程立即知晓而不需要花费线程切换的相关成本,这一切都由一个叫做内存模型的东 阅读全文
posted @ 2020-12-21 19:26 zliawk 阅读(73) 评论(0) 推荐(0)
摘要: 前言 探索WeakHashMap底层实现是基于JDK1.8,它的数据结构是数组 + 链表。就不贴它的注释了,直接总结一下吧: WeakHashMap基于弱键实现了Map接口,也就是说,当某个键不在使用时会被丢弃,对应的键值对将会被自动移除。如何确定不在使用取决于GC是否运行,而对于GC何时运行我们并 阅读全文
posted @ 2020-12-21 19:23 zliawk 阅读(98) 评论(0) 推荐(0)
摘要: 比较 趁热打铁!比较最近学习到的几个Map实现类,也正好总结下!此比较是基于JDK1.8,直接用表格展示。 比较点 HashMap Hashtable IdentityHashMap LinkedHashMap TreeMap WeakHashMap 数据结构 数组链表红黑树 数组链表 数组(哈希探 阅读全文
posted @ 2020-12-21 19:22 zliawk 阅读(109) 评论(0) 推荐(0)
摘要: 前言 字符串是最常用的类型之一,趁此机会准备探索下它的源码。有关该类的注释作一个总结: String-字符串,是个常量,它们被创建后其值就不允许被改变,由于它是不可变的,所以它们可以被共享,在内部提供了多个方法来操作字符串。 探索之前我曾看过其他人写的有关于此的文章,发现JDK1.7版本前后的内存模 阅读全文
posted @ 2020-12-21 19:21 zliawk 阅读(712) 评论(0) 推荐(0)
摘要: 前言 《Java虚拟机规范》中并没有关于垃圾收集器的相关章节,所以本篇文章的内容将完全参考周志明老师的书籍,目的同样是归纳总结形成自己的理解。虚拟机的运行时数据区可划分为程序计数器、Java虚拟机栈、本地方法栈、堆、方法区,其中前三者随着线程的创建而建立,后两者随着虚拟机的启动而创建,所以在线程结束 阅读全文
posted @ 2020-12-21 19:20 zliawk 阅读(80) 评论(0) 推荐(0)
摘要: 前言 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、解析和初始化,最终形成可以直接被虚拟机使用的Java类型,这个过程被称作虚拟机的类加载机制,类的整个生命周期包括加载、验证、准备、解析、初始化、使用和卸载,其中验证、准备、解析统称为连接,如图所示: 类加载过程 加载 通 阅读全文
posted @ 2020-12-21 19:19 zliawk 阅读(101) 评论(0) 推荐(0)
摘要: 前言 从开始阅读《Java虚拟机规范》到现在已经历时二个月了,中途出现过多次想要放弃的念头,它不像源码那样直观,是什么就是什么,纯属一堆描述...前半部分都是一字不落的看完,后半部分挑选重点的内容来阅读,不然真要吐了...细节部分就留着需要的时候在来攻克它。在阅读过程中对比《深入Java虚拟机》中的 阅读全文
posted @ 2020-12-21 19:18 zliawk 阅读(79) 评论(0) 推荐(0)
摘要: 针对我为什么要读 首先压根就谈不上自己很厉害,什么Java基础已经很精通了,工作快三年了,依然还是个弟弟级别的水平。实际上我是有自己的一个规划,整个知识脉络的先后顺序,细心的人可以发现从开始写博客到后续的文章都有一个明显的个人,比如先是集合、再到线程、线程池、队列、锁等等,好了好了,说重点了。由于最 阅读全文
posted @ 2020-12-21 19:17 zliawk 阅读(97) 评论(0) 推荐(0)
摘要: java wait、notify、notifyAll方法只能在同步控制方法或同步控制块(synchronized)中使用,否则即使能通过编译,但在运行时会抛出IllegalMonitorStateException异常,因为这些方法在调用时会操作锁。sleep可以在非同步控制方法中调用,因为它没有操 阅读全文
posted @ 2020-12-21 19:16 zliawk 阅读(60) 评论(0) 推荐(0)