![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
豆腐花发
哦呜
展开
-
map和flatMap
map比较简单,一生一,可以抽取列表元素的某个属性形成新的列表flatMap一生多,对数组进行流封装,把数组的元素都进入同一个流中 String[] arr = {"asd","dfg"}; //两行代码效果相同 //List<String> collect = Arrays.stream(arr).flatMap(a -> Arrays.stream(a.split(""))).distinct().collect(Collector原创 2021-03-26 11:17:25 · 220 阅读 · 0 评论 -
格式化字符串
MessageFormat和String都有format方法,用法不同。前者用{}和数字(0开始)填充,后者用%和类型填充 String sd = MessageFormat.format("aa{0}-{1}", "sd","123"); System.out.println(sd); String format = String.format("你好%3d,%s", 2, "呵呵"); System.out.println(format原创 2021-03-24 14:56:28 · 72 阅读 · 0 评论 -
死锁
死锁指两个线程互相持有锁,等待对方的锁。举例 public static void main(String[] args) { dead_lock(); } private static void dead_lock() {// 两个资源 final Object resource1 = "resource1"; final Object resource2 = "resource2";// 第一个线程,想先占有resour原创 2021-03-06 21:08:29 · 83 阅读 · 0 评论 -
字符串常量池
原理编译后,每个class文件都有常量池表,存储所有常量,包含了字符串常量运行后,每个class文件都有一个运行时常量池。字符串常量池是一个hashtable,存储的是字面量"abc"和创建的字符串对象的引用之间的映射。字符串常量池是全局只有一个,在堆中。而常量池表和运行时常量池是每个class文件都有一份。字符串常量进入运行时常量池的时候,使用equals方法,先进行字符串常量池是否存在的判断,不存在就创建对象,存储映射,返回对象的引用。使用了享元模式。举例在*.java文件中有如下代码:i原创 2020-10-12 10:44:05 · 854 阅读 · 0 评论 -
线程状态
1.创建:new出来2.就绪:start()3.运行4.阻塞,3种(1)等待阻塞,wait方法(2)同步阻塞,等待锁(3)其他阻塞,sleep和join5.结束原创 2020-08-13 21:22:31 · 92 阅读 · 0 评论 -
sleep、wait、yield、join区别
1.waitwait是Object方法,释放锁,等线程代码执行完后释放锁的。wait必须在同步代码块中,用notify唤醒2.sleepsleep是Thread方法,sleep释放cpu,sleep(n)在n毫秒内不竞争cpu不释放锁。线程进入阻塞状态3.yield不释放锁,释放cpu,线程重回就绪状态,有可能再次执行4.join调用join的线程执行结束后,当前线程继续执行。当前线程里调用其它线程1的join方法,当前线程阻塞,但不释放对象锁,直到线程1执行完毕或者millis时间到原创 2020-08-13 21:17:53 · 175 阅读 · 0 评论 -
InheritableThreadLocal使用
子线程可以使用父线程的值,ThreadLocal不可以无初始值 private static final ThreadLocal<String> TL = new ThreadLocal<>(); private static final InheritableThreadLocal<String> ITL = new InheritableT...原创 2019-12-19 17:21:45 · 416 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码
继承public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {AbstractOwnableSynchronizer设置独占线程public abstract class AbstractOwnab...原创 2019-06-19 10:45:35 · 98 阅读 · 0 评论 -
DelayQueue1.8源码
DelayQueue 内部通过组合PriorityQueue 来实现存储和维护元素顺序的,通过compareTo方法,排序存储,小的在前面。每次插入元素,都可能移动元素DelayQueue 存储元素必须实现Delayed 接口,通过实现Delayed 接口,可以获取到元素延迟时间,以及可以比较元素大小(Delayed 继承Comparable)DelayQueue 通过一个可重入锁来控制元素的...原创 2019-04-30 16:49:01 · 293 阅读 · 0 评论 -
Semaphore1.8源码
Semaphore 主要用于限量控制并发执行代码的工具类, 其内部通过 一个 permit 来进行定义并发执行的数量, 其实可以理解为一个 限制数量的 ReadLock 获取.Semaphore 主要特点:1.Semaphore 方法的实现通过 Sync(AQS的继承类)代理来实现2.支持公平与非公平模式, 都是在AQS的子类里面进行, 主要区分在 tryAcquire 里面使用pack...原创 2019-04-30 13:37:34 · 106 阅读 · 0 评论 -
多个线程顺序执行
1.wait-notifyAll同步方法package com.study.demo;/** * Created by Administrator on 2019\3\2 0002. */public class Test { private int seq = 1; public synchronized void method1() { try ...原创 2019-04-30 09:47:59 · 221 阅读 · 0 评论 -
ReadWriteLock1.8源码
ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的并发情...原创 2019-04-29 17:32:52 · 105 阅读 · 0 评论 -
ReentrantLock1.8源码
使用举例默认是非公平锁,公平锁构造参数用truepackage com.study.demo;import java.util.concurrent.locks.ReentrantLock;/** * Created by Administrator on 2019\3\2 0002. */public class Test { private static Reentr...原创 2019-04-24 19:48:11 · 129 阅读 · 0 评论 -
LinkedBlockingQueue1.8源码
使用 private int i; LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(3); class Producer implements Runnable { @Override public void run() { ...原创 2019-04-28 17:32:00 · 142 阅读 · 0 评论 -
序列化继承
相关注意事项a)序列化时,只对对象的状态进行保存,而不管对象的方法;b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;但是该对象也要实现序列化接口d)并非所有的对象都可以序列化,至于为什么不可以,有很多原因了,比如:1.安全方面的原因,比如一个对象拥有private,pub...原创 2019-04-23 11:33:40 · 1154 阅读 · 0 评论 -
同步异步和阻塞非阻塞
1.同步与异步被调用者角度同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换...转载 2019-06-19 11:24:13 · 173 阅读 · 0 评论 -
BigDecimal
举例 public static void main(String[] args) { System.out.println(new BigDecimal("0.1"));//0.1 System.out.println(new BigDecimal(0.1));//0.10000000000000000555111512312578270211815834...原创 2019-06-10 15:59:55 · 150 阅读 · 0 评论 -
java集合
HashTable与HashMap(1)HashTable和HashMap都实现了Map接口,但是HashTable的实现是基于Dictionary抽象类。(2)在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,既可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由...原创 2019-02-19 21:27:48 · 135 阅读 · 0 评论 -
ScheduledThreadPoolExecutor
public class ScheduledThreadPoolExecutorextends ThreadPoolExecutorimplements ScheduledExecutorService {public interface ScheduledExecutorService extends ExecutorService {ScheduledExecutorService多了...原创 2019-09-04 11:20:59 · 266 阅读 · 0 评论 -
jdk9新特性
Java 9 逆天的十大新特性转载https://blog.csdn.net/mxw2552261/article/details/79080678在介绍java9之前,我们先来看看java成立到现在的所有版本。1990年初,最初被命名为Oak;1995年5月23日,Java语言诞生;1996年1月,第一个JDK-JDK1.0诞生;1996年4月,10个最主要的操作系统供应商申明...转载 2019-06-28 16:03:03 · 138 阅读 · 0 评论 -
ThreadPoolExecutor
创建线程池Executors return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueu...原创 2019-06-27 13:38:48 · 993 阅读 · 0 评论 -
线程池
四种线程池Executors有四个线程池,单一线程池,newSingleThreadExecutor固定线程池,newFixedThreadPool缓冲线程池,newCachedThreadPool周期线程池,newScheduledThreadPoolThreadPoolExecutor参数有核心线程数,最大线程数,线程空闲时间,时间单位,阻塞队列,线程工厂,拒绝策略四种拒绝策略...原创 2019-06-27 09:07:07 · 92 阅读 · 0 评论 -
集合交集,并集,差集运算
举例class User { private Long cardId; private Long deviceId; public User(Long cardId, Long deviceId) { this.cardId = cardId; this.deviceId = deviceId; } public Us...原创 2019-07-01 18:52:53 · 2166 阅读 · 0 评论 -
juc
1.原子类AtomicInteger,AtomicReference,AtomicStampedReferenceAtomicLong,LongAdder2.锁AbstractQueuedSynchronizerReentrantLockReentrantReadWriteLock3.集合ReentrantReadWriteLockCopyOnWriteArrayList4.线...原创 2019-06-16 16:50:28 · 432 阅读 · 0 评论 -
ClassLoader
类加载器,功能是负责读取Java字节码代码(.class文件),并转换成java.lang.Class类的一个实例(每个实例代表一个Java类)并加载到JVM中。是抽象类public abstract class ClassLoader {双亲委派先用父类加载器加载,如果加载不了,再用自己加载类加载器这种父类优先加载的规则主要是为了保证类的唯一性,在Java中判断两个类是否相同(注意这...原创 2019-06-20 16:57:35 · 591 阅读 · 0 评论 -
CountDownLatch1.8源码
使用 private static Random random = new Random(); private static int num = 3; public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(num); Syste...原创 2019-04-26 18:37:49 · 92 阅读 · 0 评论 -
TreeMap1.8源码
使用TreeMap使用比较器排序,按照key的排序遍历,如果没有比较器,用默认比较器,key的类默认实现了Comparable接口的compareTo方法,比如Integer,Stringkey不能为null,value可以为null Map<String, String> treeMap = new TreeMap<String, String>()...原创 2019-04-03 20:07:01 · 135 阅读 · 0 评论 -
synchronized实现
synchronized的三种应用方式修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。synchronized底层语义原理同步(Synchronization)基于进入和退出管程(Monitor)对象实现, 无论是显式同步(...原创 2019-02-26 23:04:17 · 536 阅读 · 0 评论 -
多线程
java乐观锁与悲观锁synchronized关键字的实现是悲观锁。存在以下问题: 1. 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 2. 一个线程持有锁会导致其它所有需要此锁的线程挂起。 3. 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。乐观锁:CAS实现的,乐观锁是一种思想...原创 2019-02-26 14:01:16 · 113 阅读 · 0 评论 -
java8新特性
一、Lambda表达式Lambda表达式可以说是Java 8最大的卖点,她将函数式编程引入了Java。Lambda允许把函数作为一个方法的参数,或者把代码看成数据。二、接口的默认方法与静态方法我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。例如:public interface DefaultF...原创 2019-02-25 21:45:04 · 89 阅读 · 0 评论 -
集合
数组和链表数据结构描述,各自的时间复杂度1、存取方式上,数组可以顺序存取或者随机存取,而链表只能顺序存取;2、存储位置上,数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定;3、存储空间上,链表由于带有指针域,存储密度不如数组大;4、按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n);5、按值查找时,若数组无序,数组和链表时间复杂度均为O(...原创 2019-02-25 15:22:15 · 137 阅读 · 0 评论 -
jvm
垃圾回收算法年轻代:复制算法老年代:标记清除算法和标记整理算法垃圾回收器3.1.串并行分类3.1.1.串行收集器单线程处理所有gc, 会暂停程序Serial年轻代, 复制算法Serial Old老年代, 单线程, 标记-整理算法3.1.2.并行收集器多线程处理. 也会暂停程序ParNew年轻代, Serial的多线程版本. 复制算法.Parallel Scavenge年轻代...原创 2019-02-19 21:34:39 · 239 阅读 · 0 评论 -
nio与bio
nio与bio阻塞io(bio)使用线程池问题1.线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。2.线程本身占用较大内存,像Java的线程栈,一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。3.线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统...原创 2019-02-25 01:42:51 · 233 阅读 · 0 评论 -
java基础
JAVA中的几种基本数据类型是什么,各自占用多少字节。基本数据类型各占多少个字节:数据类型 字节 默认值byte 1 0short 2 0int 4 0long 8 0float 4 0.0fdouble 8 0.0dchar 2 ‘\u0000’boolean 4 false关于boolean占几个字节,众说纷纭,虽然boolean表现出非0即1的“位”特性,但是存储空...原创 2019-02-25 00:36:37 · 164 阅读 · 0 评论 -
ConcurrentHashMap1.8
初始容量默认是16扩容,容量增倍图解1.71.8ConcurrentHashMap在1.8版本摒弃了Segment(锁段)的概念,而是启用了一种全新的CAS算法的方式实现,Node + CAS + Synchronized。数据结构沿用了与它同时期的HashMap版本的思想,底层依然由数组+链表+红黑树的方式思想。ConcurrentHashMap的Key和Value不允许null...转载 2019-02-24 23:59:57 · 410 阅读 · 0 评论 -
ascii码和unicode
ASCII码表Unicode(UTF-8, UTF-16)我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的,没啥太多不一样.其他啥文字图片之类的其他东东计算机不认识.那为了在计算机上表示这些信息就必须转换成一些数字.你肯定不能想怎么转换就怎么转,必须得有定些规则.于是...原创 2019-02-22 22:13:27 · 886 阅读 · 0 评论 -
各种集合key,value能否为null
HashMapkey,value都可以为null static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }key只能有一个为null,多个key=null的会覆盖,val...原创 2019-03-12 13:22:58 · 3153 阅读 · 0 评论 -
CopyOnWriteArrayList原理
写加锁复制数组,读不加锁,数组是volatile修饰,有可见性和有序性,所以可以读到最新值读写分离的思想,也是volatile关键字的应用添加新元素时,不在原来数组添加,而是复制出一个新数组,新数组末尾添加新元素,数组指针指向新数组。 public boolean add(E e) { final ReentrantLock lock = this.lock; ...原创 2019-03-12 13:45:59 · 76 阅读 · 0 评论 -
线程的4种创建
1.Thread2.Runnable3.FutureTask带返回值class FutureTask implements RunnableFutureinterface RunnableFuture extends Runnable, Future public static void main(String[] args) throws Exception { ...原创 2019-03-20 19:14:50 · 86 阅读 · 0 评论 -
JDK1.8 LinkedHashMap源码
LinkedHashMap,根据插入值的顺序读取key和value都可以为null,和hashmap相同使用 Map<String, String> linkedMap = new LinkedHashMap<String, String>(); linkedMap.put("a", "1"); linkedMap.put...原创 2019-04-03 13:55:19 · 216 阅读 · 0 评论