Java中集合总结

摘要:
Java数组的长度是固定的。为了方便程序存储和操作一组具有可变数字的数据,JDK类库提供了Java集合,这些集合位于Java中的util包中,但与数组不同,集合不能存储基本类型数据,只能存储对象引用。Java集合主要分为以下三种类型:集合:集合中的对象没有以特定方式排序,并且没有重复的对象。Collection类是Java集合类库中的一个辅助类。它提供了各种用于操作集合的静态方法。sort()方法用于对列表中的对象进行排序:1.sort:对列表中对象进行自然排序。

Java数组的长度是固定的,为了使程序能够方便地存储和操作数目不固定的一组数据,JDK类库提供了Java集合,这些集合类都位于java.util包中,但是与数组不同的是,集合中不能存放基本类型数据,而只能存放对象的引用。

Java集合主要分为以下三种类型:

Set(集):集合中的对象不按特定方式排序,且没有重复对象。它的有些实现类能对集合中的对象按照特地方式排序。

List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许使用索引检索对象。

Map(映射):集合中的每一个元素都包含一对键对象和值对象(key-value),集合中的键对象是不能重复的,它的一些实现类能对集合中的键对象进行排序。

java主要集合类的类框图

1351509007_7483

 (Interface与Interface之间为继承关系,是实线箭头,图中有误)。

Collection接口和Iterator接口

在Collection接口中声明了适用于Set和List的通用方法:

方法描述
boolean add(Object o)向集合中加入一个对象的引用
void clear()删除集合内的所有对象,即不再持有这些对象的引用
boolean contains(Object o)判断在集合中是否持有这些对象的引用
boolean isEmpty()判断集合是否为空
Iterator iterator()返回一个Iterator 对象,可用它来遍历集合中的元素
boolean remove(Object o)从集合中删除一个对象的引用
int size()返回集合中元素的数目
Object[] toArray()返回一个数组,该数组包含集合中的所有元素

Iterator iterator()方法返回一个Iterator对象,Iterator对象采用了快速失败机制,例如,当通过Collection对象的iterator()方法得到一个Iterator对象后,紧接着利用ction集合的一些方法对集合进行了修改操作,则接下来访问Iterator对象的next()方法会抛出ConcurrentModificationException运行时异常。

Iterator接口提供了遍历各种类型集合的统一接口。Iterator接口声明了如下方法:

方法描述
hasNext()判断集合中的元素是否遍历完毕,如果没有,则返回true
next()返回下一个元素
remove()从集合中删除上一个由next()方法返回的元素

Set(集)

Set是最简单的一种集合,集合中对象不按特定方式排序(没有索引),并且没有重复对象。Set主要有两个实现类:HashSet和TreeSet。HashSet类按照哈希算法来存取集合中的对象,当向集合中加入这个对象时,HahshSet会调用对象的hashCode()方法来获得哈希码,然后根据哈希码进一步计算出对象在集合中存放的位置,因此存取速度比较快。HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且还实现了链表数据结构。链表数据结构能够提高插入和删除元素的性能。TreeSet类实现了SortSet接口,具有排序功能。

Set集合中存放的是对象的引用,且没有重复对象。下面这个例子:

image

以上程序的打印结果为2.因此Set集合的add()方法是以用equals方法来判断对象是否已经存在与集合之中的。equals与“==”的区别自行google。

TreeSet类实现了SortSet接口,具有排序功能。下面这个例子:

image

以上程序打印的结果为 1 2 3 4 。因此当向TreeSet集合中插入对象时,会把他插入到有序的对象序列中。TreeSet支持两种排序方式:自然排序和客户化排序。在默认情况下采用自然排序方式。

1、自然排序

JDk类库中已经实现了Comparable接口的一些类的排序方式如下表:

排序
Byte 、Double 、Float 、Interger 、Long 、Short按数字大小排序
Character按字符的Unicode值的数字大小排序
String按字符串中字符的Unicode值排序

2、客户化排序

我们可以通过实现Comparator<Type>接口来自定义排序方式,其中Type为指定被比较对象的类型。Comparator接口中有个compare(Type x,Type y)方法,用于比较两个对象的大小,当返回值大于0.表示x大于y,反之亦然。下面这个例子:

首先要实现Comparator接口

image

然后就可以自动进行客户化排序了:

image

以上程序打印的结果如下:

image

List(列表)

List列表的主要特征是其元素以线性方式存储,集合中允许存放重复对象。List接口的主要实现类包括:

1、ArrayList:代表长度可变的数组。允许对元素进行快速的随机访问(即检索位于特定索引位置的元素),但是向ArrayList中插入与删除元素较慢。

