JVM-Java语法糖
参考文献
不了解这12个语法糖,别说你会Java!
语法糖
语法糖的存在主要是方便开发人员使用,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖
Java支持的语法糖
switch 支持 String 与枚举
对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int
泛型
通常情况下,一个编译器处理泛型有两种方式:Code specialization和Code sharing。
C++和C#是使用Code specialization的处理机制,而Java使用的是Code sharing的机制。
Code sharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。
也就是说,对于Java虚拟机来说,他根本不认识Map<String, String> map这样的语法。需要在编译阶 ...
解决方案-网关
参考文献
网关系统就该这么设计(万能通用),稳的一批!
Java并发编程(十三)-累加器
参考文献
累加器
AtomicLong :这是最基本的累加器,支持单个long类型的原子性操作.适用于低并发场景或单线程环境.
LongAdder :相比于AtomicLong ,LongAdder 在高并发环境中的性能更好,因为它使用了分段锁来避免多个线程同时竞争一个变量的情况.适用于高并发场景下的计数器或统计器.
DoubleAdder :与LongAdder 类似,但支持double类型的原子性操作.适用于需要累加double类型数据的高并发场景.
LongAccumulator :支持任意函数的原子性操作,可以自定义累加函数.适用于需要累加的场景比较复杂,需要自定义累加函数的情况.
DoubleAccumulator :与LongAccumulator 类似,但支持double类型的原子性操作.
这些累加器在多线程环境下都可以保证线程安全,可以用于实现高性能的计数器、统计器等场景.选择哪种累加器要根据具体的场景和需求来确定.
如果需要进行高并发的累加操作,可以选择LongAdder 或DoubleAdder ;
如果需要自定义累加函数,可以选择L ...
MySQL-Predicates in SQL
参考文献
Predicates in SQL
SQL谓词
谓词只是一个计算结果为TRUE、FALSE 或UNKNOWN的表达式.谓词通常用于WHERE和HAVING子句的搜索条件、FROM子句的连接条件以及需要布尔值的查询的任何其他部分.
谓词有多种类型,其中包括:
Comparison(比较谓词)
LIKE
BETWEEN
IN
EXISTS
IS NULL (/INTEGER/DECIMAL/FLOAT...)
Comparison Predicates 比较谓词
= Equal to
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to
<> Not equal to
EXISTS
在EXISTS的子查询里SELECT子句的列表可以有三种写法
通配符: SELECT *
常量: SELECT '任意内容'
列名: SELECT col_name
谓词逻辑中,根据输入值的阶数对谓词进行分类.=或者BETWEEE ...
Java并发编程-Fork/Join
参考文献
JUC线程池: Fork/Join框架详解
线程池ForkJoinPool简介
Fork/Join
Fork/Join框架是Java并发工具包中的一种可以将一个大任务拆分为很多小任务来异步执行的工具,自JDK1.7引入。
ForkJoinPool是ThreadPoolExecutor线程池的一种补充,是对计算密集型场景的加强
Fork/Join组成
任务对象: ForkJoinTask (包括RecursiveTask、RecursiveAction 和 CountedCompleter)
ForkJoinPool只接收ForkJoinTask 任务(在实际使用中,也可以接收 Runnable/Callable 任务,但在真正运行时,也会把这些任务封装成 ForkJoinTask 类型的任务)
RecursiveTask是ForkJoinTask的子类,是一个可以递归执行的 ForkJoinTask
RecursiveAction 是一个无返回值的 RecursiveTask,CountedCompleter 在任务完成执行后会触发执行一个自定义的钩子函数。
...
Java并发编程-FutureTask
参考文献
JUC线程池: FutureTask详解
FutrueTask
FutureTask为Future提供了基础实现,如获取任务执行结果(get)和取消任务(cancel)等.如果任务尚未完成,获取任务执行结果时将会阻塞.一旦执行结束,任务就不能被重启或取消(除非使用runAndReset执行计算).FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行.除了作为一个独立的类之外,此类也提供了一些功能性函数供我们创建自定义 task 类使用.FutureTask 的线程安全由CAS来保证.
Callable接口
123456789public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exception if unable to compute ...
Java并发编程(十四)-CompletableFuture
参考文献
Java8实战
CompletableFuture原理与实践-外卖商家端API的异步化
Future
通常只需要使用将耗时的操作封装在一个Callable对象中,再将它提交给ExecutorService
1234567891011121314151617public class FutureTest { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Future<Double> future = executor.submit(new Callable<Double>() { @Override public Double call() throws Exception { return doSomeLongComputation(); ...
Java集合-LinkedList
参考文献
LinkedList-JDK8
属性
123456789101112131415161718// 元素个数transient int size = 0;/** * 链表首节点 * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */transient Node<E> first;/** * 链表尾节点 * Pointer to last node. * Invariant: (first == null && last == null) || * (last.next == null && last.item != null) */transient Node<E> last;
节点类
1234567891011private static class Node& ...
Java集合-ArrayList
参考文献
Collection - ArrayList 源码解析
死磕 java集合之ArrayList源码分析
ArrayList-JDK8
属性
123456789101112131415161718192021222324252627282930313233343536373839404142/** * 该常量代表ArrayList默认的初始化容量,实际上这个值在ArrAyList中的使用非常少 * 只出现在ArrayList第一次确认容量的时候——而且还是在默认情况下 * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; /** * 该常量值是在ArrayList初始化的时候使用,用来将elementData数组赋值为一个没有元素的空数组。 * 注意:只是在初始化时使用 * 空数组,用于空实例的共享空数组实例(若传入的容量为0时使用). * Shared empty array instance used for emp ...
RocketMQ-基础
参考文献
RocketMQ
Broker(邮递员)
Broker是RocketMQ的核心,负责消息的接收,存储,投递等功能.
NameServer(邮局)
消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息.
Producer(寄件人)
消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker建立连接,向Broker发送消息.
Consumer(收件人)
消费的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息.
Topic(地区)
用来区分不同类型的消息,发送和接收消息都需要先创建Topic,针对Topic来发送和接收消息.
Message Queue(邮件)
为了提高性能和吞吐量,引入Message Queue,一个Topic可以设置一个或多个Message Queue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息
...