该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。
Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化。
在序列化的时候会调用方法,将和写入;反序列化时调用,从获取和,再恢复到。?
原因在于是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,那么有些空间可能就没有实际存储元素,采用上诉的方式来实现序列化时,就可以保证只序列化实际存储的那些元素,而不是整个数组,从而节省空间和时间。
优点:
因为其底层是数组,所以修改和查询效率高。
可自动扩容(1.5倍)。
缺点:
插入和删除效率不高。
线程不安全。
插入效率比平衡二叉树高,查询效率比普通二叉树高。所以选择性能相对折中的红黑树。
备注:为什么是8,6?个人认为7是临界点 3层深度,在临界点加减1.
备注:tab[index=(n - 1) & hash]----解释了为什么需要2的次幂作为数组的容量。由于n是2的次幂,因此,n-1类似于一个低位掩码。通过与操作,高位的hash值全部归零,保证低位才有效 从而保证获得的值都小于n。(还有就是扩容不是原索引就是原索引+原容量)
但是,使用了该功能之后,由于只取了低位,因此 hash 碰撞会也会相应的变得很严重。这时候就需要使用「扰动函数」^ (h >>> 16)该函数通过将哈希码的高16位的右移后与原哈希码进行异或而得到。此方法保证了高16位不变, 低16位根据异或后的结果改变。
?
虽然设计的非常优秀, 但是应该尽可能少的避免?, 该过程会很耗费时间。
同时, 由于不能自动的缩小容量 因此,如果你的容量很大,但执行了很多?操作时,容量并不会减少。如果你觉得需要减少容量,请重新创建一个 hashmap。
?