2、LinkedList:在实现中采用了链表数据结构,对顺序访问进行了优化,向其中插入与删除元素较快,随机访问速度则较慢。LinkList单据具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()、rmoveLast()方法。

我们可以通过get(int index)方法获取指定索引位置的对象。也可以通过获得Iterator对象对其进行遍历。

List只能对集合中的对象按照索引位置进行排序,如果希望按其他方式排序,可以借助Comparator接口和Collection类。Collection类是Java集合类库中的辅助类,它提供了操纵集合的各种静态方法,其中sort()方法用于对List中的对象进行排序:

1、sort(List list)  :对List中对象进行自然排序。

2、sort(List list,Comparator comparator)  :对List中对象进行客户化排序。

ListIterator接口

List的listIterator()方法返回的是ListIterator对象。ListIterator接口继承自Iterator接口,此外还专门提供了专门操纵列表的方法:

方法描述
add()向列表中插入一个元素
hasNext()判断集合中的元素是否遍历完毕,如果没有,则返回true
hasPrevious()判断集合中的元素是否有上一个元素,如果没有,则返回true
next()返回下一个元素
previous()返回上一个元素

比较Java数组和各种List的性能

通过测试得到的操作时间:

类型Java数组ArrayListLinkedList
随机访问操作(get)162363
迭代操作(iterate)314733
插入操作(insert)不适用161031
删除操作(remove)不适用662516

从表中可以看出,对Java数组的随机访问和迭代具有最快的访问速度;对LinkedList的插入和删除操作具有最快的速度,对ArrayList的随机访问也具有较快的访问速度。

Map(映射)

Map(映射)是一种键对象和值对象进行映射的集合。利用put(Object key ,Object value)向Map集合中加入元素,因此必须提供一对键对象和值对象。利用get(Object key)从Map集合中检索元素,因此只要给出键对象,就会返回对应的值对象。

Map集合中的键对象不允许重复,重复后后一个值对象将会覆盖前一个的值对象。

Map.Entry表示Map中的一对键和值。Map的entrySet()方法返回一个Set集合,这个集合中存放了Map.Entry类型的元素。

Map有两种比较常用的实现:HashMap和TreeMap,HashMap有较好的存取性能。TreeMap实现了SortedMap接口,能对键对象进行排序,同样提供了自然排序和客户化排序两种方式。

新的遍历集合的方法:

除了用Iterator来遍历集合外,还可以用以下代码遍历集合:

image

集合实用类:Collections

该类提供了一系列操纵List类型集合的静态方法。

主要笔记来自《Java面向对象编程》

免责声明:文章转载自《Java中集合总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇centos7没有netstat命令的解决方法IIS WebForm开发基础下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

springboot-easycode配置文件修改

网上抄的然后不能够使用,自己又改了该就可以了entity ##引入宏定义 $!define ##使用宏定义设置回调(保存位置与文件后缀) #save("/entity", ".java") ##使用宏定义设置包后缀 #setPackageSuffix("entity") ##使用全局变量实现默认包导入 $!autoImport import lo...

Redis源码解析03: 字典的遍历

  遍历一个稳定的字典,当然不是什么难事,但Redis中的字典因为有rehash的过程,使字典可能扩展,也可能缩小。这就带来了问题,如果在两次遍历中间,字典的结构发生了变化(扩展或缩小),字典中的元素所在的位置相应的会发生变化,那如何保证字典中原有的元素都可以被遍历?又如何能尽可能少的重复迭代呢?   Redis使用的遍历算法非常精妙,使用该算法,可以做到...

To Java程序员:切勿用普通for循环遍历LinkedList

ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: public static void main(String[] args) { List<Integer> arrayList = n...

Shell排序和二叉树排序

Shell排序 #include<iostream> using namespace std; void Print(int *list, int len); void ShellSort(int *list, int *list2, int len, int gap); void ShellSort(int *list, int *li...

【mockito】单元测试之mockito简单使用

背景 项目使用的是springmvc+mybatis 开发; mock包为mockito-all;虽然也引用了powermock,但截至目前,还未使用到;如果使用到后续再补相关笔记。 mock,个人理解,有两个场景比较常见吧。一个是在项目初期接口定义好后没有实现逻辑阶段;另一个就是针对已经有的逻辑自测阶段,而又不想(或者依赖的别人接口不想关心)被别人所左右...

JDBC实现从数据库中读取信息以表格的形式展示

方法都是通用的,要看你如何去灵活的运用!!! 本文以“新闻发布系统”为例 第一步:建立数据库(使用的是mysql数据库) 其中数据库信息为: 数据库名:news 表名:title,字段名分别为(序号、标题名称、创建者、创建时间) create table title( id int(2) primary key, name varchar(20), cre...