我正在阅读一篇关于映射集合和排序它们的文章。还有一句话:
你不应该将它与 SortedSets 一起使用,以避免额外的排序 已订购的实体。
我无法理解这个说法。这对我来说很模糊。额外的排序是什么?
我也看到了很多关于这个问题的例子,但没有一个使用
@OrderBy
和 SortedSet
。他们所有人都尝试将 SortedSet
与 @SortNatural
和 @Sort
一起使用。
为什么没有人将
@OrderBy
与 SortedSet
一起使用?
但是,我看到很多使用
@OrderBy
和SortedMap
的例子?当我们尝试使用 SortedSet
时,这两个(SortedMap
和 @OrderBy
)有什么区别?
@OrderBy
会导致生成的 SQL 中出现 ORDER BY
子句。 ORDER BY
子句不会修改您得到的结果;它只是修改您获得结果的顺序。
大多数集合完全忽略您将元素放入其中的顺序:
HashSet<String> set = new HashSet<String>();
set.add("Hello"); // line 1
set.add("World"); // line 2
for (String elem : set) System.out.println(elem);
上面任意打印“Hello”,然后“World”或“World”,然后“Hello”(顺序取决于哈希码,这是一个不相关的细节。因此,“任意”这个词 - 它不是随机 - 你可以”不要依赖它的不同,并且在任何需要随机性的地方绝对不应该依赖它,因此它有一个顺序,但该顺序没有任何意义(它是任意的)。此外,交换第 1 行和第 2 行对此代码的输出没有影响。 大多数集合都是这样工作的(你放入东西的顺序与结果无关;只有你放入的
什么,而不是你放入它们的以什么顺序)。具体来说,allSortedSets 以这种方式工作,因为根据定义,排序集将始终保持其内容排序,这意味着您将元素放入其中的顺序是无关紧要的。 而且,事情是这样的:如果你要求你的数据库花时间对事物进行排序,然后你获取结果并将元素推入一个集合中,忽略你给它元素的顺序,那是..愚蠢的。毫无意义地浪费时间。因此,对于大多数集合来说,使用
@OrderBy
是一件愚蠢的事情,对于 all
SortedSets
来说也是一件愚蠢的事情。 java 中唯一有用的常用集合是 LinkedHashSet
,它被显式定义为维护将元素放入其中的顺序。即使 HashSet
不是 SortedSet
,使用 @OrderBy
然后将元素放入 HashSet
“有效”并且很愚蠢。 @OrderBy
部分除了浪费数据库资源之外没有任何影响。对于任何 SortedSet
都是一样,对于几乎所有其他实现 Set 的东西也一样(除了 LinkedHashSet
和极少数其他其文档明确表明它们保留插入顺序的东西)。