java-集合类(二)
使用场景
1.多线程
(1)在jdk1.5之前原始的集合类中,仅仅有vector、stack、hashtable、enumeration等是线程安全的,其它的都是非线程安全的。
非线程安全的集合在多线程操作中,会出现脏数据,如
final List<String> tickets = new ArrayList<String>();
for (int i = 0; i < 100000; i++) {
tickets.add("NO," + i);
}
System.out.println("start1...");
for (int i = 0; i < 5; i++) {
Thread thread = new Thread() {
public void run() {
while (true) {
if (tickets.size() > 0)
System.out.println("thread:"+Thread.currentThread().getId()+" "+ tickets.remove(0));
else
break;
}
}
};
thread.start();
}
执行结果:
......
thread:13 NO,98687
thread:12 NO,96534
thread:10 NO,96534
thread:10 NO,98687
......
thread:10 null
thread:12 null
线程不安全导致多个线程调用 remove 时同一时候操作 List 进行读写。
ArrayList改动成 Stack,问题解决。
(2)线程安全的集合也须要遵守fail-fast的检測机制,即在迭代的时候,不能改动集合的元素。一旦发现违反这个规定就会抛出ConcurrentModificationException异常。
如需在迭代过程中改动元素,须要对迭代和改动加同步锁。
如以下代码将出现ConcurrentModificationException异常。
final List<String> tickets = Collections
.synchronizedList(new ArrayList<String>());
for (int i = 0; i < 100; i++) {
tickets.add("NO," + i);
}
System.out.println("start1...");
for (int i = 0; i < 5; i++) {
Thread thread = new Thread() {
public void run() {
while (true) {
if (tickets.size() > 0)
System.out.println("thread:"
+ Thread.currentThread().getId() + " "
+ tickets.remove(0));
else
break;
}
}
};
thread.start();
}
System.out.println("start2...");
new Thread() {
public void run() {
for (String s : tickets) {
System.out.println(s);
}
}
}.start();
(3)获取线程安全的集合
1.使用vector、stack、hashtable、enumeration等线程安全的集合类。
2.使用Collections.synchronizedxxx 将非线程安全的集合转换成线程安全的集合。
3.使用 jdk1.5之后新的线程安全集合类。如ConcurrentLinkedQueue、ConcurrentHashMap等。
2.使用注意事项
(1)ArrayList 等顺序存放集合适合随机訪问,LinkList 等链表形式存放集合适合插入删除和迭代操作。
(2)Collection接口继承了Iterable接口,除 map 外每一个集合都支持迭代遍历和 foreach 功能。
(3)WeakHashMap支持 key 回收。提升性能,在开源项目Android-Universal-Image-Loader 中用WeakHashMap保存须要显示的 ImageView 支持回收。
(4)HashMap 的 key 推断同样的标准是 key 的 equal 和 hashcode 同样。例如以下
private static void testHashMapKey() {
System.out.println("------test hash map key start------");
String[] sampleTest = { "Aa", "BB", "aa" };
HashMap<StringEqual, Integer> strHaspMap = new HashMap<HashMapDemo.StringEqual, Integer>();
StringEqual[] strArray = { new StringEqual(sampleTest[0]),
new StringEqual(sampleTest[1]), new StringEqual(sampleTest[2]) };
//key是否同样的推断是equal和hash都同样,Aa和BB的hash同样
strHaspMap.put(strArray[0], 0);
strHaspMap.put(strArray[1], 1);
strHaspMap.put(strArray[2], 2);
Set<StringEqual> set = strHaspMap.keySet();
for (StringEqual str : set) {
System.out.println(strHaspMap.get(str));
}
}
private static class StringEqual {
private String str;
public StringEqual(String str) {
this.str = str;
}
@Override
public boolean equals(Object obj) {
return true;
}
@Override
public int hashCode() {
return str.hashCode();
}
}
------test hash map key start------
1
2
String 的 hashcode 算法是s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]。”Aa”和”BB”的hash同样,StringEqual类的 equal 默觉得 true,则”Aa”和”BB”认定为同一个 key。
java-集合类(二)的更多相关文章
- java集合类(二)
第十六天知识点总结 一.泛型 泛型:java jdk 1.5 新特性. 泛型的好处: 1.运行时的错误提前到编译时. 2.避免无谓的强制类型转换 自定义方法泛型:自定义泛型就是一个数据类型的占位或一个 ...
- java集合类(二)List学习
接上篇 java集合类(一) List接口继承了Collection接口和Iterable接口,即同样含有Collection和 Iterable的特性,还有方法,其基本方法有: 1)有关添加: b ...
- 做JavaWeb开发不知Java集合类不如归家种地
Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...
- 【转载】Java集合类Array、List、Map区别和联系
Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...
- Java集合类简单总结(重学)
java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...
- Java集合类中的哈希总结
JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...
- java集合类(三)About Iterator & Vector(Stack)
接上篇:java集合类学习(二) Talk about “Iterator”: 任何容器类,在插入元素后,还需要取回元素,因为这是容器的最基本工作.对于一般的容器,插入有add()相关方法(List, ...
- 一张图让你看清Java集合类(Java集合类的总结)
如今关于Java集合类的文章非常多,可是我近期看到一个非常有意思图片,基本上把Java集合的整体框架都给展现出来了.非常直观. watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- java 集合类Array、List、Map区别和优缺点
Java集合类主要分为以下三类: 第一类:Array.Arrays 第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Array ...
- Java集合详解8:Java集合类细节精讲
今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http://cmsblogs.com/?cat=5 具体 ...
随机推荐
- nyoj--118--修路方案(次小生成树)
修路方案 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...
- Oracle Hint的用法
1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_I ...
- 使用右键打开Visual Code
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\Visual Code]@="Edit with Visual ...
- Maven 学习笔记(三)
有时我们在项目中可能需要打包一个可执行的 jar 包,我最近也遇见了,很傻很天真的用了如下配置: <packaging>jar</packaging> 效果一如既往的好,打包成 ...
- ROS-turtlesim
前言:turtlesim是ros自带的一个功能包,应该是用于基础教学的功能包,帮助新手入门的一个实例,包括:节点,主题,服务以及参数的应用.通过学习使用turtlesim功能包可以了解ros的一些基础 ...
- C# 实现透明可移动窗体
1.设置窗体属性 this.BackColor this.TransparencyKey = this.BackColor; 2.窗体加载图片 this.BackgroundImage = globa ...
- 关于TCP的三次握手和四次分手 专题
客户端TCP状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSE ...
- EF Code First 使用 代码优先迁移(三)
迁移到特定版本(包括降级) 到目前为止,我们一直升级到最新的迁移,但有时您可能需要升级/降级到特定的迁移. 这是目前我数据库中的表:有四个表,我降级到addEndTime这个版本(这个版本是没有gra ...
- (转)Django学习之 第三章:动态Web页面基础
上一章我们解释了怎样开始一个Django项目和运行Django服务器 当然了,这个站点实际上什么也没有做------除了显示了"It worked"这条信息以外. 这一章我们介绍怎 ...
- 【原创】java的反射机制
什么是java的反射?java在运行期间可以动态的加载.解析和使用一些在编译阶段并不确定的类型,这一机制被称作反射.它可以加载只有运行时才能确定的数据类型,解析类的内部结构,获取其基本信息,如方法.属 ...