java 集合类扫盲贴,一起学习一个进步
一秒钟辨识集合结构
学习java 集合前了解下数据结构的基本概念:
1数组:
概念:存中划分出一块连续的内存,数据顺序存储,读取数据时需要提供数组的索引,java 只有相同类型的数据才会存放在一个数组中。
优点: 内存地址连续,寻址读取数据容易,快速访问。
缺点: add,delete 需要挪动位置,不适合插入和删除。
2链表:
概念:不会先划出一块连续的内存,存储数据的内存中的会划分两块区域 (数据区,指针区[记录下个数据在哪的区]),链表是线性表,但是不是按线性存储数据。
优点:能利用好碎片空间,add,delete不需挪动位置 ,改变对应位置的记录OK,适合插入和删除操作。
缺点:查询数据需要从0 号数据开始,所以查找不容易。
3栈:
概念:先进后出的数据结构,数组和链表都可以生成栈
优缺点:基础构成它数组或者链表的优缺点。
队列
概念: 队列是一种先进先出的数据结构,数组和链表也都可以生成队列,数组和链表都可以生成栈
优缺点:基础构成它数组或者链表的优缺点。
collection
1.list 实现类
(1)基本概念:用于存放多元素,因为维护元素次序,所以允许元素重复。
ArrayList
- 数据结构:数组方式实现
- 非线程安全: 多个线程可以重复访问一个ArrayList 对象
- 数据:可重复,可为null
优缺点:
1.同数组
2.或多线程环境下资源不需要写、更新,只需要读取,使用,或资源不需要受保护,使用ArrayList就大大提高了效率。 (可配合线程的读写锁)
优和调优:
1.可预设设置 list 的大小 list.ensureCapacity(N); 提高添加新元素的速度
2.遍历时设置 for(int i = 0,size = list.size(); i < size ; i ++){}防止每次检测大小,效率大大提高
vector
- 数据结构:数组方式实现
- 线程安全:某一刻只能有一个线程访问统一ArrayList 对象,其每个方法都为同步方法【sychronized】
- 数据:同上
优缺点:
1.实现线程同步很高的花费 -> 访问比ArrayList 慢
2.多线程环境下,访问收保护的资源,用vector 显得十分简洁
LinkedList
- 数据结构:链表的实现方式
- 非线程安全:多个线程可以重复访问一个LinkedList对象,多线程程序需要自己 实现同步(多线程程序实现同步的方式)
- 数据:同上
- 用途:当作堆栈、队列和双向队列使用
优缺点:同链表
优化和调优:
1.迭代器访问LinkedList 最好 ,因为LinkedList 进行随机访问时,只会进行一次列表访问。
2.set 集合实现类
(1)基本概念:元素是独一无二的。
HashSet
- 数据结构:hash 链表 表的方式存储,内存地址不连续,安装hashCode值得顺序存储的
- 非线程安全: 读取速度快
- 数据:不可重复(equals 方法保证数据的唯一性)
TreeSet
- 数据结构: 红黑树(红黑树算法的规则: 左小右大。)
- 非线程安全: 没有实现线程同步,读取速度快
- 数据:不可重复(通过compareTo或者compare方法中的来保证元素的唯一性)
map
HashMap
- 数据结构:散列表,存储内容key-value 形式的映射。
- 非线程安全:没有实现线程同步。
- 数据:可以接受为null的键值(key)和值(value).
HashTable
- 数据结构:散列表,存储内容key-value 形式的映射。
- 线程安全:因为值多线程同时修改HashMap 会ConcurrentModificationException.
- 数据:不接受 null 为 key和 null 为value 值。