2016-03-15 61 views
0

當java將字符串傳遞給函數時,它傳遞的值不是用於引用的傳遞引用,請點擊hereJSON解析器,它接受字符串的引用並將其解析爲JsonObject

getKeyValue(String o); // This creates a new string and passed by value 


Class A 
{ 
String o; 
} 

A a; 

getKeyValue(A a); // This passes reference of object a, String o is not duplicated. 

所以當我有一個多層次的JSON對象像{A:{B:{C: 「d」}}}和我有我需要從像得到值的路徑:乙C(路徑)

for(String s: path.split(':') 
{ 
    jsonObject = jsonObject.get(s) 
} 
println jsonObject 

假設我有2 GB的字符串,現在當我做jsonObject.get(S)我創造價值由2 GB副本,並將其傳的方法和GC需要清除所有記憶每次我試着走一步。

有沒有什麼辦法避免這種情況,而不寫一個庫來接受字符串作爲參考使用StringBuilder等..。

是否有任何庫在java中解決這個問題。

+1

* Java中的所有*都使用按值傳遞......說實話,我不清楚你在問什麼。使用'getKeyValue'方法和'Class A'的問題的前半部分特別不明確:( –

+0

)當你在Java中傳遞一個字符串時,它不會被複制,它只在你修改它時被複制,因爲Java字符串是不可變的並修改它們以創建一個新的實例 – matanso

+0

@JonSkeet True。但是當a傳遞「引用被複製爲一個值」而不是整個對象時,請檢查http://javapapers.com/core-java/java-通過值傳遞參考/ – Prabhath

回答

0

如果您必須處理2GB字符串,也許更好的方法是使用InputStream來提供json解析器。假設你正在使用Jackson,你正在閱讀的JSON來自一個文件(比如說a.json),你可以這樣做以下:

ObjectMapper objectMapper = new ObjectMapper(); 
InputStream input = new FileInputStream("data/a.json"); 
A myA = objectMapper.readValue(input, A.class); 

這種做法可能(我重複:可以)是更多的內存效率在解析它之前將整個字符串讀入內存。 關於'按值傳遞'字符串重複:如果將字符串傳遞給方法(只是對字符串的引用重複),則不會重複字符串,因此沒有內存問題。