360网站挂马检测网络服务有点问题别紧张试试看刷新页面

当前位置: 首页 > news >正文

360网站挂马检测,网络服务有点问题别紧张试试看刷新页面,域名网站这么做,什么样的人适合做策划集合族谱 在这些集合中#xff0c;仅有vector和hashtable是线程安全的#xff0c;其内部方法基本都有synchronized修饰。 ArrayList 底层采用Object数组实现#xff0c;实现了RandomAccess接口因此支持随机访问。插入删除操作效率慢。 ArrayList需要一份连续的内存空间。 A…集合族谱 在这些集合中仅有vector和hashtable是线程安全的其内部方法基本都有synchronized修饰。 ArrayList 底层采用Object数组实现实现了RandomAccess接口因此支持随机访问。插入删除操作效率慢。 ArrayList需要一份连续的内存空间。 ArrayList扩容机制 ArrayList添加元素时若达到了内部数组指定的数量上限会自动进行扩容 计算新容量一般是原容量的1.5倍1.5 倍是因为 1.5 可以充分利用移位操作减少浮点数或者运算时间和运算次数根据新容量创建新数组把原来的数据拷贝到新数组中更新ArrayList内部指向原数组的引用指向新数组 ArrayList哪里不安全  首先对arraylist添加一个元素分为3步 判断数组是否需要扩容如果需要就调用grow方法扩容 将数组的size位置设置值因为数组的下标是从0开始的将当前集合的大小1 多线程插入删除下ArrayList会暴露三个问题 出现null值 假设arraylist容量为10线程1检查当前size4不需要扩容于是在index4进行插入但是还没有size线程2又来进行插入检查不需要扩容且size4于是也在index4执行插入然后两个线程同时执行size就导致实际size6两次插入都在index4而index5的地方并没有插入数据。索引越界异常 还是上述例子假设线程1检查size9没有到10无需扩容于是在index9的地方插入但还没有size线程2来检查size9也在index9的地方插入然后两个线程同时导致size11。集合的size()和实际add数量不符 size不是原子操作分为三步获取size值、size1、新size覆盖老size如果两个线程拿到一样的size同时覆盖那么就导致有一次没加上。 为什么需要DEFAULTCAPACITY_EMPTY_ELEMENTDATA标识未初始化的状态 确保第一次添加元素时数组的容量扩展ArrayList 在没有明确指定容量时会使用 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 来标识该 ArrayList 尚未添加任何元素。这意味着当创建一个空的 ArrayList 时它的内部数组并不会立即分配实际的空间而是会指向一个空的数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA。这节省了内存开销。 当第一次往这个 ArrayList 中添加元素时内部数组的大小就需要扩展。因为 ArrayList 的默认初始容量是 10所以一旦添加元素数组就会重新分配一个合适的大小10来存放这些元素。避免不必要的内存分配 如果没有 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 这种标识ArrayList 每次创建时都会为空的实例分配一个固定大小的数组比如长度为 10占用内存。 通过使用 DEFAULTCAPACITY_EMPTY_ELEMENTDATAArrayList 会在初始化时使用一个空数组来表示尚未使用的状态只有在第一次添加元素时才会根据需要分配和扩展内部数组。这样可以节省内存开销。区分“空的”实例和“已初始化但无元素”实例 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 有一个特别的用途就是帮助 ArrayList 区分两种不同的状态 空实例ArrayList 没有被初始化为一个非空的数组只是一个空的实例。ArrayListInteger list new ArrayList(); 已初始化但无元素ArrayList 已经分配了一个默认大小的数组但当前还没有元素。ArrayListInteger list new ArrayList(10); LinkedList HashMap HashMap可以存储null的key和value,但null作为键key的哈希值为0只能有一个null作为值可以有多个。JDK1.8之前hashMap由数组链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)如果多个键映射到同一个槽位它们会以链表的形式存储在同一个槽位上因为链表的查询时间是O(n)所以冲突很严重一个索引上的链表非常长效率就很低了。JDK1.8后的HashMap在解决哈希冲突时有了较大的变化当链表长度大于等于8并且数组长度大于等于64时将链表转化为红黑树以减少搜索时间Ologn但是在数量较少时即数量小于6时会将红黑树变回链表。HashMap默认的初始化大小为16。之后每次扩充容量变为原来的2倍。并且HashMap总是使用2的幂作为哈希表的大小。解决哈希冲突的方法 链接法使用链表或其他数据结构来存储冲突的键值对将它们链接在同一个哈希桶中。开放寻址法在哈希表中找到另一个可用的位置来存储冲突的键值对而不是存储在链表中。常见的开放寻址方法包括线性探测、二次探测和双重散列。再哈希法当发生冲突时使用另一个哈希函数再次计算键的哈希值直到找到一个空槽来存诸键值对。哈希桶扩容当哈希冲突过多时可以动态地扩大哈希桶的数量重新分配键值对以减少冲突的概率。 HashMap哪里线程不安全 JDK1.7 HashMap采用数组链表的数据结构多线程背景下HashMap 使用头插法插入元素可能出现环形链表造成Entry链死循环多线程同时执行 put 操作可能造成前一个 key 被后一个 key 覆盖存在和数据丢失问题。JDK1.8 HashMap采用数组链表红黑二叉树的数据结构优化了1.7中数组扩容的方案解决了Entry链死循环和数据丢失问题。但是多线程背景下put方法存在数据覆盖的问题。 Entry死循环扩容时存在在原数组和新数组之间的指针切换如果没有正确地处理链表节点的 next 指针就可能导致某些节点指向自己从而形成死循环。数据丢失扩容时HashMap 的元素会被重新散列并放入新的数组桶中。如果在处理过程中存在指针的错误例如链表 next 指针没有正确地更新就可能发生丢失元素的情况某些元素可能无法在新的数组中找到正确的位置导致这些元素丢失。如果要保证线程安全可以通过这些方法来保证 多线程环境可以使用Collections.synchronizedMap( )同步加锁的方式但是这种方法是全局锁synchronized很影响性能不如使用ConurrentHashMap的分段锁更适合高并发场景使用。 HashMap的put流程jdk8 根据要添加的键的哈希码hashcode方法得出在数组中的位置即找到桶检查该位置是否为空即没有键值对存在若该位置已经存在其他键值对检查该位置的键值对的键equals方法是否与要添加的键值对相同若相同则新值覆盖旧值。put结束若和键值对的键不相同则再遍历链表或红黑树遍历桶来查找是否有相同的键和值若有则新值覆盖旧值若无则新值加到链表或红黑树中。检查链表长度是否达到8且HashMap的数组长度是否大于等于64是则将链表转换为红黑树。检查负载因子是否超过阈值默认为0.75若键值对的数量size与数组长度初始16的比值大于阈值则需要进行扩容操作。扩容操作创建一个新的两倍大小的数组。将旧数组中的键值对重新计算哈希码并分配到新数组中的位置。更新HashMap的数组引用和阈值参数。 HashMap的get方法哪里不安全 空指针异常在HashMap没有被初始化时如果尝试用null作为键调用get方法会抛出空指针异常。如果HashMap已经初始化使用null作为键是允许的因为HashMap支持null键。线程安全HashMap本身不是线程安全的。例如在一个线程中调用get方法而另一个线程同时增加或删除元素可能会导致读取操作得到错误的结果或抛出ConcurrentModificationException。如果需要在多线程环境中使用类以HashMap的数据结构可以考虑使用ConcurrentHashMap。 HashMap为啥用String作为key String对象是不可变的一旦创建就不能被修改这确保了Key的稳定性。如果Key是可变的可能会导致hashCode和equals方法的不一致进而影响HashMap的正确性。 为什么HashMap要用红黑树而不是平衡二叉树 平衡二叉树追求的是一种“完全平衡”状态任何结点的左右子树的高度差不会超过1优势是树的结点是很平均分配的导致每次进行插入/删除节点的时候几乎都会破坏平衡树的第二个规则进而需要通过左旋和右旋来进行调整使之再次成为一颗符合要求的平衡树。 红黑树不追求这种完全平衡状态而是追求一种“弱平衡”状态整个树最长路径不会超过最短路径的2倍不会像平衡二叉树一样频繁左右旋也就是栖牲了一部分查找的性能效率来换取一部分维持树平衡状态的成本。 HashTable 内部方法基本都经过synchronized修饰不可以有null的key和value。默认初始容量为11每次扩容变为原来的2n1。创建时给定了初始容量会直接用给定的大小。底层数据结构为数组链表。它基本被淘汰了要保证线程安全可以用ConcurrentHashMap。 HashSet 底层由HashMap实现key就是hashset的值所有的key的value相同是一个名为PRESENT的Object类型常量。 LinkedHashSet 底层由LinkedHashMap实现继承了HashSet类使用双向链表维护元素插入顺序。 TreeSet  底层由TreeMap实现红黑树添加元素到集合时按照比较规则将其插入合适的位置保证插入后的集合仍然有序自然顺序比如插入132输出出来是123