Java: ArrayList для списка, HashMap для карты и HashSet для набора?

Просто для будущих людей, которые находят эту проблему, и вышеуказанные решения не работают для них: я обнаружил проблему с моим селектором и добавленным элементом, который не имеет такой же случай, т.е. был добавлен <div class="card">.

Надеюсь, это поможет.

5
задан GreenieMeanie 22 May 2009 в 02:22
поделиться

10 ответов

Those are definitely my default, although often a LinkedList would in fact be the better choice for lists, as the vast majority of lists seem to just iterate in order, or get converted to an array via Arrays.asList anyway.

But in terms of keeping consistent maintainable code, it makes sense to standardize on those and use alternatives for a reason, that way when someone reads the code and sees an alternative, they immediately start thinking that the code is doing something special.

I always type the parameters and variables as Collection, Map and List unless I have a special reason to refer to the sub type, that way switching is one line of code when you need it.

I could see explicitly requiring an ArrayList sometimes if you need the random access, but in practice that really doesn't happen.

10
ответ дан 18 December 2019 в 07:56
поделиться

Для некоторых списков (например, слушателей) имеет смысл использовать CopyOnWriteArrayList вместо обычного ArrayList . Почти для всего остального достаточно упомянутых вами базовых реализаций.

3
ответ дан 18 December 2019 в 07:56
поделиться

Yep, I use those as defaults. I generally have a rule that on public class methods, I always return the interface type (ie. Map, Set, List, etc.), since other classes (usually) don't need to know what the specific concrete class is. Inside class methods, I'll use the concrete type only if I need access to any extra methods it may have (or if it makes understanding the code easier), otherwise the interface is used.

It's good to be pretty flexible with any rules you do use, though, as a dependancy on concrete class visibility is something that can change over time (especially as your code gets more complex).

2
ответ дан 18 December 2019 в 07:56
поделиться

Действительно, всегда используйте базовые интерфейсы Collection, List, Map вместо их реализации. Чтобы сделать thinkgs еще более гибкими, вы можете скрыть свои реализации за статическими фабричными методами, которые позволят вам переключиться на другую реализацию, если вы найдете что-то получше (я сомневаюсь, что в этом поле будут большие изменения, но вы никогда не знаете). Еще одним преимуществом является то, что синтаксис стал короче благодаря обобщениям.

Map<String, LongObjectClasName> map = CollectionUtils.newMap();

instead of 

Map<String, LongObjectClasName> map = new HashMap<String, LongObjectClasName>();


public class CollectionUtils {
.....

public <T> List<T> newList() {
        return new ArrayList<T>();
    }

    public <T> List<T> newList(int initialCapacity) {
        return new ArrayList<T>(initialCapacity);
    }

    public <T> List<T> newSynchronizedList() {
        return new Vector<T>();
    }

    public <T> List<T> newConcurrentList() {
        return new CopyOnWriteArrayList<T>();
    }

    public <T> List<T> newSynchronizedList(int initialCapacity) {
        return new Vector<T>(initialCapacity);
    }

...
}
2
ответ дан 18 December 2019 в 07:56
поделиться

Только что выйдя из класса, посвященного производительности структуры данных, я обычно смотрю на тип разрабатываемого мной алгоритма или на цель структуры, прежде чем выбирать реализацию.

Например, если я создаю список с множеством случайных обращений к нему, я буду использовать ArrayList, потому что его производительность произвольного доступа хороша, но если я часто вставляю элементы в список, я могу вместо этого выберите LinkedList. (Я знаю, что современные реализации устраняют множество препятствий для производительности, но это был первый пример, который пришел в голову.)

Возможно, вы захотите посмотреть на некоторые страницы Википедии для структур данных (особенно тех, которые имеют дело с сортировкой] алгоритмы , где производительность особенно важна) для получения дополнительной информации о производительности,

1
ответ дан 18 December 2019 в 07:56
поделиться

На самом деле у меня нет "значения по умолчанию", хотя я полагаю, что чаще всего использую реализации, перечисленные в вопросе. Я думаю о том, что было бы подходящим для той конкретной проблемы, над которой я работаю, и использую это. Я не просто слепо по умолчанию использую ArrayList , я задумался на 30 секунд примерно так: «ну, я собираюсь много повторять и удалять элементы в середине этого. list, поэтому я должен использовать LinkedList ".

И я почти всегда использую тип интерфейса для справки, а не реализацию. Помните, что List - не единственный интерфейс, который реализует LinkedList . Я часто это вижу:

LinkedList<Item> queue = new LinkedList<Item>();

тогда, когда программист имел в виду был:

1
ответ дан 18 December 2019 в 07:56
поделиться

Использование типа интерфейса ( Список, Карта ) вместо типа реализации ( ArrayList, HashMap ) не имеет отношения к методам - ​​это в основном важно в общедоступные API, то есть сигнатуры методов (и «общедоступный» не обязательно означает «предназначенный для публикации вне вашей команды).

Когда метод принимает ArrayList в качестве параметра, и у вас есть что-то еще , вы облажались и должны бессмысленно копировать свои данные. Если тип параметра - Список , вызывающие абоненты намного более гибкие и могут, например, использовать Collections.EMPTY_LIST или Collections .singletonList () .

0
ответ дан 18 December 2019 в 07:56
поделиться

Я обычно использую один из классов * Queue для очередей. Однако LinkedList - хороший выбор, если вам не нужна потокобезопасность.

0
ответ дан 18 December 2019 в 07:56
поделиться

Если вы используете LinkedList для очереди, вы можете вместо этого рассмотреть возможность использования интерфейса Deque и класса реализации ArrayDeque (представленного в Java 6). Процитируем Javadoc для ArrayDeque:

Этот класс, вероятно, будет быстрее, чем Стек при использовании в качестве стека и быстрее чем LinkedList при использовании в качестве очереди.

1
ответ дан 18 December 2019 в 07:56
поделиться

Я тоже обычно использую ArrayList, но я буду использовать TreeSet или HashSet в зависимости от обстоятельств. Однако при написании тестов также часто используются Arrays.asList и Collections.singletonList. В основном я писал локальный для потока код, но я также мог видеть использование различных параллельных классов.

Кроме того, были времена, когда я использовал ArrayList, когда мне действительно нужен был LinkedHashSet (до того, как он был доступен).

0
ответ дан 18 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: