Я ни в коем случае не считаю себя экспертом по Java, но я заметил одну тревожную вещь. Есть много людей, которые утверждают, что являются «разработчиками Java», но они не имеют ни малейшего представления о том, что такое «инфраструктура коллекций Java». Этот пост предназначен для людей, которые все время зацикливаются на вопросах собеседования или мистифицируются, когда кто-то начинает говорить о разнице между множеством и списком (например).
Если вы воспользуетесь «фреймворком java collection для чайников», вы найдете эту ссылку, которая содержит более полное, хотя и довольно плотное объяснение. Я собираюсь сделать вас лучше и дать общее правило, которое вы можете использовать, не думая об этом.
В этом корень вещей, коллекция — это то, что вы можете хранить внутри. Как и в реальной жизни, коллекция мраморов — это просто «куча» мраморов. Большое различие в структуре коллекций состоит в том, что разные реализации имеют разные вещи, которые они делают с шариками, которые вам нужно понять.
Например, давайте рассмотрим ArrayList … каждый и их брат должны знать это … если нет, то вы не являетесь разработчиком Java, иди и прочитайте книгу. Некоторые особенности списка массивов: он хранит записи в порядке их добавления, вы можете выбрать элемент по его индексу, он может содержать дубликаты одного и того же элемента. С точки зрения производительности, ОЧЕНЬ быстро искать и добавлять вещи по индексу и добавлять вещи в ArrayList, в среднем, медленно, чтобы увидеть, присутствует ли конкретный объект, потому что вы должны перебрать элементы списка, чтобы увидеть, если это там.
Далее, давайте поговорим о HashSet … Я понимаю, что это может звучать неопределенно, как наркотик, связанный с непосвященными, но хэш-сет имеет некоторые интересные отличительные характеристики из списка. Во-первых, HashSet не имеет понятия порядка или индекса, вы можете добавлять к нему вещи, вы можете выполнять итерации по нему, но вы не можете искать вещи по индексу, и нет никаких гарантий того, какие вещи порядка будут вам представлены, когда он Зацикливание членов. Еще одна интересная особенность заключается в том, что он не может содержать дубликаты, если вы попытаетесь добавить один и тот же объект дважды, он НЕ потерпит неудачу, он просто вернет false и вы сможете спокойно двигаться дальше.
Наконец, что не менее важно, есть Hashtable (или его немного более опасный двоюродный брат, HashMap). Это используется для хранения пар ключ / значение. Вместо того, чтобы вводить вещи с помощью индекса (например, массива), вы можете вводить их практически любым способом. Вы можете сделать такие вещи, как myMap.put («foo», «bar»), а затем myMap.get («foo») вернет bar …
Существует много больше этого, но с этим кратким справочником вы можете по крайней мере начать делать полезные вещи в Java.
Примеры использования списка
ArrayList myList = new ArrayList(); myList.add("Second Thing"); myList.add("Second Thing"); myList.add("First Thing"); System.out.println(myList.get(0));
будет выводить
Second Thing
Интересно отметить, что размер этого составляет 3
System.out.println(myList.size());
будет выводить
3
Следующее:
for (String thing: myList) { System.out.println(thing); }
всегда будет
выводить:
Second Thing Second Thing First Thing
Далее давайте посмотрим на набор:
HashSet mySet = new HashSet(); mySet.add("Second Thing"); mySet.add("Second Thing"); mySet.add("First Thing");
Первое отличие мы видим, что
System.out.println(mySet.size());
возвращается
2
Это имеет смысл, если вы понимаете, что наборы не могут содержать дубликаты (и вы понимаете, как работает метод equals в String …;) Другая интересная вещь заключается в следующем:
for (String thing: myList) { System.out.println(thing); }
может выводить:
Second Thing First Thing
или это может вывести:
First Thing Second Thing
Бывает так, что он возвращает вторую версию на моем компьютере, но она действительно специфична для JVM / среды выполнения (это зависит от того, как реализован HashSet и как реализован хэш-код, а также от множества других переменных, которые я даже не до конца понимаю).
Что еще более важно, следующее будет, вероятно, намного быстрее для больших коллекций:
System.out.println(mySet.contains("Third Thing"));
Наконец, у дедушки все целые фреймворки, hashtable.
Hashtable myMap = new Hashtable(); myMap.put("a", "Second Thing"); myMap.put("b", "Second Thing"); myMap.put("c", "First Thing"); System.out.println(myMap.get("a"));
Будет выходной
Second Thing
и следующее:
for (Map.Entry entry: myMap.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); }
будет выводить
b=Second Thing a=Second Thing c=First Thing
Надеемся, что с этими примерами вы сможете получить представление о возможностях инфраструктуры коллекций. Это намного больше, и я призываю ЛЮБОГО, занимающегося разработкой java, тратить время на игры и изучение различных характеристик различных
компонентов, поскольку я лишь слегка скользил по поверхности.
От http://mikemainguy.blogspot.com/2011/12/java-collections-framework-for-newbies.html