24、ArrayList的探索1

本文探讨了Java中内存溢出的问题,并通过示例展示了如何创建一个线程安全的列表CopyOnWriteArrayList。文章解释了其内部机制及在多线程环境下为何能够提高执行效率。
public class A {
	public static void main(String[] args) {
 List<Integer> l = new ArrayList<>(2147483647);
 //Exception in thread "main" java.lang.*****~~OutOfMemoryError~~ ***:** Requested array size exceeds ~~***VM limit***~~ 
//	at java.util.ArrayList.<init>(Unknown Source)
//	at com.A.main(A.java:11)
	}
}

package com;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class TestArrayList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
             // for(int i=1;i<100;i++)
			//System.out.println("\n已经打印"+i+"%");
		List<Integer>  list = new ArrayList<>();
		//List<Integer>  list =new CopyOnWriteArrayList<>();
		Collections.addAll(list, 11,22,33,44,55,66,77,88,99);
		System.out.println(list.size());  // 9
		for(Iterator<Integer> car =list.iterator(); car.hasNext();)
		{
			Integer x= car.next() ;
			if(x>30) 
			{
				car.remove();
			}
			
		}
		System.out.println(list);  //  [11, 22] 
	}




void f() {
	
	List<Integer>  list =new CopyOnWriteArrayList<>();
	Collections.addAll(list, 11,22,33,44,55,66,77,88,99);
	System.out.println(list.size());  // 9
	for(Iterator<Integer> car =list.iterator(); car.hasNext();)
	{
		Integer x= car.next() ;
		if(x>30) 
		{
			car.remove();
		}
		
	}
	System.out.println(list);  //  [11, 22] 
}
	
	/*Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
	at com.TestArrayList.main(TestArrayList.java:19)
	 JDK5中添加了新的concurrent包,其中包含了很多并发容器,这些容器针对多线程环境进行了优化,大大提高了容器类在并发环境下的执行效率。

    CopyOnWriteArrayList类是一个线程安全的List接口的实现,在该类的内部进行元素的写操作时,底层的数组将被完整的复制,
    这对于读操作远远多于写操作的应用非常适合。在CopyOnWriteArrayList上进行操作时,读操作不需要加锁,而写操作类实现中对其进行了加锁。
	 在CopyOnWriteArrayList上获得的Iterator是不能进行set和remove操作的,否则会抛出异常。* */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值