Map<String, Object> sourceAsMap =ESUnit.getSourceAsMap(searchHit,searchMethod,searchField,searchFieldTwo);
String authorObjectName=sourceAsMap.get("AuthorObjectJson.Name")==null?"":sourceAsMap.get("AuthorObjectJson.Name").toString();
List<Map<String,String>> authorObjectJson=(List<Map<String, String>>) sourceAsMap.get("AuthorObjectJson");
for (Map<String, String> map : authorObjectJson) {
String a=authorObjectName.replaceAll("<em>|</em>", "");
String string = map.get("Name");
if(a.equals(string)){
map.put("Name", authorObjectName);
}
}
執行這樣的一段代碼。我在for回圈里面用map.put("Name", authorObjectName);改變的是當前遍歷的map物件,為什么authorObjectJson這個物件也跟著改變了,最神奇的是為什么sourceAsMap 這個物件里面的值也跟著變化了?
uj5u.com熱心網友回復:
你遍歷map物件不就是遍歷authorObjectJson物件嗎?遍歷時你修改了內容,當然authorObjectJson會改變啊,而authorObjectJson是sourceAsMap的值,sourceAsMap 隨之改變也很對啊注意無論你用sourceAsMap.get(key)或者for回圈,你都是拿到物件的參考地址,你修改了參考地址對應的內容,必然之前的參考也隨之修改
uj5u.com熱心網友回復:
你需要先去理解一下編程語言里的“參考傳遞”和“值傳遞”這兩個概念。簡單來說,參考傳遞傳遞的是物件本身,值傳遞傳遞的是物件“副本”。
uj5u.com熱心網友回復:
好像是這么回事。但是我這個String authorObjectName=sourceAsMap.get("AuthorObjectJson.Name")==null?"":sourceAsMap.get("AuthorObjectJson.Name").toString();不是宣告一個authroObjectName物件,然后賦值嗎?怎么還是參考地址?
uj5u.com熱心網友回復:
authorObjectName是宣告一個字串啊,這個值自始至終都沒有改變啊,改變的是authorObjectJson、sourceAsMap
uj5u.com熱心網友回復:
map.put("Name", authorObjectName); //你這個map從哪里來的?是不是從authorObjectJson里來?如果LZ能看懂以下的例子,應該就能明白
List<List<String>> authorObjectJson = new ArrayList<>();
List<String> list = new ArrayList<>();
list.add("123");
authorObjectJson.add(list);
List<String> list2 = authorObjectJson.get(0); //這里list2變數相當于LZ的map變數
System.out.println(list==list2); //你會看到這里是true,所以
list2.add("456"); //list也會增加一個"456"。list在authorObjectJson里面,那list變了,authorObjectJson是不是也變了?
這里的list2.add就相當于LZ的map.put,比覺得是map變了,但實際上map和authorObjectJson里面的東西是同一個(就好比list==list2),所以修改map,authorObjectJson也發生變化
uj5u.com熱心網友回復:
去看下:參考型別 和 值型別 的區別就知道了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/203787.html
標籤:Java EE
