2015-01-16 33 views
-2

代碼:限制字符串值,而產生的隨機值

public class setExample { 

public static void main(String[] args) throws IOException { 

    HashSet<String> hs = new HashSet<String>(); 
    HashSet<String> hs1 = new HashSet<String>(); 

    int i; 
    long startTime = 0,midTime = 0; 
    long endTime = 0, difference, diff; 


    startTime = System.nanoTime(); 

    for(i = 0; i < 10000000 ; i++) 
    { 
     hs.add(i+""); 
    } 

    ArrayList<String> arraylist = new ArrayList<String>(hs); 
    Collections.sort(arraylist); 
    endTime = System.nanoTime(); 
    difference = endTime - startTime; 
    System.out.println("Time taken for sorted values in hashset is " +difference); 

    midTime = System.nanoTime(); 
    for(i = 0; i < 10000000 ; i++) 
    { 
     hs1.add((int)(Math.random()*100000000)+""); 
    } 
    ArrayList<String> arraylist1 = new ArrayList<String>(hs1); 
    Collections.sort(arraylist); 
    long endTime1 = System.nanoTime(); 
    long difference1 = endTime1 - midTime; 
    System.out.println("Time taken for random values in hashset is " +difference1); 
}} 

當運行上述代碼我得到以下輸出。爲什麼生成的隨機字符串有問題?

輸出:

Time taken for sorted values in hashset is 14334316768 
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.lang.Integer.toString(Integer.java:308) 
    at java.lang.Integer.toString(Integer.java:118) 
    at java.lang.String.valueOf(String.java:2931) 
    at learn.setExample.main(setExample.java:43) 
+1

這就是10000000 ... –

+0

使用-Xmx java參數增加你的堆。像'-Xmx512m' – bedrin

+0

您的JVM內存不足。你可以限制你的內部計數最小化還是增加你的堆大小? –

回答

0

由於兩者都具有壽命,直到節目結束 ,因此加入到散列集的數據也不能用於 垃圾收集的散列集,因此您最終可能會收到失敗 錯誤。

最重要的是我們正在研究的字符串池,在這裏我們增加了這麼多的字符串,如stringpool將繼續根據創建的,因此最終的解決方案可以通過以下方式增加堆大小String對象的數量增加配置-Xmx512m。