我想了解Java Collections和Mutable元素增长的默认大小和阈值。
我创建了一个简单的程序来声明所有内容,并在最后一个SysOut语句中添加了调试器,然后检查了引用。
我已经评论了调查结果,但是,希望详细了解LoadFactor和Thresholds,如果有人可以帮助您提供简单易懂的解释。
下面是我用来获取调查结果的程序-
public class CollectionInfo {
public static void main(String[] args) {
Map<Integer,String> hashMap = new HashMap<>();
Map<Integer,String> linkedHashMap = new LinkedHashMap<>();
Map<Integer,String> treeMap = new TreeMap<>();
Set<String> hashSet = new HashSet();
Set<String> linkedhashSet = new LinkedHashSet();
Set<String> treeSet = new TreeSet();
List<String> arrayList = new ArrayList();
List<String> linkedList = new LinkedList();
List<String> vector = new Vector<>();
StringBuilder builder = new StringBuilder();
StringBuffer buffer = new StringBuffer();
//Table - 16, LoadFactor - 12, Threshhold - 0.75
hashMap.put(1, "a");
//Table - 16, LoadFactor - 12, Threshhold - 0.75
linkedHashMap.put(1, "a");
treeMap.put(1, "a");
//Table - 16, LoadFactor - 12, Threshhold - 0.75
hashSet.add("a");
//Table - 16, LoadFactor - 12, Threshhold - 0.75
linkedhashSet.add("a");
treeSet.add("a");
//ElementData - 10
arrayList.add("a");
//Has First and Last
linkedList.add("a");
vector.add("a");
//Size - 16
builder.append("a");
//Size - 16
buffer.append("a");
System.out.println("Added debugger to this line and please inspect the references");
}
}
答案 0 :(得分:1)
简而言之,
HashMap和Hashset在插入新节点时会调整其内部,而TreeMap通常不会在添加新节点时调整其节点。 ArrayList和LinkedList的方式相同:第一个调整以调整大小,而第二个则不调整。这就是为什么设置TreeMap的初始大小与尝试设置LinkedList的初始大小大致没有意义的原因。
如果您看到hashmap和arraylist具有随机访问权限,则定义初始容量和负载因子也确实有意义,但是treemap /链表必须进行顺序搜索以访问任何值,因此即使您提供初始容量也无济于事这些集合的工作方式。
stringbuilder和stringbuffer是可变的字符串操作类型,因此您需要对字符串的任何字符进行随机访问,因此很明显,这两个应该由array / arraylist类型的数据结构支持,正如我上面所说的我们需要提供初始容量来缓冲用于存储字符串字符的缓冲区,而且javadocs说
“只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。如果内部缓冲区溢出,则它会自动变大。” / p>