java
一笑而过者也
爱好java,分布式开发
展开
-
为什么HashMap的容量要是2的幂
看一下HashMap的get()方法 public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; } final Node<K,V> getNode(int hash, Object k...原创 2020-03-10 22:33:01 · 348 阅读 · 0 评论 -
为什么计算hashcode用31*
String的hashcode()方法 public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.len...原创 2020-03-10 22:19:44 · 284 阅读 · 0 评论 -
Semaphore源码解析
1. 构造函数 public Semaphore(int permits) { sync = new NonfairSync(permits); } public Semaphore(int permits, boolean fair) { sync = fair ? new FairSync(permits) : new NonfairS...原创 2020-03-08 16:37:36 · 156 阅读 · 0 评论 -
CyclicBarrier源码解析
1. 先看一下构造函数public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); this.parties = parties; this.count = parties; this.ba...原创 2020-03-07 22:28:31 · 176 阅读 · 0 评论 -
CountDownLatch源码解析
1. 首先看一下CountDownLatch的构造函数 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); }然后看一下Sync类,...原创 2020-03-07 21:11:21 · 196 阅读 · 0 评论 -
cpu100%问题定位
cpu100%问题定位程序中写一个死循环 thread = new Thread(() -> { while (true) { } }); thread.start();top -c显示进程运行详细列表键入P可以按照cpu使用率排序可以用top -p pid定位到当前进程按H,切换到线程,这时显示的是一个进程的线程信息表,这时左上角显示的Thread...原创 2020-03-07 13:52:39 · 694 阅读 · 0 评论 -
java.util.Iterator接口源码解析
介绍Iterator是一个集合迭代器,取代Enumeration,允许调用者去移除元素。如果实现类没有线程安全策略,调用里面的方法会抛出ConcurrentModificationException异常方法hasNextboolean hasNext();如果迭代器还有剩余迭代的元素,返回truenextE next();返回迭代器中的下一个元素removedefault ...原创 2018-12-22 22:48:09 · 291 阅读 · 0 评论 -
java.util.AbstractCollection源码解析
1. 介绍java.util.AbstractCollection这个类提供了对接口Collection骨骼级的实现。CollectionAbstractCollectionAbstractSetAbstractListAbstractQueueArrayDeque2. 方法2.1 iteratorpublic abstract Iterator&amp;amp;lt;E&amp;amp;gt; iterator();...原创 2018-12-16 10:26:26 · 257 阅读 · 0 评论 -
java.util.List接口
1 介绍java.util.List 一个有序的集合,有序指的是插入顺序不会变。集合是允许重复的。提供了快速创建不可变集合的方法,不可变集合中的元素不能为空。下面介绍一些List接口有Collection接口没有的方法(基于jdk11源码)CollectionListAbstractListArrayListVectorLinkedListSynchronizedListAbstractIm...原创 2018-12-15 16:39:52 · 8294 阅读 · 0 评论 -
java.util.Collection接口源码解析
Collection1. 介绍java.util.Collection是一个集合结构的根集合,jdk中没有提供直接的实现,提供了指定的子接口List、Set等,基于jdk11IterableCollectionSetListAbstractCollectionQueue2. 方法2.1 sizeint size();返回集合的数量,如果集合数量大于Integer.MAX_VALUE...原创 2018-12-15 12:31:30 · 350 阅读 · 0 评论 -
java.util.Deque双端队列
介绍java.util.Deque是一种双向线性集合,可以再两端对集合进行插入或者删除操作,所以既可以当队列(FIFO),也可以当栈(LIFO),Deque继承java.util.Queue。英文名介绍:A linear collection that supports element insertion and removal at both ends. The name deque is s...原创 2018-12-05 22:51:41 · 660 阅读 · 0 评论 -
LinkedList源码解析
介绍上一篇中ArrayDeque为数组实现的Deque,LinkedList为用链表实现的(和大学时学的链表操作是一样的,没有任何的区别)。双链表实现了List和Deque接口,允许元素为null不是线程安全的如果iterator已经构建,不通过iterator的remove或者add来改变链表,iterator将会跑出一个异常ConcurrentModificationExceptio...原创 2018-12-08 11:04:06 · 126 阅读 · 0 评论 -
ArrayDeque源码讲解
介绍上篇已经介绍了Deque的方法,这次介绍ArrayDeque的实现原理,并对几个主要方法进行讲解(基于jdk11的源码)ArrayDeque是可扩容的,内部用数组实现不允许添加null元素不是线程安全的做栈(Stack)时性能比Stack好,做队列(Queue)时性能比LinkedList好原理0tail123...length-4length-3length-2leng...原创 2018-12-07 23:41:54 · 388 阅读 · 0 评论 -
java9-快速创建不可变集合
在java9中对,List,Set,Map提供了快速创建不可变集合的方法.List.of(....) @Test public void test1(){ List<Object> list1 = List.of(12,34,543,765); //list1.add(1); System.out.println(l...原创 2018-11-08 21:47:00 · 908 阅读 · 0 评论 -
java.util.ListIterator接口源码解析
1. 介绍它是一个list迭代器,允许开发者向前或者向后去遍历一个list、修改一个list、获取迭代器在list中的位置。listIterator没有当前元素,它的位置游标在pre元素与next元素之间,所以一个长度为n的list的listIterator有n+1个可能的位置游标。注意remove和set方法不是依赖于当前游标位置,它依赖于最后一次操作的返回元素,可能是next方法,也可能是...原创 2018-12-22 22:51:55 · 215 阅读 · 0 评论 -
java.util.Spliterator源码解析
1. 介绍 可分割迭代器,用来把原来的对象元素进行分割和遍历,也可能会修改元素。可以用tryAdvance来操作一个元素,可以用forEachRemaining来批量操作元素。Spliterator可以用trySplit来分割元素,返回另一个Spliterator,用在并发操作中,相当于递归,分而治之。如果Spliterator不能分割或者分割后元素非常不均衡或者是效率差,将不会从...原创 2018-12-29 10:51:34 · 432 阅读 · 0 评论 -
Timer定时器
Timer定时器1.介绍java.util.Timer可以设置一个后台线程,有计划的执行一次或者重复的按规律执行。每一个Timer是一个后台线程,按顺序执行所有的timer的任务。所以Timer不要执行耗时的操作,否则会造成任务堆积。Timer类是线程安全的多线程任务调度,请使用:java.util.concurrent.ScheduledThreadPoolExecutor,可以完全取代...原创 2019-03-03 11:34:58 · 634 阅读 · 0 评论 -
TimerTask定时任务源码解析
TimerTask定时任务1. 介绍java.util.TimerTask是一个被Timer类执行的任务。继承Runnable接口2. 类变量有下面四种状态: int state = VIRGIN; static final int VIRGIN = 0; static final int SCHEDULED = 1; static final i...原创 2019-03-03 11:33:02 · 367 阅读 · 0 评论 -
java.lang.Iterable源码解析
Iterable介绍迭代对象接口,继承这个接口,允许一个对象用for-each循环。Collection接口继承了Iterable,子类可以通过实现此类,返回一个迭代器对象。因为迭代器里面有迭代指针,所以可以通过此接口每次返回一个新迭代器对象,这样多次调用迭代器不会造成迭代位置不可控问题。所以list、set集合对象没有直接继承Iterator类iterable Iterator<T...原创 2019-02-26 21:08:02 · 715 阅读 · 0 评论 -
java.util.ArrayList源码解析
ArrayList1. 介绍(基于jdk11)size、isEmpty、get、set、iterator、listIterator 常数时间add O(n)其他的操作也在一个线性时间2. 属性2.1 DEFAULT_CAPACITY默认容量10 private static final int DEFAULT_CAPACITY = 10;2.2 EMPTY_ELE...原创 2019-03-02 16:57:30 · 4441 阅读 · 0 评论 -
Java线程池02之ThreadPoolExecutor代码实战
请先看第一篇文章基本概念Java线程池01之ThreadPoolExecutor1. 类继承关系ExecutorExecutorServiceAbstractExecutorServiceScheduledExecutorServiceThreadPoolExecutorForkJoinPoolScheduledThreadPoolExecutor2. java代码2.1 基本使用2个...原创 2019-02-24 11:09:58 · 1005 阅读 · 0 评论 -
hashCode与equals使用场景?什么时候需要重写
概念:这里有一个约定:hashCode相等,对象不一定相等,对象相等,hashCode一定相等。为什么需要hashCode?1、 在map等集合中,通过hashCode可以很快的找到元素的位置2、比较两个对象是否相等时,先通过hashCode比较,这样速度比较快,如果不相等直接返回false为什么要重载equal方法?Object对象默认比较的是两个对象的内存地址是否一样,正常...原创 2019-02-28 08:48:20 · 3444 阅读 · 2 评论 -
Java线程池01之ThreadPoolExecutor
1. 介绍用来创建线程池2. 参数说明参数说明corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime超过corePoolSize,allowCoreThreadTimeOut(true)也可以设置核心线程数的超时时间TimeUnitkeepAliveTime时间单位workQueue阻塞任务队...原创 2019-02-23 09:41:18 · 192 阅读 · 0 评论 -
java.util.AbstractList源码解析
AbstractList1. 介绍AbstractList实现了List的一个骨骼级的实现,如果要实现不可修改的list,程序需要去扩展这个类,实现get和size方法;如果要实现可修改的list,必须额外实现set方法,如果集合的大小也可以改变,还需要实现add和remove方法。iterator和list iterator已经在这个类实现好了。AbstractCollectionAbst...原创 2018-12-29 15:01:21 · 375 阅读 · 0 评论 -
java9-模块化open/opens/use/provides...with...
opensopens 用来指定开放的包,其中public类型是可以直接访问的,其他类型可以通过反射得到.module java.house { // opens <package> 或者 opens <package> to <module1>... opens com.xhx.house;}open用来指定开放模块,...原创 2018-11-07 22:35:45 · 2046 阅读 · 0 评论 -
java8方法引用::操作符
java8中方法引用::有四种类型ClassName::NewClassName::static_methodClassName::instance_methodinstance::instance_method第一种是对构造函数的引用,相当于创建对象第二种与第四种,如果有参数会把参数当方法的实参第三种会把第一个参数当做类对象,来调用instance_method,其他参数当做方法...原创 2018-11-02 08:38:22 · 1338 阅读 · 0 评论 -
HashMap与HashTable比较总结
1.继承的类首先HashTable产生于JDK1.0,HashMap产生于JDK1.2,看类声明:public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {public clas...原创 2018-07-18 22:07:57 · 178 阅读 · 0 评论 -
java中Map循环的几种方式
package com.xhx.collection;import org.junit.Test;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/** * xuhaixing * 2018/7/15 19:59 **/public class TestHashMapApp {...原创 2018-07-18 20:57:38 · 12617 阅读 · 0 评论 -
String,StringBuilder与StringBuffer
前言: String: String类还有String类的属性都是被final修饰的,每次对象改变时相当于指向了一个新的对象,所以性能最差 StringBuilder:属于可变字符串,比String快很多,可以用toString()方法转成String对象 StringBuffer: 属于线程安全的可变字符串,方法前面都加了synchronized,当然在单线程中推荐用Strin...原创 2018-06-28 22:16:45 · 135 阅读 · 0 评论 -
Math.round函数
Returns the closest {@code long} to the argument, with tiesrounding to positive infinity.返回一个最接近的值,如果是0.5,上下距离一样,向正无穷方向取值,其实就是取较大的值。 @Test public void testRound(){ System.out.println(Ma...原创 2018-06-27 11:13:01 · 15639 阅读 · 0 评论 -
synchronized锁
前言: 在程序中,若存在多个线程同时操作共享变量,就会造成线程不安全,要保证多线程操作共享数据安全,必须加上互斥锁,同一时刻只有一个线程可以操作数据。 synchronized三种用法: 1.实例方法 2.静态方法 3.代码块我们先写出代码,查看运行结果,然后再分析1.实例方法package com.xhx.java;/** * ...原创 2018-06-30 19:19:53 · 480 阅读 · 0 评论 -
Executors创建四种线程池
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。newSingleThreadExecutor 创建一个单线程化...原创 2018-05-29 17:16:57 · 1922 阅读 · 0 评论 -
Semaphore信号量
当我们需要控制最多多少个线程同时执行时,我们需要信号量。Semaphore semaphore = new Semaphore(5);//配置最多5个线程同时执行 semaphore.acquire();//获取许可 semaphore.release();//释放许可下面是示例代码:/** * Semaphore信号量 当我们需要控制最多5个线程同时进行时,我们需要使用信号量, * ac...原创 2018-05-29 09:57:05 · 238 阅读 · 0 评论 -
多线程-等待其他线程完成CountDownLatch
CountDownLatch使用场景,所有线程执行完了,再执行等待的线程。比如:比赛完出成绩CountDownLatch latch = new CountDownLatch(10);//初始化同步计数器,只有是0时,等待的线程才会执行,初始化一次后,不可再次设置 latch.countDown(); //每执行一个线程结束,把计数手动减一latch.await(); //在等待线程中执行 ...原创 2018-05-29 09:39:29 · 696 阅读 · 0 评论 -
java线程池ThreadPoolExecutor
部分内容借鉴别的文章package com.xhx.java;import static org.junit.Assert.assertTrue;import org.junit.Test;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.SynchronousQueue;im...原创 2018-05-25 00:08:26 · 163 阅读 · 0 评论 -
Calendar工具类使用1
Calendar是一个操作时间的工具类,很方便加减时间 package com.xhx.calendar;import java.util.Calendar;import java.util.Date;/** * @author xuhaixing * @date 2018/1/20 12:09 */public class App { public static原创 2018-01-20 13:27:15 · 233 阅读 · 0 评论 -
java多线程之wait/notify/notifyAll
前言:线程的状态 Java中线程中状态可分为五类:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态),这几种状态的转换如下图因为wait()等方法执行时需要获得锁,所以需要monitor对象,所以要在Synchronized作用域内执行,否则会报错wait/notity/noti...原创 2018-07-29 13:33:09 · 295 阅读 · 0 评论 -
Stream中Collectors.groupingBy toMap mapping操作实例
groupingBy用于分组,toMap用于list转map测试代码:1.建一个实体类,测试中用package com.xhx.java;/** * xuhaixing * 2018/7/20 21:43 **/public class Student { private String name; private String sex; priva...原创 2018-07-20 23:30:19 · 26568 阅读 · 3 评论 -
map方法compute/computeIfAbsent/computeIfPresent/merge/putIfAbsent/forEach/getOrDefault
/** * forEach(BiConsumer<? super K, ? super V> action) * 循环key,value */ @Test public void testHashMapForEach(){ Map<String,Stri...原创 2018-07-22 15:54:42 · 687 阅读 · 0 评论 -
java内部类获得外部类对象
前几天遇到一个问题,在内部类中获取外部类的引用,怎么获取?外部类名.this原创 2018-11-06 22:32:13 · 6067 阅读 · 0 评论