import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
List<List<String>> testlist = new ArrayList<List<String>>(); String[] items = { "lorem", "ipsum", "dolor", "purus" }; List<String> list1 = Arrays.asList(items);
System.out.println("原集合:"+list1.toString());
testlist.add(list1); // 把集合的顺序打乱
Collections.shuffle(list1);
System.out.println("打乱后集合:"+list1.toString());
testlist.add(list1); list1 = Arrays.asList(items);
Collections.shuffle(list1);
System.out.println("再次打乱后集合:"+list1.toString());
testlist.add(list1); System.out.println(testlist.toString()); }}
添加进去的元素是没有问题的,但是最后list集合所有元素只和最后一次添加进去的形同。不解,求大牛赐教!!!
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
List<List<String>> testlist = new ArrayList<List<String>>(); String[] items = { "lorem", "ipsum", "dolor", "purus" }; List<String> list1 = Arrays.asList(items);
System.out.println("原集合:"+list1.toString());
testlist.add(list1); // 把集合的顺序打乱
Collections.shuffle(list1);
System.out.println("打乱后集合:"+list1.toString());
testlist.add(list1); list1 = Arrays.asList(items);
Collections.shuffle(list1);
System.out.println("再次打乱后集合:"+list1.toString());
testlist.add(list1); System.out.println(testlist.toString()); }}
添加进去的元素是没有问题的,但是最后list集合所有元素只和最后一次添加进去的形同。不解,求大牛赐教!!!
如果你想放不同的对象,请用类似下面这种
List<List<String>> testlist = new ArrayList<List<String>>();
String[] items = { "lorem", "ipsum", "dolor", "purus" };
for(int i = 0; i < 3; i++){
List<String> list1 = Arrays.asList(items);
Collections.shuffle(list1);
testlist.add(list1);
}
对比一下你就能看出有什么不同
首先,你的代码写的有问题,没有测试性
应该这样
List<List<String>> testlist = new ArrayList<List<String>>(); String[] items = { "lorem", "ipsum", "dolor", "purus" }; List<String> list1 = Arrays.asList(items);
System.out.println("原集合:" + list1.toString());
testlist.add(list1); List<String> list2 = Arrays.asList(items);
Collections.shuffle(list2);
System.out.println("打乱后集合:" + list2.toString());
testlist.add(list2); List<String> list3 = Arrays.asList(items);
Collections.shuffle(list3);
System.out.println("再次打乱后集合:" + list3.toString());
System.out.println(testlist);
然后,说说原因,Arrays.asList() 是将一个数组 变成一个arraylist返回,当然arraylist本身就是一个数组,所以产生的arraylist其实就是对数组重新包装了一下,所以list1,list2,list3底层对应的是一个数组,Collections.shuffle() 是打乱集合,打乱任意一个list,其他都变了,是不是?
Arrays.asList() 产生的Arraylist于java.util.Arraylist 其实不是一个类,看看代码
System.out.println(list3.getClass());
System.out.println(new ArrayList<String>());
打印结果:
class java.util.Arrays$ArrayList
class java.util.ArrayList
所以看出来前者是后者的子类,对吧,你可以试试对前者进行更新操作,如删除,remove,add,看看会报什么错,想想为什么
这个回答经典。楼主根本没有搞清楚对象是怎么引用的。
但是有一个,拉出来打一顿,不放回去也在里面,即:testlist.add(list1);
只要执行一次,后面两个不执行,也是最后一次结果。list1在内存中的地址只有一份,反复加结果一样。其实一楼就说了问题所在,因为我之前也这样回答,可是别人看不懂,这里帮你解释一下原因。
list1在内存中的地址只有一份,只要是对它进行操作,所有地方都会改变。
System.out.println("原集合:"+list1.toString());
testlist.add(list1); // 把集合的顺序打乱
List<String> list2 = new ArrayList<String>();
for(String i:items){
list2.add(i);
}
Collections.shuffle(list2);
System.out.println("打乱后集合:"+list2.toString());
testlist.add(list2); List<String> list3 = new ArrayList<String>();
for(String i:items){
list3.add(i);
}
Collections.shuffle(list3);
System.out.println("再次打乱后集合:"+list3.toString());
testlist.add(list3); System.out.println(testlist.toString());
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
List<List<String>> testlist = new ArrayList<List<String>>();
String[] items = { "lorem", "ipsum", "dolor", "purus" };
List<String> list1 = Arrays.asList(items);
List<String> list2;
List<String> list3;
testlist.add(list1);
System.out.println(list1);
Collections.shuffle(list1);
System.out.println(list1);
list2 = list1;
testlist.add(list2);
System.out.println(list2);
Collections.shuffle(list2);
System.out.println(list2);
list3 = list2;
testlist.add(list3);
System.out.println(testlist.toString());
}} 即时是拥有三个不同引用 调用add()方法之后依旧存在这个问题 求大神解决
你这跟楼主的问题不是一样吗,哪有三个引用啊,这3个list都是list1
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
List<List<String>> testlist = new ArrayList<List<String>>(); String[] items = { "lorem", "ipsum", "dolor", "purus" }; List<String> list1 = new ArrayList(Arrays.asList(items));
System.out.println("原集合:" + list1.toString());
testlist.add(list1); // 把集合的顺序打乱
List<String> list2 = new ArrayList(Arrays.asList(items));
Collections.shuffle(list2);
System.out.println("打乱后集合:" + list2.toString());
testlist.add(list2); List<String> list3 = new ArrayList(Arrays.asList(items));
Collections.shuffle(list3);
System.out.println("再次打乱后集合:" + list3.toString());
testlist.add(list3); System.out.println(testlist.toString()); }}
楼主也可以把add换成addAll,那样是把list1里面的每个元素放入testlist,后面对list1操作就不会影响到了。
testlist.addAll(list);//把list中的每一个元素加到result中,testlist.size()==list.size()
testlist.add(list);//将list作为一个元素加到result中,则testlist.size()为1public class Demo {
/**
* @param args
*/
public static void main(String []args) {
List<String> testlist = new ArrayList<String>(); String[] items = { "lorem", "ipsum", "dolor", "purus" }; List<String> list1 = Arrays.asList(items);
System.out.println("原集合:" + list1.toString());
testlist.addAll(list1); List<String> list2 = Arrays.asList(items);
Collections.shuffle(list2);
System.out.println("打乱后集合:" + list2.toString());
testlist.addAll(list2); List<String> list3 = Arrays.asList(items);
Collections.shuffle(list3);
testlist.addAll(list3); System.out.println("再次打乱后集合:" + list3.toString());
System.out.println(testlist);
}}