JAVA集合框架(学习交流)

JAVA集合框架(学习交流)

集合和数组的区别:

  1. 数组长度不能变化并且无法保存具有映射关系的数据,集合可以保存数量不确定的数据以及具有映射关系的数据。
  2. 数组元素既可以是基本类型和对象,集合只能保存对象。

Java集合类主要由Collection和Map派生,其中Collection派生出三个子接口:List、Set、Queue:

  1. List代表了有序可重复集合,可直接根据元素的索引来访问。
  2. Set代表无序不可重复集合,只能根据元素本身来访问。
  3. Queue代表队列集合。
  4. Map代表的是存储key-value对的集合,可根据key来访问value。

Java集合常见接口及实现类

1.Collection接口常见方法(来源于Java API):

2. Set集合

Set集合与Collection的方法相同,但Set集合不能存储相同的元素,如果要添加一个Set中已有的元素,add会返回false,添加失败。

Set集合常用实现类:

2.1 HashSet类

HashSet是按照hash算法来存储元素的,因此具有很好的存取和查找性能。

HashSet具有以下特点:

  1. 元素无序。
  2. 不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。
  3. 集合元素值可以是null。

HashSet存储原理:

向HashSet集合存储元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,再根据hashCode值决定该对象的存储位置。HashSet集合判断两个元素相等的标准是:两个元素通过equals方法比较返回true;两个元素的hashCode()方法返回值相同,若两个条件都满足,则认为两个对象相等,添加失败。如果两个对象的hashCode()方法放回值相同,但是两个对象通过equals()方法比较返回false,HashSet会以链式结构将两个对象保存在同一位置,这会导致性能下降,应尽量避免出现这种情况。

HashSet查找原理:

在查找元素时,HashSet先调用对象的hashCode()方法得到返回值,再去hashCode值对应的位置取出元素。

2.2 LinkedHashSet类

LinkedHashSet是HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素的存储位置。但它使用链表维护元素的次序,元素的顺序与添加顺序一致。由于LinkedHashSet需要维护元素的插入顺序,因此性能比HashSet低,但在迭代访问Set里的全部元素时有很好的性能。

2.3 TreeSet类

TreeSet是SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用红黑树的数据结构来存储集合元素。TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序。

自然排序

TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素的大小关系,然后将元素按照升序排列。如果试图将一个对象添加到TreeSet集合中,该对象必须实现Comparable接口,否则会抛出异常。对象比较大小例如obj1.compareTo(obj2),如果返回0,则两个对象相等;如果返回正数,则obj1大于obj2;如果返回负数,则obj1小于obj2。

Java常用类中有以下几个已经实现了Comparable接口:

1. BigDecimal:BigDecimal以及所有数值型对应的包装类,按照它们对应的数值大小进行比较。

2. Charchter:按照字符的unicode值进行比较。

3. Boolean:true对应的包装类实例大于false对应的包装类实例。

4. Strring:按照字符串中的字符的unicode值进行比较。

5. Date、Time:后面的时间,日期大于前面的时间,日期。

定制排序

想要实现定制排序,需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由Compatator对象负责集合元素的排序逻辑。

所以,自然排序实现的是Comparable接口,定制排序实现的是Comparator接口。

2.4 EnumSet类

EnumSet是一个专为枚举设计的集合类,不允许添加null值。EnumSet的集合元素也是有序的,它以枚举值在Enum类内的定义顺序来决定集合元素的顺序。

2.5 总结

TreeSet排序,LinkedHashSet遍历,HashSet添加和查找。EnumSet性能最好,但只能保存同一个枚举类的枚举值作为集合元素。

3. List集合

List集合是一个有序,可重复的集合。集合中每个元素都有其对应的顺序索引。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似于数组的下标)来访问指定位置的集合元素。

3.1 ArrayList

ArrayList是一个动态数组。允许任何符合规则的元素插入并且包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着元素不断增加,容器大小也会增加。在每次添加元素时都会进行容量检查,当快要溢出时,就会进行扩容操作。所以如果知道插入元素的数量,最好指定一个初始容量值,可以避免过多的扩容操作浪费时间和效率。

3.2 LinkedList

LinkedList实现了Deque接口,可以当作双端队列使用,也就是说可以作为栈也可以作为队列。LinkedList与ArrayList的实现机制不同,ArrayList内部以数组的形式保存集合元素,所以通过随机访问集合的元素有较好的性能;LinkedList内部以链表的形式保存集合元素,所以随机访问性能较差,但是插入删除元素有较好的性能。

3.3 Vector

与ArrayList类似,但是Vector是同步的,是线程安全的动态数组。

3.4 Stack

Stack继承自Vector,实现了一个先进后出的堆栈。Stack提供了5个额外的方法:基本的push方法和pop方法,还有peek方法返回栈顶的元素,empty方法查看栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建时是空栈。

3.5 Iterator接口和ListIterator接口

Iterator是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供了以下API:

boolean hasNext():判断集合是否存在下一个元素。如果有,返回true。

Object next():返回集合里下一个元素。

void remove():删除集合里上一次next方法返回的元素。

ListIterator接口继承Iterator,提供了专门操作List的方法,增加了以下一些方法:

boolean hasPrevious():判断集合是否存在上一个元素。

Object previous():返回集合里上一个元素。

void add(Object o):在指定位置插入一个元素。

4. Map集合

Map接口采用键值对Map<K,V>的存储方式。Map集合里保存两组值,一组值保存key,一组值保存value。key和value可以是任意引用类型的数据。key值不允许重复,可以为null。当添加的元素key值已经存在时,新的value会覆盖原来的value。

常见方法如下(来源于API):

4.1 HashMap

HashMap基于hashing原理,通过put()方法和get()方法存储和获取对象。将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashCode值,然后找到bucket位置来存储值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回对象。HashMap用链表解决碰撞问题,当发生碰撞了,对象将会存储在链表的下一个节点中。

4.2 LinkedHashMap

LinkedHashMap使用双向链表来维护键值对的次序,该链表负责维护Map的迭代顺序,与插入顺序一致,因此性能比HashMap低,但在迭代访问Map里的全部元素时性能较好。

4.3 Properties

Properties类是Hashtable类的子类,相当于一个key、value都是String类型的Map,主要用于读取配置文件。

4.4 TreeMap

TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap也有两种排序方式:

自然排序:TreeMap的所有key必须实现Comparable接口,并且所有的key应该是同一个类的对象,否则会抛出ClassCastException。

定制排序:创建TreeMap对象时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。

转载自https://www.cnblogs.com/bingyimeiling/p/10255037.html,作者:冰湖一角

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值