使用场景

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-集合类(二)的更多相关文章

  1. java集合类(二)

    第十六天知识点总结 一.泛型 泛型:java jdk 1.5 新特性. 泛型的好处: 1.运行时的错误提前到编译时. 2.避免无谓的强制类型转换 自定义方法泛型:自定义泛型就是一个数据类型的占位或一个 ...

  2. java集合类(二)List学习

    接上篇  java集合类(一) List接口继承了Collection接口和Iterable接口,即同样含有Collection和 Iterable的特性,还有方法,其基本方法有: 1)有关添加: b ...

  3. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

  4. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  5. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  6. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...

  7. java集合类(三)About Iterator & Vector(Stack)

    接上篇:java集合类学习(二) Talk about “Iterator”: 任何容器类,在插入元素后,还需要取回元素,因为这是容器的最基本工作.对于一般的容器,插入有add()相关方法(List, ...

  8. 一张图让你看清Java集合类(Java集合类的总结)

    如今关于Java集合类的文章非常多,可是我近期看到一个非常有意思图片,基本上把Java集合的整体框架都给展现出来了.非常直观. watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  9. java 集合类Array、List、Map区别和优缺点

    Java集合类主要分为以下三类: 第一类:Array.Arrays 第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Array ...

  10. Java集合详解8:Java集合类细节精讲

    今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http://cmsblogs.com/?cat=5 具体 ...

随机推荐

  1. Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简单介绍 Spring ...

  2. go并发设计模式 --资源生成器模式

    1.简单的生成器 package main import ( "fmt" "math/rand" ) func GenerateIntA()chan int { ...

  3. Extjs 常见错误

    http://blog.csdn.net/lc448986375/article/details/8082014

  4. ros中文术语表及消息类型表

    前言:整理一些ros常用表格,包括中文术语对照表. 一.中文术语表 二.消息类型表 -END-

  5. ROS-VIM

    在终端输入:vimtutor,进入学习教程. 常用快捷键: a 编辑模式; 编辑状态下 回车 换行; Ctrl+n 补全命令; x剪切; p复制; u撤销; :q!不保存退出; :wq保存并退出; 以 ...

  6. Redis的配置文件详解

    daemonize:如需要在后台运行,把该项的值改为yes pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址 bind:指定redis只接收来自该IP的请求,如 ...

  7. User_Login_Register_Shopping 1.0

    #!/usr/bin/env python# -*- coding: utf-8 -*-# @File : user_login_register_shopping.py# @Author: Anth ...

  8. 清北集训Day1T3 LYK loves jumping(期望DP)

    题目描述 LYK在玩一个魔法游戏,叫做跳跃魔法. 有n个点,每个点有两个属性hi和ti,表示初始高度,和下降高度.也就是说,它初始时高度为hi,一旦LYK踩在这个点上,由于重力的影响,这个点的高度会下 ...

  9. js从数组中取出n个不重复的数据

    /** * 首先,针对这个数组做一个去重处理,避免你在后面取数据的时候,因为取到相同的元素而又要多去取一次随机数 * 将获取到的不重复的数组,再到这里样本里面去取随机数 * 每取到一次,就将这个元素从 ...

  10. GRpc-Go使用笔记

      linux下配置GRpc-golang 1.git中下载protobuf包 2.解压(/usr/local/protobuf) unzip protobuf-cpp-3.0.0-alpha-3.z ...