Мое предложение было бы, что это незаконно в любом случае, так что, по крайней мере, у вас есть возможность обратиться в суд, если кто-то поцарапает сайт. Так что, возможно, лучшее, что можно сделать, - это просто добавить ссылку на оригинальный сайт и позволить людям соскрести. Чем больше они соскребают, тем больше ваших ссылок будет появляться в интернете, создавая все больше и больше страниц.
Люди, которые скребут обычно, не против включения ссылки на оригинальный сайт, поскольку он создает своего рода взаимопонимание с оригинальным автором.
Поэтому я советую спросить своего босса, может ли это быть наилучшим вариантом для здоровья сайта.
Также учитывайте удобочитаемость кода.
Если вы ожидаете и хотите уникальный набор, используйте структуру данных «SET», и в долгосрочной перспективе все станет намного яснее. Таким образом, это также будет способствовать лучшему кодированию.
Если вам нужно мыслить уникальными элементами, используйте Set. Но если вы не доверяете своим пользователям правильную реализацию equals / hashCode, я предлагаю вам задокументировать, что если что-то не так с итерацией, проверьте свой equals / hashCode! Но на самом деле это зависит от варианта использования модели данных.
1) полностью подделка. Не пытайтесь обходить ошибки, исправляйте их. Поэтому используйте любую реализацию Set , если порядок не имеет значения, или SortedSet , если порядок имеет значение . Если элементы не обязательно должны быть уникальными (и вы должны определить это сейчас, и обычно это никогда не должно меняться), смело используйте список .
Задайте, если желательно, так как это обеспечит уникальность и покажет вам где ты ошибаешься.
У вас могут возникнуть проблемы, если методы неправильно переопределены, но правильный выбор - не молиться и не вызывать их. Обнаруживайте ошибки и исправляйте их!
Edit: И да, становится понятнее, когда вы видите Set, необходимы уникальные значения и даже лучше: уникальные значения применяются. Никогда не гадайте / не верьте об использовании вашего кода;)
Кто-то сказал, что 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
Я не думаю, что любой вариант следует рассматривать для выражения намерения - ваш метод должен быть объявлен так, чтобы возвращать просто Коллекцию
с соответствующим универсальным параметром, как для гибкости и потому, что, как вы сказали, потребители должны иметь возможность просто перебирать его, не беспокоясь о его типе. Это дает дополнительное преимущество в том, что если требования изменятся позже или окажется, что по какой-то причине ваш первоначальный выбор был неправильным, вам нужно изменить код только в одном месте (вызов первоначального конструктора).
быть указано в документации метода, которая должна подробно описать, будет ли итератор коллекции возвращать элементы в каком-либо конкретном порядке и будут ли появляться повторяющиеся элементы.
Использование реализации Set вместо реализации List может снизить производительность. При вставке элемента в набор необходимо убедиться, что он не является дубликатом. Если вы планируете использовать только итератор, используйте самую простую возможную реализацию (ArrayList).
Я не думаю, что использовать Set только для передачи информации - хорошая идея. Если вы добавляете элементы самостоятельно и можете гарантировать, что не будут добавлены дубликаты, использовать Set бессмысленно. Используйте собственное имя для передачи информации о коллекции. Кроме того, рекомендуется открыть его через интерфейс Collection, особенно если вызывающим объектам вашего класса просто нужно выполнить итерацию по коллекции.