当我在treeSet上添加我的数据时,几乎丢失了所有数据.似乎我只有我的第一个元素.
我读了这个问题Hashset vs Treeset进行代码优化,我尝试做类似的事情.但我并没有真正成功.
输入:
int iValue = 0;
HashSet<TagResult> results = new HashSet<TagResult>();
for(Document doc : docs) {
NodeList nList = doc.getElementsByTagName("TEXT");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
iValue = searchWords.searchOnTag(eElement, szSearch);
if(iValue > 0) {
results.add(new TagResult(eElement, iValue));
}
}
}
}
System.out.println("Set :\n-------------------------");
for(TagResult result : results) {
System.out.println(getTagValue("Tag",result.getElement()));
}
Set<TagResult> sortedResult = new TreeSet<TagResult>(new Comparator<TagResult>() { …Run Code Online (Sandbox Code Playgroud) 我读到了 TreeSet 比 HashSet 慢的原因(将元素添加到 TreeSet 中更慢)所以我进行了性能测试,我试图找出将元素添加到 HashSet 然后将它们移动到 TreeSet 或首先把它们放在那里。看起来将元素插入 HashSet 更快,但只有当我插入大量元素时,为什么?我读过,如果我不需要对元素进行排序,请始终使用 HashSet,但显然,有时它会更慢。
当我插入一个具体的值(“1”)而不是随机数时,TreeSet 也更快,因为没有排序,那么我怎么知道什么时候使用 HashSet 或 TreeSet?
我的第二个问题,当我像这样创建 TreeSet 时,为什么我不能访问“NavigableSet”方法?
Set<Integer> treeSet = new TreeSet<Integer>(); //cant type treeSet.lower(e: E)
TreeSet<Integer> treeSet = new TreeSet<Integer>(); //can type treeSet.lower(e: E)
Run Code Online (Sandbox Code Playgroud)
谢谢你帮我解决这个问题。
结果如下:
5 000 000(随机数)

5 000 000(数字“1”)

500 000(随机数)

50 000(随机数)

这是我的代码:
package performancetest;
import java.text.DecimalFormat;
import java.util.HashSet;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.TreeSet;
public class HashSet_vs_TreeSet {
private static DecimalFormat df = new DecimalFormat("#.#####");
private static double hashTime, …Run Code Online (Sandbox Code Playgroud) 是否打开contains方法TreeSet(因为它已经默认排序)比说快HashSet?
我问的原因是Collections.binarySearch如果List被排序的话会很快,所以我想也许TreeSet的contains方法可能是相同的.
public class ArrayOfArrayList {
public static void main(String[] args) {
List<Date> dateList1 = new ArrayList<Date>();
List<Date> dateList2 = new ArrayList<Date>();
Calendar cal = new GregorianCalendar();
for(int i = 0; i < 5; i++) {
Date d1 = new Date();
cal.setTime(d1);
cal.add(Calendar.DATE, i);
dateList1.add(cal.getTime());
}
System.out.println(" *************** Date List 1st ****************");
for(Date date1 : dateList1) {
System.out.println("1stList"+date1);
}
System.out.println(" *************** Date List 1st ****************");
for(int i = 2; i < 8; i++) {
Date d2 = new Date();
cal.setTime(d2);
cal.add(Calendar.DATE, i); …Run Code Online (Sandbox Code Playgroud) 我发现对于相当大的数组(超过1000个条目),这些方法比A.removeAll(B)a更快.HashSetArrayList
您是否知道如何实施这些方法以及如何解释这些差异?
码.
Set<String> set = new HashSet<String>(3);
set.add("3 Lorem");
set.add("1 Lorem");
set.add("2 Lorem");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String type = (String) iterator.next();
System.out.println(type);
}
Run Code Online (Sandbox Code Playgroud)
输出.
2 Lorem
3 Lorem
1 Lorem
Run Code Online (Sandbox Code Playgroud)
这个命令对我来说很奇怪.我添加3 Lorem,1 Lorem然后2 Lorem.为什么它们在输出中的顺序不同?
按照这个
HashSet的基础数据结构是哈希表.
但我还读到HashSet在内部使用HashMap来避免重复值,而重复值又在内部使用了桶数组和LinkedList(在Java 8中由树替换)
那么说HashSet使用HashTable作为数据结构和HashMap作为集合是正确的吗?
TreeSet实现SortedSet接口,因此不允许重复值.
这是否意味着TreeSet不在内部使用HashMap来使用HashSet来避免重复值?LinkedHashSet是否在内部使用HashMap?
按照这个
建议不要使用内存点视图数组.
为什么?通过我之前阅读的内容 -
由于无法为原始数据类型创建ArrayList,因此ArrayList的成员始终引用不同内存位置的对象(有关详细信息,请参阅此处).因此,在ArrayList中,实际对象永远不会存储在连续的位置.实际对象的引用存储在连续的位置.在数组中,它取决于数组是基本类型还是对象类型.在原始类型的情况下,实际值是连续的位置,但是在对象的情况下,分配类似于ArrayList.
java ×7
hashset ×4
arraylist ×3
collections ×2
treeset ×2
contains ×1
duplicates ×1
hashmap ×1
performance ×1
removeall ×1
set ×1
union ×1