-
1、List中添加list
-
public class TestList {
-
public static void main(String[] args) {
-
List <List<Integer>> vecvecRes = new ArrayList <List<Integer>>();
-
for (int i = 0; i < 10; i++) {
-
List< Integer> list = new ArrayList <Integer>();
-
for (int j = 0; j <= 5; j++) {
-
list.add(j);
-
}
-
vecvecRes.add(list);
-
}
-
for(List<Integer> subList : vecvecRes){
-
System.out.println(subList);
-
}
-
}
-
}
结果如下:
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
2、Map中添加list
-
public static void main(String[] args) {
-
Map <Integer , List<Integer>> map = new HashMap <Integer , List<Integer>>();
-
for(int i = 0; i < 10; i++){
-
List< Integer> list = new ArrayList <Integer>();
-
for(int j = 0; j < 10; j++){
-
list.add(j);
-
}
-
map.put(i, list);
-
}
-
-
for(Integer it : map.keySet()){
-
System.out.println(it + ":" + map.get(it));
-
}
-
}
结果如下:
-
0:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
1:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
2:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
3:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
4:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
5:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
6:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
7:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
8:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
9:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
也许,您会有这样的疑问,每次都声明了List类型的list,那最后添加的不是指向的最后一个list的内容吗?
这种说法乍一听上去是对的,但仔细想想是错误的,因为每次循环声明的局部变量List<Integer> list 在每次循环完之后会被内存释放,为该循环变量分配的内存会被回收,因此,每次拿到的list都是一个新声明的list。我们可以打印哈希值来看。
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
一样的,这是为什么?????
看这篇博客吧,讲得很好:blog.csdn.net/tmdlife/article/details/51970897
至此,解决了困扰我很久的问题了。。。哈哈哈。。。
附:java中List的遍历方式:
对List的遍历有三种方式
List<String> list = new ArrayList<String>();
list.add("testone");
list.add(“testtwo”);
...
第一种:
for(Iterator<String> it = list.iterator(); it.hasNext(); ) {
....
}
这种方式在循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在寻欢过程中去掉某个元素,只能调用it.remove方法, 不能使用list.remove方法, 否则一定出现并发访问的错误.
第二种:
for(String data : list) {
.....
}
内部调用第一种, 换汤不换药, 因此比Iterator 慢,这种循环方式还有其他限制, 不建议使用它。
第三种:
for(int i=0; i<list.size(); i++) {
A a = list.get(i);
...
}
内部不锁定, 效率最高, 但是当写多线程时要考虑并发操作的问题。
-
1、List中添加list
-
public class TestList {
-
public static void main(String[] args) {
-
List <List<Integer>> vecvecRes = new ArrayList <List<Integer>>();
-
for (int i = 0; i < 10; i++) {
-
List< Integer> list = new ArrayList <Integer>();
-
for (int j = 0; j <= 5; j++) {
-
list.add(j);
-
}
-
vecvecRes.add(list);
-
}
-
for(List<Integer> subList : vecvecRes){
-
System.out.println(subList);
-
}
-
}
-
}
结果如下:
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
-
[0, 1, 2, 3, 4, 5]
2、Map中添加list
-
public static void main(String[] args) {
-
Map <Integer , List<Integer>> map = new HashMap <Integer , List<Integer>>();
-
for(int i = 0; i < 10; i++){
-
List< Integer> list = new ArrayList <Integer>();
-
for(int j = 0; j < 10; j++){
-
list.add(j);
-
}
-
map.put(i, list);
-
}
-
-
for(Integer it : map.keySet()){
-
System.out.println(it + ":" + map.get(it));
-
}
-
}
结果如下:
-
0:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
1:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
2:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
3:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
4:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
5:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
6:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
7:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
8:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
9:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
也许,您会有这样的疑问,每次都声明了List类型的list,那最后添加的不是指向的最后一个list的内容吗?
这种说法乍一听上去是对的,但仔细想想是错误的,因为每次循环声明的局部变量List<Integer> list 在每次循环完之后会被内存释放,为该循环变量分配的内存会被回收,因此,每次拿到的list都是一个新声明的list。我们可以打印哈希值来看。
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
9ebadac6
一样的,这是为什么?????
看这篇博客吧,讲得很好:blog.csdn.net/tmdlife/article/details/51970897
至此,解决了困扰我很久的问题了。。。哈哈哈。。。
附:java中List的遍历方式:
对List的遍历有三种方式
List<String> list = new ArrayList<String>();
list.add("testone");
list.add(“testtwo”);
...
第一种:
for(Iterator<String> it = list.iterator(); it.hasNext(); ) {
....
}
这种方式在循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在寻欢过程中去掉某个元素,只能调用it.remove方法, 不能使用list.remove方法, 否则一定出现并发访问的错误.
第二种:
for(String data : list) {
.....
}
内部调用第一种, 换汤不换药, 因此比Iterator 慢,这种循环方式还有其他限制, 不建议使用它。
第三种:
for(int i=0; i<list.size(); i++) {
A a = list.get(i);
...
}
内部不锁定, 效率最高, 但是当写多线程时要考虑并发操作的问题。