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 具体 ...
随机推荐
- ubuntu14.04无法安装Curl
ubuntu14.04无法安装Curl apt-get install curl 提示没有这个软件 源 更换软件源到163也不行,更新软件源也不行. 解决:參考http://www.linuxidc. ...
- 2015.03.13,外语,读书笔记-《Word Power Made Easy》 10 “如何讨论交谈习惯”学习笔记 SESSION 26
1.a Spartan virtue 古斯巴达人中一位有名的Laconia国王,其言语比Vermonter(美国佛蒙特州人)还简洁.一个传说,马其顿菲利普国王(亚历山大的老爸)要进攻他们的都城,发了一 ...
- Codeforces Beta Round #29 (Div. 2, Codeforces format) C. Mail Stamps 拓扑排序
C. Mail Stamps One day Bob got a letter in an envelope. Bob knows that when Berland's post offic ...
- angularjs1-路由
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 利用CSS3中的clac()实现按照屏幕分辨率自适应宽度
1.简介 calc()看其外表像个函数.平时在制作页面的时候,总会碰到有的元素是100%的宽度(例如body元素).如果元素宽度为100%时,其自身不带其他盒模型属性设置还好,要是有别的,那将导致盒子 ...
- 21.QT二进制文件
#include "mainwindow.h" #include <QApplication> #include <QFile> #include < ...
- python中is与==的差别
# is:比较的是两个对象的id值是否相等,# 也就是比较俩对象是否为同一个实例对象,# 是否指向同一个内存地址 # s = "alex"# abc = id(s) # 得到内存地 ...
- Axure设计软件下载安装及注册
如图:本地计算机安装了两个版本的Axure,但8版的有问题,点击保存软件就退出了:7版本要想使用的注册授权 https://blog.csdn.net/botree_chan/article/deta ...
- Electron 问题
打包 Mac 桌面程序时报上述错误 E:\research\node\XXX>electron-packager ./ XXX --platform=darwin --arch=x64 --ic ...
- Obj文件和Bin文件
本文导读:在用visual studio 编程时,会看到项目文件中含有bin和obj这两个文件夹,那么这两个文件夹具体包含一些什么东西的,具体作用是什么? 一.Bin文件夹 1.用来保存项目生成后程序 ...