2026/2/16 3:14:16
网站建设
项目流程
小榄做网站企业,铜陵市建设工程管理局网站,什么是网站什么是网站建设,自己做网站挂广告怎么赚钱List实现方法#xff1a;ArrayList,LinkedList#xff08;两者都不保证线程安全#xff09;底层数据结构#xff1a;ArrayList底层使用的是Object数组#xff0c;LinkedList底层使用的是双向链表。使用场景#xff1a;ArrayList适用于需要频繁访问集合元素的场景。基于数…List实现方法ArrayList,LinkedList两者都不保证线程安全底层数据结构ArrayList底层使用的是Object数组LinkedList底层使用的是双向链表。使用场景ArrayList适用于需要频繁访问集合元素的场景。基于数组实现可以通过索引快速访问元素。当需要频繁访问和遍历集合元素的时候推荐使用ArrayList。LinkedList适用于频繁进行插入和删除操作的场景。它基于链表实现插入和删除元素的操作是需要频繁调整节点的指针因此在插入和删除操作上具有较高的性能。ArrayList的扩容机制扩容的前置核心前提ArrayList底层是基于定长数组实现的内部维护了一个核心的数组属性elementData所有元素都存放在这个数组中这个数组的长度就是ArrayList当前的容量。扩容的本质就是解决数组长度不可变的问题当数组存满的时候创建新的更大的数组把原数组元素复制过去从而实现容量的增长。初始化容量规则初始化时底层数组elementData赋值为一个空数组只有在第一次调用add方法时容量扩充为10。触发机制当前元素个数待添加元素个数 底层数组的容量。扩容规则默认1.5倍扩容。扩容本质调用Arrays.copyOf()创建新数组拷贝原数组元素重新赋值引用。Set实现方法HashSetHashSet的实现原理HashSet基于HashMap实现的HashSet底层使用HashMap来保存所有元素相关HashSet的操作基本上都是调用底层HashMap相关方法来完成。Map实现方法HashMapHashTableConcurrentHashMap后面两个线程安全HashMap底层实现原理HashMap底层数据结构在Java8之前是数组链表的形式在Java8之后是数组链表红黑树的形式。初始化和扩容机制当创建时默认长度为0调用put方法长度会扩容为16当我们里面的元素个数/总容量超过默认负载因子0.75时就会进行扩容每次扩容2倍。扩容规则添加后当链表长度大于8且数组容量大于等于64时则将链表转为红黑树追加完毕或转为红黑树如果数组内的元素个数大于数组长度*负载因子则进行扩容。添加元素过程当添加对象是首先会对key进行hashCode运算再调用HashMap的hash方法进行二次哈希计算出桶下标如果当前下标内容为空直接添加不为空时则判断key的hashCode是否一致如果不一致就向后找直到下标为空时添加如果一致则进行equals运算判断内容是否相同相同则将value进行替换。索引下标的计算方法JDK1.8之前取模数组长度。JDK1.8之后与当前容量-1进行位运算ConcurrentHashMap和HashTable底层数据结构JDK1.7的ConcurrentHashMap底层采用分段的数组链表实现JDK1.8采用的数据结构跟HashMap1.8的结构一样数组链表/红黑树。HashTable和JDK1.8之前的HashMap的底层数据结构类似都是采用数组链表的形式数组是HashMap的主体链表则是主要为了解决哈希冲突存在的。实现线程安全的方法在JDK1.7的时候ConcurrentHashMap对整个桶数组进行了分割分段(Segment分段所每一把锁只能锁其中一部分数据多线程访问容器里不同数据段的数据就不会存在锁竞争提高并发访问率。到了JDK1.8的时候用Node数组链表红黑树的数据结构来实现并发控制使用synchronized和CAS来操作。Hashtable同一把锁使用synchronized来保证线程安全。当一个线程访问同步方法时其他线程也访问同步方法可能会进入阻塞或轮询状态。