JAVA 集合类 二

1. 规则集Set:无重复、无序

即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
HashSet:HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法以判断是否为同一个对象,无顺序、无重复。

当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致,如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示已经加进去了,就不会再增加新的对象,否则加进去。

②LinkedHashSet:有顺序,按照元素插入时的顺序存储。在HashSet中加入了链表数据结构,有顺序

③TreeSet:可以排序,需要实现Comparable接口,并实现其compareTo()方法,以排序。

如String已经实现,按字母顺序存放。(可以自定义比较器顺序)

只有对象之间可以相互比较,才能添加到TreeSet中,有两种方式可以相互比较:使用Comparable接口(许多API已经实现);自定义一个比较器即创建一个实现Comparator接口的类。

注:要想使用比较器,必须使用构造方法TreeSet(Comparator comparator)来创建一个有序集,才能用compare方法对集合内元素排序。

2. 线性表List:有重复、有序
有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

①ArrayList:是实现了List接口的大小可变的数组。

擅长在线性表尾部进行插入删除以及随机访问。(通过维护数组来实现)。

ArrayList不能自动收缩。

线性表不支持有序存储,但是Collections类中提供了用于线性表排序的静态方法。

当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

ArrayList也是非同步的(unsynchronized)。

②LinkedList:擅长在线性表任意位置插入删除。(通过维护一个一个的Entry来实现,每个Entry有一个前驱、一个后继和一个存储值)。

LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

是一个双向循环链表,适合变更很多的List。
用在FIFO,用addList()加入元素 removeFirst()删除元素
用在FILO,用addFirst()/removeLast()
③Vector:除了包含用于访问和修改向量的同步方法以外,与ArrayList相同。

ArrayList(数组表)- 有重复、有顺序。类似于Vector,都用于缩放数组维护集合。

区别:
1.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

④Stack(类):作为Vector类的扩展实现的。

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

⑤Queue(接口):扩展Collection接口。LinkedList类实现Queue接口,可以用LinkedList创建队列。

JAVA中的Stack和Queue实现得并不好,一般自己用LinkedList来重新定义它们。

迭代器Iterator

它可以遍历并选择序列中的对象,而不必关心该序列底层的实现。

对于List,如果只是遍历,则用foreach( )会更简洁。

List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 ListIterator可以双向移动,Iterator只能单向移动。

注:foreach( )语法可以应用于任何Collection对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值