Java合集的认识

Java合集的认识

数据结构:是以某种形式将数据组织在一起的合集。Java的合集框架支持两种容器:Map、CollectionMap(映射表)是为了存储键值对,映射表是一个用于使用一个键快速搜索一个元素的高效数据结构。Collction是为了存储一个元素合集Collection接口是处理对象合集根接口。AbstractCollection类提供了collection接口的部分实现,除了add、size、iterator方法之外,它实现了Collction的其他所有方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFTA4WIN-1609577557091)(D:\Typora笔记\typora-user-images\Image.png)]

方法addAll、removeAll、retainAll类似于集合上的并差交运算。注意:Colleciton接口中有的方法不能够再具体点的子类当中实现,这种情况下,这些方法会抛出异常UnsupportedOperationException。这样可以给我们一个设计思路,如果一个方法在子类中没有意义,那么我们可以重写该方法,并在实现当中抛出该异常类,以达到目的。此外在Java集合当中除了优先队列,欸有实现clone接口之外,其他的具体类都实现了克隆接口和序列化接口。
迭代器:从上面的继承图可以看出,集合根接口实现了iterable接口,他其中有个方法是iterator,他可以返回一个iterator(迭代器),这个迭代器可以在不暴露集合的组织数据的方式与细节,实现对集合数据的遍历。iterator有两个主要的方法一个hasnext判断下一个元素是否存在,next获得下一个元素的值。对于foreach遍历,可以用于Iteable的实例,也可用于数组。线性表(ArrayList)和链表(LinkedList):在API上的一些认知:首先List它是继承于Collection合集,继承了它的方法,也增加了一些额外的方法,主要是两方面一方面是面向位置的一个方法添加,另一个是提供了双向遍历的一个双向迭代器方法。List有两个具体实现类一个是线性列表,一个是链表。他们之间的区别在于线性列表是以数组实现的,是动态的,当他容量不足时会自动扩大容量,也提供了list容量和内部数组容量不足,让他俩大小一致的方法,trimtosize()。他继承于abstractList抽象类。LinkedList是以链表实现的,具有双向迭代器介绍:双向迭代器

比较器Comparetor和Comparable接口

Comparable接口

comparable接口是用来比较两个同类型对象的元素,它是一个泛型接口。当一个对象需要比较时,可以让该对象事项comparable接口,并重写相应的compareTo方法。当当前对象小于指定对象,则返回负整数,当当前对象大于指定对象,则返回正整数,当当前对象等于时,返回0。实现了Comparable接口的对象,可以进行排序。例如Integer[] 数组,它可以利用Arrays.sort方法里排序。

注意点:

​ 1、其实可以实现对象里面直接写比较方法。利用Comparable接口的好处在于,当排序的时候,利用Java自带的api进行排序,可以直接引用Comparable接口,而不必直接应用需要排序的对象,这对开发来说是极其便利的。还有一点就是实现接口能够通用,这样很便利。

​ 2、《Java语言程序设计》梁勇:建议compareTo方法要和equals方法保持一致,也就是说对于两个对象应该在equals为真时,compareTo返回0成立。

comparator比较器接口

comparator接口是用于没有实现Comparable接口的类的对象的比较。

Comparable接口实现的比较,进行的排序称之为自然排序,Comparator接口一般称之为比较器比较。

对于camparator来说相对于Comparable是比较灵活的,我们可以指定一个比较器去比较两个对象,而对于Comparable来说是需要继承的。

通常对于比较起来说,实现序列化接口是很好的,它可以用于可序列化数据接口的排序方法。为了使数据结构能够成功序列化,比较器必须实现序列化接口。

线性表和合集的静态方法

对于线性表和合集操作的一些方法,释放在Collections类当中,这个类内部方法都是静态的,它包含了处理线性表(list)的静态方法,Sort、binarySearch、reverse、shuffle、copy、fill,也包含对合集(Colleciton)的静态方法,Max,Min、disjoint、。

