juc-ThreadPool(线程池)
jdk线程池的分为两类:ExecutorService和ScheduledExecutorService
jdk对应的实现类为ThreadPoolExecutor和ScheduledThreadPoolExecutor
ThreadPoolExecutor组成12345678new ThreadPoolExecutor(int corePoolSize, int maxinumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);//corePoolSize --核心线程数,线程池中创建的线程数小于核心线程数时,线程空闲也不会被回收;大于核心线程数时,线程空闲时间超过keepAliveTime个unit单位,线程就会被回收//maxinumPoolSize --最大线程数,线程池中所能创建的最大的线程个数,超过将执行handler里面的拒绝策略. ...
juc-atomic类
Atomic应用归纳12345678910111213141516171819202122232425//原子包装对象处理类AtomicInteger atomicInteger = new AtomicInteger();AtomicBoolean atomicBoolean = new AtomicBoolean();AtomicLong atomicLong = new AtomicLong();AtomicReference<Object> objectAtomicReference = new AtomicReference<>();//解决ABA问题处理类AtomicStampedReference<Integer> objectAtomicStampedReference = new AtomicStampedReference<>(new Integer(1), 1);AtomicMarkableReference<Integer> objectAtomicMarkableReference = new Ato ...
juc-关键字synchronized
synchronized使用方式修饰类对象
修饰对象
修饰静态成员方法
修饰成员方法
总结
java的synchronized关键字是跟对象一起配合使用的,表示给这个对象加锁,加锁对象作用的代码块只能获取锁对象的线程使用,其他线程运行到该代码块,会尝试获取该对象的锁,如果该对象已经被其他线程加锁了,其他线程只能阻塞.当获取锁对象的线程执行完代码块后,它会释放锁对象,然后唤醒在获取该锁对象的所有线程,他们会再竞争获取对象锁资源.获取到对象锁资源的线程会执行代码块,没有获取到对象锁资源的会继续阻塞,等待获取对象锁资源的线程执行完代码块将其再次唤醒.
synchronized修饰后对应的字节码1.在代码块里面修饰对应的就是monitorenter和monitorexit分别为获取对象锁和释放对象锁,如图:
2.在方法上修饰对应的就是访问修饰符,如图:
Access flags对照表见《class文件结构》第8点方法,方法的静态修饰符static为0x0020
JVM对synchronized的优化java的Hotspot虚拟机的对象头主要包括两部分:Mark Word(标记字段)、Kla ...
juc-关键字volatile和final
内存模型
物理机的内存模型
JMM内存模型(虚拟的)
为什么要有这么多CPU缓存
因为CPU处理指令的性能很高,而CPU直接从内存中读取数据的性能相对来说就很慢了,所以如果直接都从内存中读取数据,会严重拖慢PC的处理速度.所以才会有CPU缓存,一般都是3级缓存,级别越高CPU读取性能越高,CPU内存也有寄存器,它的读取性能是最高的.
java虚拟机(JIT编译器)会对字节码指令做重排序,目的是为了提升字节码指令的执行性能.在单线程的执行情况下,指令重排序是不会影响数据结果的正确性的.但是在多线程的情况下,指令重排序就可能会影响计算结果的正确性.
为了解决以上两点,就可以使用java的volatile关键字来修饰成员变量,来保证该变量读取或写入的时候直接刷新PC的主存,读取变量的字节码指令前加入读取屏障,保证读取变量以及之后的字节码指令的有序性.写入变量的字节码指令之后加入写屏障,保证写入变量以及之前的字节码指令的有序性.(注意volatile在多线程读写计算变量的时候也不能保证结果的正确性,这个使用需要使用锁(如synchronized)来进行同步,从而保证字节码指令执行的原子性) ...
java代码模拟浏览器发送请求的工具类
代码工具类
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130package com.jiange.threadpooltest.httpclient;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection; ...
POI和Excel
导入POI的包1234567891011<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version></dependency>
创建excel写入工厂类-ExcelWriterBuilder(核心)1.创建ExcelWriterBuilder对象(有参、无参)
2.创建Sheet方法(buildSheet)
3.导入list对象数据(importDataToExcel)
4.将数据持久化到本地 ...
数组和集合
数组转集合12345String[] strArray = new String[]{"aaa","bbb","ccc"};//注意此时转出来的集合对应不是java.util.ArrayList对象,是Arrays内部的一个ArrayList对象,继承自AbstractList,该父类的add和remove方法会抛出异常List<String> strArray2List = Arrays.asList(strArray);//如需转换成java.util.ArrayList对象,可使用构造方法转换List<String> strArray2List = new ArrayList(Arrays.asList(StrArray));
集合转数组12345List<String> strList = new ArrayList(){{add("aaa");add("bbb");add("ccc&quo ...
位运算相关
位运算整理
名称
符号
例子
推理公式
运用场景
右移
>>
5>>2=1-5>>2=-2
非负数右移2位为除以4负数右移两位为正数除以4余数为0,则值就为该值的负数,否则为该值+1的负数
非负数的除法运算,运算效率比除运算效率高
无符号右移
>>>
5>>>2=1-5>>>2=2^30-2
非负数和右移运算结果一致,负数为2^(32-右移位数)-(负数右移的结果)
待确认
左移
<<
5<<2=20-5<<2=-20
左移为乘以4
替换乘法运算
按位与
&
0&0=0;0&1=0;1&1=1
按位&运算
判断奇偶性(&1)
按位或
0
0=0;0
按位异或
^
0^0=0;0^1=1;1^1=0
按位^运算
a,b交换值不需要用临时变量
按位取反
~
0=-1;1=-2;~-1=0
~n=-(n+1)
如果为该公式时,可以用n取反代替
运用场景:1234567891011 ...
字符集所占java字节数整理
常用字符集占字节数码表整理
常用字符集
所占字节数
英文/字节
中文/字节
说明
ASCII
单字节(0x00-0x7F)
1
不支持中文
国际标准,ISO/IEC 646
Latin1(别名ISO8859-1)
单字节(0x00-0xFF)
1
不支持中文
向下兼容ASCII,还包括西欧语言,希腊语,泰语,阿拉伯语,希伯来语
ANSI
单双字节(0x0000-0xFFFF)单字节仅表示ASCII
1
2
不是单一明确的字符编码,是对不同国家和地区不同编码的一个统称(如GB2312,GBK,BIG5,Shift_JS)
GB2312
单双字节(0x0000-0xFFFF) 单字节仅表示ASCII
1
2
标准简体中文字符集,1980年发布,1981年5月实施,收录6763个汉字GB1300双字节(0x0000-0xFFFF)121993年发布,收录中国大陆、台湾、日本及韩国通用字符集的汉字,总共有20,902个.因为没有兼容GB2312,并没有得到广泛应用,如今已被废弃
Big5
双字节(0x0000-0xFFFF)
1
2
大五码或五大码,共收录13060个 ...
String
注意:JDK9(印象中对底层容器做了改动,由char数组变成了byte数组,节约了内存空间),JDK11已经变了,JDK8是char[]数组,所以对应的equals比较方法也做了改变
split以竖线分割时注意事项竖线前需要添加双反斜杠才能以竖线分割符切分,同理如果以双竖线切分时,每个竖线以双斜杠开头,示例如下:
1234567String aaa = "111|2222|333";//竖线前面需跟双反斜杠String[] splits = aaa.split("\\|");String bbb = "111||222||333"//每个竖线前面需跟双反斜杠String[] doubleSplits = bbb.split("\\|\\|");
按编码集的字节长度截取字符串123456789101112131415161718public static String subStringByBytes(String s,int num, String encodeName){ if ...
