java 集合

来源:互联网 发布:微视频神器软件 编辑:程序博客网 时间:2024/05/22 06:36

保存数量不确定的数据,以及保存具有映射关系的数据,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()整体移动,不改变长度;


*

0 0
原创粉丝点击