java 数组转字符串????回答主要是三个方面:(1)ha(2)
(1)MD4
(2)MD5
(3)SHA-1算法
????Hashmap初始容量是16,若实际填充的容量是初始容量*负载因子,若全部填满查询的开销太大。因此hashmap的容量达到75%,就会扩容。扩容的大小是原来的一倍。
注意jdk1.8中若链表的结点数大于8,则会转化成红黑树(目的提高查询效率)
链接:
????负载因子load factor=hashmap的数据量(entry的数量)/初始容量(table数组长度),负载因子越高,表示初始容量中容纳的数据会越多,虽然在空间中减少了开销,但是大量数据聚集,造成查询上的大量开销。负载因子越低,表示初始容量中容纳的数据会越少,造成大量的内存空间浪费,但是查询的效率比较高。这是一个矛盾体,为了寻求平衡点,负载因子0.75效果是最好的。
????链接:
java/java-lo-concurrenthashmap/index.html
????要知道ConcurrentHashMap的结构、put和get方法
1、ConcurrentHashMap类中包含两个静态的内部类HashEntry
和Segment.HashEntry用来封装映射表的键值对;Segment 用来充当锁的角色,每个 Segment
对象守护整个散列映射表的若干个桶。每个桶由若干个HashEntry 对象链接起来的链表。一个ConcurrentHashMap
实例中包含由若干个 Segment 对象组成的数组。
2、用分离锁实现多个线程间的并发写操作(put方法实现的过程)
(1)key通过hash函数得到散列码
(2)散列码通过segmentFor找到对应的Segment(不允许value为空)
1)将散列值右移segmentShift 个位,并在高位填充 0
2) 然后把得到的值与 segmentMask 相“与”
3)从而得到 hash 值对应的 segments 数组的下标值
4)根据下标值返回Segment对象
(3)在Segment中执行具体的put操作
1)加锁(锁定某个segment,而非整个ConcurrentHashMap)
2)判断HashEntry 是否超过阀值(负载因子*数组长度),若超过要进行散列
3)没超过,判断键值对是否存在,采用头插法加入链表中‘;
4)然后解锁
2.5 HashMap与ConcurrentHashMap的关联与区别?
2.6 HashTable的实现原理?与ConcurrentHashMap的区别
2.7 concurrent包的并发容器有哪些?
3、java多线程问题
3.1 java实现多线程的方式及三种方式的区别
(1)继承Thread类,重写run函数
(2)实现Runnable接口(最常用)
(3)实现Callable接口
????三种方式的区别
(1)实现Runnable接口可以避免java单继承特性带来的局限,增强程序健壮性,代码能够被多个线程共享。java 数组转字符串
(2)Thread和Runnable启动线程都是使用start方法,然后JVM将此线程放到就绪队列中,如果有处理机可用,则执行run方法。
(3)实现Callable接口要实现call方法,并且线程执行完毕后会有返回值,其他的两种方法都是重写run方法,没有返回值。Callable接口提供了一个call()方法可以作为线程执行体,但call()方法比run()方法功能更为强大:call()方法可以有返回值;call()方法可以声明抛出异常。
定义:
(1)某个类的行为与其规范一致;
往往都会导致行业混乱不堪