Java集合类

这里写图片描述
上图是自己课后总结的集合类知识点,需要.xmind文件的在此自行下载。
http://note.youdao.com/noteshare?id=5d73b0aa30512a77590d219722c7111e&sub=1044CFB34A8F4B9FAAD6228CBEA996E8

首先看一个比较棘手的问题(比较粗略,详细可参考下链接的大神)http://www.cnblogs.com/skywang12345/p/3308762.html#a3

快速失败策略
java. util. ConcurrentModificationException fast-fall(快速失败策略)
1、同步修改:
当一个或多个线程正在遍历一个集合Collection时,另一个线程修改(增删改)了这个集合的结构 。 这就是并发修改。
2、什么是fail-fast机制? 目的是为了保证数据安全性
fail-fast机制在遍历一个集合时,当集合被修改,会抛出ConcurrentModificationException。
3、如何产生?
描述集合被修改的次数。
protected transient int ModCount =0;
expectedModCount 在Iterator调用迭代器时等于当前ModCount的值。
遍历时:
int expectedModCount = ModCount;
checkForComodification();
ConcurrentModificationException产生于迭代器内部
expectedModCount != ModCount;
产生ConcurrentModificationException:ArrayList()、HashSet() 、HashMap()
4、如何解决?
A.并发遍历集合时,不要修改集合内容。
B.使用failsafe类集(CopyOnWriteArrayList 、 ConcurrentHashMap)
5、fail-safe 机制集合均为线程安全集合。
CopyOnWriteArrayList使用lock锁实现线程安全。(jdk1.7之前的ConcurrentHashMap也采用lock()锁)
fail- safe对任何集合结构的修改都会在一个复制的集合上进行修改。因此不会抛出ConcurrentModificationException。因为原来集合根本就没变。
6、fail -safe 机制的问题:
A.需要复制集合,产生大量的无效对象,开销大。
B.无法保证读取的数据是目前原始数据结构中的数据。

Java类集(jdk1.2引入,在Java.util包下):本质就是动态对象数组。
object类在java.long包
输入输出、传统IO在java.io包
java类集在java.util包

一、collection核心接口
collection:针对单个对象的处理(add( ) iterator( ))
public interface Collection extends Iterable
public interface Iterable
Iterator iterator JDK1.5之前直接在Collection接口中定义
Iterator 集合类遍历 迭代器模式
Map:针对键值对的处理(K-V)
list extends collection:允许数据重复
set extends collection:不允许数据重复

二、list接口(80%)
E get(int index) : 根据索引取得元素
E set ( int index,E element):根据指定索引修改元素内容,返回修改前内容
2、1 ArrayList实现类(90%):底层为数组
2、2 Vector 实现类(jdk1.0):底层也是数组
2、3 LinkedList实现类(8%):底层为双链表
2、4 List集合与简单java类
简单java类如果要和remove()、contains() 结合,需要覆写equals方法支持,以此来比较属性值。
ArrayList与 Vector 的区别:
1、Vector jdk1.0
ArrayList jdk1.2
2、Vector采用同步处理,效率低,线程安全
ArrayList采用异步处理,效率高,线程不安全
3、 ArrayList支持Itertor ListIterator foreach 输出
Vector支持Itertor ListIterator foreach Enumeration输出

ArrayList与 LinkedList的区别
1、 LinkedList采用双链表 实现 ArrayList采用数组实现 数组动态扩充
2、ArrayList适用于频繁查找数据集的场景 LinkedList适用于频繁修改数据的场景

总结:ArrayList封装的是数组;LinkedList封装的是链表。ArrayList时间复杂度为1,而LinkedList的复杂度为n。

三、set集合接口
注:set集合本质为没有value值的map,不允许重复,并没有对collection进行扩充,没有get方法。
3、1 HashSet(无序存储 实际上就是HashMap):底层为数组
允许为null 不允许重复元素 元素乱序存储
判断重复依据 hashCode()+equals()
public native int hashCode();返回对象地址的hash码;
两个对象(第三方类)相等判断:必须hashcode()和equals()均返回true 才相等。
3、2 TreeSet (有序存储 实际上就是TreeMap) :底层为红黑树
不允许为null 有序存储 (顺序自定义)
TreeSet 判断重复元素由CompareTo()实现;
自定义类要想使用TreeSet 必须覆写Comparable接口。无须覆写equals hashCode
public int compareTo(T 0);
a.返回> 0;当前对象> 目标对象
b.返回= 0;当前对象=目标对象
c.返回< 0;当前对象<目标对象

四、集合输出
Iterator ListIterator Enumeration foreach循环
4、1 迭代器输出Iterator(set list接口都有 只能从前往后输出)
a.hasNext():判断是否有下个元素
b.next(): 取得当前元素
c.remove(): 删除元素

List自动扩容(ArrayList、Vector)
1、ArrayList(初始化时为空数组)
先定义一个空数组
扩容策略 增加50%(扩容后容量为当前类集的1.5倍)
int newCapaticy = oldCapacity + (oldCapacity >> 1);
2、Vector(初始化大小为10):
扩容策略:增加一倍(默认扩容后为当前类集的2倍)
int newCapaticy = oldCapacity + ((capacityIncrement>0)?capacityIncrement : oldCapacity )
动态扩容本质:Arrays.copyof (elementData newCapacity) 新建数组

4、2 双向迭代接口ListIterator(list接口独有)
除了Iterator提供的方法外,
hasPrevious:判断是否有上个元素
previous:取得上个元素
要从后向前输出 必须要从前向后走一遍
4、3 Enumeration枚举输出(只有Vector类才有)
4、4 for-each输出

五、Map集合
内容较多,字数限制。后续请点击以下链接查看。
http://note.youdao.com/noteshare?id=4319e6609b2e63549472c49d6d3319e4&sub=12779241A02445B2B3846C36BB38072C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值