2016-03-15 51 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); 

这种做法可能(我重复:可以)是更多的内存效率在解析它之前将整个字符串读入内存。 关于'按值传递'字符串重复:如果将字符串传递给方法(只是对字符串的引用重复),则不会重复字符串,因此没有内存问题。