保存数量不确定的数据,以及保存具有映射关系的数据,java提供类集合类
一与数组的区别
数组元素可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象
二 java集合类由2个接口派生:Collection和 Map
1 Collection
Set (无序,元素不可重复,线程不安全)
EumSet
SortedSet ->TreeSet
HashSet-> LinkedHashSet
Queue (队列)
Deque ->ArrayQeque (LinkedList)
PrioriyQueue
List (有序,可重复)
ArrayList
Vector ->Stack
LinkedList
2 Map
EnumMap
IdentityHashMap
HashMap( 线程不安全 key value 允许为null )->LinkedHashMap
Hastable ( 线程安全,key value不能为null) Propeties
SoredMap
WeekHeahMap
二 详解特性
Set
Set集合类似于一个罐子,程序可以依次把多个对象丢进去,而Set集合通常不能记住元素的添加顺序
*HashSet
1 不能保证元素的排序
2 不是同步的,如果多个线程访问同一个HashSet,则必须通过代码保证同步
3 集合元素可以为null
4 HashSet判断2个元素相等的标准:equals和hashCode都要相等(因为是根据hashCode的值来决定存储位置的)
*LinkedHashSet
也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,使得元素看起来是以插入的顺序保存的
性能比HashSet差,迭代访问全部元素时有很好的性能。因为它以链表来维护内部顺序
LinkedHashSet books=new LinkedHashSet();
books.add("aaaaa");
books.add("bbbbb");
打印顺序 aaaaa bbbbb;
//删除
books.remove("aaaaa")
//重新添加
books.add("aaaaa");
打印顺序
bbbbb aaaaa
*TreeSet
可以确保集合元素处于排序状态,并不是根据元素的插入顺序进行排序的,而是根据元素的实际值的大小来进行排序的
1采用红黑树数据结构来存储集合元素
2 如果把2个同类型对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则将会抛异常
TreeSet ts=new TreeSet();
ts.add(new Err());//添加一个没问题
ts.add(new Err);//抛异常,因会调用compareTo()方法
各Set分析 :HashSet性能比TreeSet好(特别是最常用的添加,查询元素等操作),TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个排序的Set时才用TreeSet。LinkedHashSet有链表,遍历更快,插入慢。EnumSet性能最好,但只能保持同一个枚举类的枚举值作为集合元素。
List
有序集合,可以根据索引操作元素,常用的add(),remove()sort()等;
ArrayList和Vector都是基于数组实现的List类(默认长度是10),如果向集合中添加大量数据时可使用ensureCapacity()方法一次性增加,减少重分配的次数;
长度固定的List Arrays.ArrayList(),程序只能遍历元素,不能增加删除;
Queue集合
常用方法 peek()获取队列头部元素,不删除。poll()获取队列头部元素,删除;add()指定元素加入队列的尾部,remove() 获取队列头部元素,并删除。
PriorityQueue 保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序的
PriorityQueue pq=new PriorityQueue();
pq.add(6);
pq.add(-3);
pq.add(20);
pq.add(18);
System.out.println(pq.poll());//输出-3
Deque
双端队列,允许从2个端操作元素。还可以当作栈使用,pop()出栈,push()入栈;
ArrayQeque stack=new ArrayQeque();
//push入栈
stack.push("aaaa");
stack.push("bbbb");
stack.push("cccc");
System.out.println(stack);//输出 aaaa,bbbb,cccc
System.out.println(stack.peek());//访问第一个元素,不出栈输出aaaa
System.out.println(stack);//依然输出aaaa
先进先出
stack.offer("aaaa");
各List线性表的性能分析
ArrayList 基于数组的 随机访问性好
LinkedList 基于链的,插入数据好
Map集合
Map用于保存具有映射关系的数据,key—value形式。Map不允许key重复,所以Map对象的任何2个key通过equals比较都是false
Map与Set之间关系:把Map的value当成key的附庸就像一个Set了
Map与List :把Map的value放在一起看类似于List,元素可以重复,没个元素可以根据索引来查找,只是索引不是整数值,而是以另一个对象为索引
HashMap :线程不安全
Hashtable :线程安全 ,key和value不能null
判断 key相等标准是:equals返回 true ,hashCode值相等
尽量不要使用对象作为key
*LinkedHashMap 双向链表维护,负责维护Map的迭代顺序与插入顺序一样
* Properties key value都是String类型
*TreeMap和SortedMap 红黑树数据结构 自然排序 定制排序等
*WeakHashMap 与HashMap类似 ,HashMap强引用 ,WeakHash弱引用 。即key所引用的对象没有被其他强引用变量所引用,则可能被回收
各Map 性能分析
TreeMap 插入 ,删除慢 ,但是有序的
HashMap 查询快
LinkedHashMap 链表结构,保证插入的顺序
Collections 集合工具类 reverse()反转 ,shuffle()随机排序;sort()自然排序;swap()交换;rotate()整体移动,不改变长度;
*