jdk17StringBuffer扩容机制
时间: 2023-10-19 10:06:15 浏览: 47
jdk17中的StringBuffer类采用的是动态扩容机制,具体如下:
1. 初始容量
StringBuffer的初始容量为16,即当创建一个新的StringBuffer对象时,它的初始容量为16个字符。
2. 增加容量
当向StringBuffer对象中添加字符时,如果当前容量不够,就需要增加容量。StringBuffer对象的增加容量规则如下:
- 如果添加的字符数小于等于当前容量的一半,则不需要增加容量。
- 如果添加的字符数大于当前容量的一半,则增加容量为原来的两倍再加上2。
3. 扩容
当StringBuffer对象需要增加容量时,需要进行扩容操作。扩容操作是通过Arrays.copyOf方法实现的,它会把原来的字符数组复制到一个新的字符数组中。具体步骤如下:
- 计算新的容量:原来的容量乘以2再加上2。
- 创建新的字符数组:使用Arrays.copyOf方法创建一个新的字符数组,长度为新的容量。
- 复制原来的字符数组:使用System.arraycopy方法将原来的字符数组复制到新的字符数组中。
- 更新字符数组的引用:将原来的字符数组引用指向新的字符数组。
4. 扩容后的大小
扩容后的大小是容量和添加的字符数之和。如果扩容后的大小超过了Integer.MAX_VALUE,则会抛出OutOfMemoryError异常。
相关问题
hashmap 扩容机制
HashMap的扩容机制是指当HashMap中的元素个数超过数组长度乘以负载因子时,就会重新分配一个更大的数组,并将原来的元素重新计算哈希值并插入到新的数组中。不同版本的Java实现了不同的扩容机制。在JDK1.7版本中,HashMap的默认容器长度为16,扩容因子为0.75,以2的n次方扩容,最高可扩容30次。第一次扩容是在长度达到16*0.75=12的时候开始扩容,扩容后的长度为16*2^1=32。
在JDK1.8中,HashMap的扩容机制有以下改进:
- HashMap在第一次调用put方法时才会初始化数组,而不是在创建对象时就初始化。
- HashMap在初始化或扩容时,会根据指定或默认的容量找到不小于该容量的2的幂次方,并将其赋值给阈值。
- 然后在第一次调用put方法时,会将阈值赋值给数组长度,并让新的阈值等于数组长度乘以负载因子。
- 在扩容过程中,HashMap不需要重新计算节点的哈希值,而是根据哈希值最高位判断节点在新数组中的位置,要么在原位置,要么在原长度加上原位置处。
- 在扩容过程中,HashMap会正序遍历原来的数组,并保持链表中节点的相对顺序不变。
- 如果某个链表中的节点数超过8个,并且数组长度大于等于64,则会将链表转化为红黑树,提高查找效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [hashmap 扩容机制](https://blog.csdn.net/a772304419/article/details/130835555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [HashMap的扩容机制](https://blog.csdn.net/eg1107/article/details/128228687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
jdk1.8 ConcurrentHashMap怎么扩容?
ConcurrentHashMap在JDK 1.8中的扩容机制如下:
1. 当某个线程进行put操作时,如果发现ConcurrentHashMap正在进行扩容,则该线程会与扩容线程一起进行扩容操作。
2. 如果某个线程put操作时,发现ConcurrentHashMap没有正在进行扩容,则将key-value添加到ConcurrentHashMap中,然后判断是否超过了阈值。如果超过了阈值,则进行扩容。
3. 扩容之前,先生成一个新的数组,新数组的大小是原数组的两倍。
4. 在转移元素时,首先将原数组分组,然后将每组分配给不同的线程来进行元素的转移。每个线程负责一组或多组的转移工作。
5. 在转移元素的过程中,使用CAS操作来保证线程安全。
下面是一个示例代码,演示了ConcurrentHashMap的扩容过程:
```java
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapDemo {
public static void main(String[] args) {
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
// 添加元素到ConcurrentHashMap
for (int i = 0; i < 10; i++) {
map.put(i, "value" + i);
}
// 输出当前ConcurrentHashMap的容量
System.out.println("Current capacity: " + map.size());
// 进行扩容
map.put(10, "value10");
// 输出扩容后的容量
System.out.println("New capacity: " + map.size());
}
}
```
运行以上代码,可以看到输出结果为:
```
Current capacity: 10
New capacity: 11
```