Использовать HashSet по ArrayList для передачи намерения?

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

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

Поэтому я советую спросить своего босса, может ли это быть наилучшим вариантом для здоровья сайта.

10
задан BryB 17 June 2009 в 08:33
поделиться

7 ответов

Также учитывайте удобочитаемость кода.

Если вы ожидаете и хотите уникальный набор, используйте структуру данных «SET», и в долгосрочной перспективе все станет намного яснее. Таким образом, это также будет способствовать лучшему кодированию.

1
ответ дан 4 December 2019 в 01:03
поделиться

Если вам нужно мыслить уникальными элементами, используйте Set. Но если вы не доверяете своим пользователям правильную реализацию equals / hashCode, я предлагаю вам задокументировать, что если что-то не так с итерацией, проверьте свой equals / hashCode! Но на самом деле это зависит от варианта использования модели данных.

2
ответ дан 4 December 2019 в 01:03
поделиться

1) полностью подделка. Не пытайтесь обходить ошибки, исправляйте их. Поэтому используйте любую реализацию Set , если порядок не имеет значения, или SortedSet , если порядок имеет значение . Если элементы не обязательно должны быть уникальными (и вы должны определить это сейчас, и обычно это никогда не должно меняться), смело используйте список .

7
ответ дан 4 December 2019 в 01:03
поделиться

Задайте, если желательно, так как это обеспечит уникальность и покажет вам где ты ошибаешься.

У вас могут возникнуть проблемы, если методы неправильно переопределены, но правильный выбор - не молиться и не вызывать их. Обнаруживайте ошибки и исправляйте их!

Edit: И да, становится понятнее, когда вы видите Set, необходимы уникальные значения и даже лучше: уникальные значения применяются. Никогда не гадайте / не верьте об использовании вашего кода;)

0
ответ дан 4 December 2019 в 01:03
поделиться

Кто-то сказал, что HashSet предлагает постоянную производительность по времени при добавлении, удалении, содержании и размере.

Фактическая инструкция в JavaDocs: «Этот класс предлагает постоянную производительность по времени для основных операций (добавить , remove, contains and size), при условии, что хеш-функция правильно распределяет элементы по сегментам . "

Это означает, что вы можете получить медленное время добавления при добавлении чего-либо в набор, если он плохо реализован Метод hashCode.

Следующий код демонстрирует, что может произойти в зависимости от вашей реализации hashCode.

public void testHashSetAddition() {
    for(int mod=10; mod <= 100; mod=mod+10 ) {
        Set s = new HashSet();
        long start = new Date().getTime();
        for(int i=0; i<100000; i++) {
            s.add(new Foo(i % mod));
        }
        long end = new Date().getTime();
        System.out.println("Mod: " + mod + " - " + (end - start) + "ms");
    }
}

class Foo {
    private int hc;
    public Foo(int i) {
        this.hc = i;
    }
    public int hashCode() {
        return hc;
    }
}

Результаты синхронизации были следующими:

Mod: 10 - 22683ms
Mod: 20 - 14200ms
Mod: 30 - 10486ms
Mod: 40 - 8562ms
Mod: 50 - 7761ms
Mod: 60 - 6740ms
Mod: 70 - 5778ms
Mod: 80 - 5268ms
Mod: 90 - 4716ms
Mod: 100 - 3966ms

Затем, выполняя точно такой же тест для ArrayList:

public void testAddingToArrayList() {
    for(int mod=100; mod >= 10; mod=mod-10 ) {
        List l = new ArrayList();
        long start = new Date().getTime();
        for(int i=0; i<100000; i++) {
            l.add(new Foo(i % mod));
        }
        long end = new Date().getTime();
        System.out.println("Mod: " + mod + " - " + (end - start) + "ms");
    }
}

Дает:

Mod: 100 - 50ms
Mod: 90 - 30ms
Mod: 80 - 40ms
Mod: 70 - 30ms
Mod: 60 - 30ms
Mod: 50 - 40ms
Mod: 40 - 20ms
Mod: 30 - 30ms
Mod: 20 - 30ms
Mod: 10 - 30ms
1
ответ дан 4 December 2019 в 01:03
поделиться

Я не думаю, что любой вариант следует рассматривать для выражения намерения - ваш метод должен быть объявлен так, чтобы возвращать просто Коллекцию с соответствующим универсальным параметром, как для гибкости и потому, что, как вы сказали, потребители должны иметь возможность просто перебирать его, не беспокоясь о его типе. Это дает дополнительное преимущество в том, что если требования изменятся позже или окажется, что по какой-то причине ваш первоначальный выбор был неправильным, вам нужно изменить код только в одном месте (вызов первоначального конструктора).

быть указано в документации метода, которая должна подробно описать, будет ли итератор коллекции возвращать элементы в каком-либо конкретном порядке и будут ли появляться повторяющиеся элементы.

0
ответ дан 4 December 2019 в 01:03
поделиться

Использование реализации Set вместо реализации List может снизить производительность. При вставке элемента в набор необходимо убедиться, что он не является дубликатом. Если вы планируете использовать только итератор, используйте самую простую возможную реализацию (ArrayList).

Я не думаю, что использовать Set только для передачи информации - хорошая идея. Если вы добавляете элементы самостоятельно и можете гарантировать, что не будут добавлены дубликаты, использовать Set бессмысленно. Используйте собственное имя для передачи информации о коллекции. Кроме того, рекомендуется открыть его через интерфейс Collection, особенно если вызывающим объектам вашего класса просто нужно выполнить итерацию по коллекции.

-1
ответ дан 4 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

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