Понимание коллекций и таблиц Java - размеры, коэффициенты загрузки и пороговые значения - PullRequest
0 голосов
/ 22 декабря 2018

Я хотел понять размер по умолчанию и пороговые значения, при которых растут Коллекции Java и изменяемые элементы.

Я создал простую программу для объявления их всех и добавил отладчик в последний 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");

    }
}

1 Ответ

0 голосов
/ 22 декабря 2018

Проще говоря,

HashMap и Hashset корректируют свои внутренние компоненты по мере добавления новых, TreeMap обычно не корректирует свои узлы при добавлении новых.Так же, как ArrayList и LinkedList: первый настраивается для изменения размера, а второй - нет.Вот почему установка начального размера TreeMap примерно так же бессмысленна, как попытка установить начальный размер LinkedList.

Если вы видите, что hashmap и arraylist имеют произвольный доступ, имеет смысл также определить начальную емкость икоэффициент загрузки, но древовидная карта / связанный список должен выполнять последовательный поиск для доступа к любому значению, поэтому даже если вы предоставите начальную емкость, это не будет иметь смысла, так как эти коллекции работают.

stringbuilder и stringbuffer являются изменяемым типом строкиманипулирование и для этого вам нужно иметь произвольный доступ к любым символам строки, так что очевидно, что эти два должны быть поддержаны структурой данных типа массива / массива, и, как я сказал выше, нам нужно предоставить начальную емкость для буфера для хранения символа строкиа также javadocs говорит

"Пока длина символьной последовательности, содержащейся в строковом буфере, не превышает емкости, нет необходимости выделять новый массив внутреннего буфера. Если интерфейсПереполнение буфера в буфере, оно автоматически увеличивается. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...