listjava復制
『壹』 java中,復制一個對象,有什麼好的方法
使用Java的反射機制實現:為了能更好的區分,寫成了兩個類,可以運行下面的代碼看看效果
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) throws Exception {
Customer1 c1 = new Customer1();
c1.setName("c1");
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
c1.setList(list);
Map<String,String> map = new HashMap<String, String>();
map.put("map1", "map1");
map.put("map2", "map2");
c1.setMap(map);
Customer2 c2 = new Customer2();
//
Class c = c1.getClass();
Class class2 = c2.getClass();
Field fields[] = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getMethodName = "get" + firstLetter + fieldName.substring(1);
String setMethodName = "set" + firstLetter + fieldName.substring(1);
Method getMethod = c.getMethod(getMethodName, new Class[] {});
Method setMethod = class2.getMethod(setMethodName,
new Class[] { field.getType() });
Object value = getMethod.invoke(c1, new Object[] {});
setMethod.invoke(c2, new Object[] { value });
}
System.out.println(c2.getName());
System.out.println(c2.getList());
System.out.println(c2.getMap());
}
}
class Customer1 {
private String name;
private List<String> list;
private Map<String, String> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
class Customer2 {
private String name;
private List<String> list;
private Map<String, String> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
『貳』 java把一個list中的內容添加到另一個list中
在JAVA中,想要把一個list中的內容添加至另一個list中,有兩種方法:
採用循環的方法。通過循環第一個ArrayList,然後通過每循環一次的方式,將值賦值給另一個ArrayList。具體代碼實現如下:
2.集合是Java API所提供的一系列類,可以用於動態存放多個對象。集合與數組的不同在於,集合是大小可變的序列,而且元素類型可以不受限定,只要是引用類型。集合中不能放基本數據類型,但可以放基本數據類型的包裝類。 集合類全部支持泛型,是一種數據安全的用法。java列表是集合的一種,並且列表中的元素是有序的,且允許重復。java列表又稱為java list。
『叄』 java怎麼將list引用轉為值
直接用 newList = oldList 是引用傳遞,復制的是地址!!!!!!!
改變oldList里的內容同樣也會影響到newList
值傳遞可以用Collections.(newList, oldList)
但需要兩個List的大小一樣,即復制前還需要給newList指定長度
我認為值傳遞更方便的是newList.addAll(oldList)
『肆』 JAVA一個泛型數組List<> 怎麼復制某幾行到另外一個List<>
你明白一個單純的「?」是什麼意思嗎?它代表的是任意類型。既可以是有繼承關系的,也可以是八竿子都打不到的。比如你想寫的大約是這樣的class
gen{pulbic
<?
extends
Number>void
listMove(List
<?>list1
,
List<?>
list2,Int
i){list2.add(list1.get(i));}}但是請注意這里?號代表的是任意一個Number的子類,這意味著你如果傳入像list1
是List<Long>而list2是List<Double>這樣的同級泛型參數,就像這樣來調用這個函數list1
=
new
List<Long
>();list2
=
new
List<Double>();listMove(list1,
list2,
i);這個函數的目的顯然是把list1
的第i個元素放入list2中,但是請注意list1和list2是不相同,也沒有繼承關系的同級別類型,你正試圖把一個Long
類型放入一個只能夠放置Double類型的List
中,如果java允許你這樣來操作元素,那不是和泛型本身希望提高類型安全的目的背道而馳了嗎?這個問題里你需要注意的是,想要傳遞的類型參數是有關系的,lIst1的?號應該是list2的本身或者子類才對,你應該這樣定義你的方法,你需要對這兩個?號有一定的約束這樣來定義public
<
T
extends
Object>/*這里可以是你自己對類型的約束,我都是約束成了Object的*/void
listMove(List<?
extends
T>
list1//有條件的約束,?應該是T的子類,
List<T>
list2
,int
i){
list2.add(list1.get(i));
}
『伍』 java把一個list里的數據轉移到另外一個list
java將一個list里的數據轉移到另外一個list,可以使用for語句,一次使用add方法,示例如下:
ArrayListlist1=newArrayList();
list1.add("1");
list1.add("2");
list1.add("3");
ArrayListlist2=newArrayList();
list2.add("4");
for(inti=0;i<list1.size();i++)
{
list2.add(list1.get(i));//開始復制一個list的內容到另外一個list
}
//這樣就可以用list2添加list1的所有元素了!。想把他顯示出來可以如下
for(inti=0;i<list2.size();i++)
{
System.out.println(list2.get(i));
}
運行結果如下:
『陸』 java復制List最快方法是什麼
估計沒有快的。復制都是線性的。用多線程都不見得更快。重新設計演算法吧,避免復制
其他的復制方法
List<Integer> a = b.clone();
或
Collections.(a,b);
『柒』 java 如何指定原List其中一部分進行復制到新的list
publicstaticvoidmain(String[]args){
List<String>list1=newArrayList<String>();
List<String>list2=newArrayList<String>();list1.add("1");
list1.add("2");
list1.add("3");list2.add("a");//賦值list1前兩個到list2中
System.out.println(list2);
list2.addAll(list1.subList(0,2));//可以先按下標截取,再添加
System.out.println(list2);
}
//運行結果如下:
[a]
[a,1,2]
望採納
『捌』 Java。如何將一個LinkedList里的元素全部復制到另一LinkedList容器里
LinkedList的Clone()只是淺復制,也就是只能復制對象的引用,而不能再內存中新生成一個對象,所以你復制之後的LinkedList和原始的LinkedList中存儲的對象是共享的。
要想不共享,那隻能覆蓋你原始LinkedList中存放類的Clone()方法,在這個方法中new一個這個類的新實例,將對象的屬性賦值給一個新實例。
然後new一個新的LinkedList實例,遍歷原始LinkedList中的每個元素,調用這個元素的Clone(),將得到的新元素添加到新的LinkedList中。
大概的代碼意思如下
ElementClass是LinkedList中存儲的元素的類
public class ElementClass{
private String attributeOne;
......
public void setAttributeOne(String attValue){
this.attributeOne = attValue;
}
/* 覆蓋Clone方法,新建一個本類的實例,並將對象的屬性值完全復制過去*/
public Object Clone(){
ElementClass newInstance = new ElementClass();//新建一個本類實例
newInstance.setAttributeOne(this.attributeOne);//復制屬性
return newInstance;
}
}
LinkedList newList = new LinkedList();//新建一個LinkedList實例
Iterator it = oldList.iterator();獲取原始List的遍歷器
while(it.hasNext()){
newList .add(((ElementClass) it.next()).clone());//遍歷元素,將克隆的新對象加入新的List中
}