您现在的位置:首页 > 教案格式 > 正文

java 数组转字符串????回答主要是三个方面:(1)ha(2)

2018-01-23 01:02 网络整理 教案网

(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)某个类的行为与其规范一致;