如下是一个UML视图,主要是对线性表和合集的方法。

向量类和栈类

向量和栈类是在Java2之前引入的,Java合集框架则是在Java2引入的,合集框架对stack、vector类实现了重新设计,因此为了向后兼容,保留了他们所有的以前形式的方法。

对于向量,他和Array list都是继承于abstractList类,他们之间的区别在于,处理vector类包含用于访问和修改向量的同步方法之外,其他的没有差别。也正是因为这些同步方法,vector的效率相对ArrayList来说是效率较低的。因此如果不考虑线程安全一般采用Arraylist来存储元素。

stack栈类是继承于vector类,他是一个先进后出的一个类,他与vector类来说,只是多了些处理栈顶的元素方法。

需要注意的是elements()方法是反应会一个Eunumeration对象,枚举对象。该对象接口是Java2之前引入的,现在已经被Iterator接口所取代。

队列和优先队列

queue是继承于Collection合集的一个接口,它的具体实现类,有PriorityQueue和LinkedList。

queue接口是一个队列数据结构,元素有先进先出的一个特性,元素被追加到队列末尾,队列头删除。其中queue接口多了一些对队列的操作方法,如对于数据头部和尾部的修改。

PriorityQueue是一个优先队列,他是采用优先权的形式对数据进行操作。默认情况下是以Comparable接口实现的自然比较,进行排序,当然也可以指定一个比较器实现排序。对于数据较小的元素,它的优先级最高,元素最先删除,当优先级相同时,则会让其随即删除一个同等优先级的元素。

LinkedList很适合进行队列操作,因为它可以搞笑的在线性表的两端插入和移除元素。之所以这样是因为他继承了Deque接口,Deque是一个双端对了,支持在两端进行修改和访问。

集合(Set)和映射表(Map)

集合

集合set是继承于Collection合集接口,他并没有提供新的方法,而仅仅是规定了集合中的元素不能够重复出现。旗下有三个具体实现类,分别是HashSet、LinkedHashSet、TreeSet。

HashSet是存储无需不可重复的集合,对于存储的对象是需要重写Hash和equals方法。它的子类LinkedHashSet提供了可以获得按插入顺序的顺序获得元素,并且还有对于首尾元素的一个操作。

TreeSet是树型集,它提供了有序的集合,可以按照自然顺序或者指定比较器的顺序。另外提还提供方法获取集合的首尾元素,以及范围指定元素之前或之后的一个集合。

注意:如果说对元素集合顺序无要求的则可以采用HashSet集合,如果有对排序有要求,则可用TreeSet树型集。

映射表

Map类似于词典,提供了对键值对的一个存储。可以通过键值快速获取value的值。Map提供了对键和值的一个更新,查询,获取的方法。如下图所示

Map里面包含着一个Map.entry<key,value>的接口是一个键值对,其中键值皆在泛型当中。我们可以从entry当中获取key、value的值,也可以直接利用Map提供的方法获取key、value值。对于map中的entry可以通过Map遍历获取,也可以通过entrySet(),获取该对象的一个集合,然后遍历。当然key和value也可以获取一个集合。

Map当中有三个具体实现类,HashMap、LinkedHashMap、Treemap。当对于一个映射表无顺序要求时,HashMap是高效率的。LinkedHashMap扩展于HashMap,支持表中的条目顺序,可以获取一个按照插入顺序的映射表,或者按照访问顺序的映射表。TreeMap提供键的顺序的映射表,当然要对象实现比较接口,或者TreeMap指定一个比较器。

比较线性表和集合的一个性能

在无重复元素进行排序方面,集合比线性表更加高效。线性表再通过索引来访问元素方面非常有用,对于集合获取元素,不能通过索引获得,是要通过遍历获得其元素。

当判断一个元素是否在合集里面,集合的效率比线性表效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值