java学习总结 - 集合

Table of Contents

 

HashSet

TreeSet:

自然排序

定制排序

List与ArrayList

ArrayList和Vector

Map

HashMap 与 Hashtable

TreeMap

Collections操作集合的工具类


 

集合类存放在java.util包中,是一个用来存放对象的容器。

  • 集合只能存放对象,比如存一个int型整数5放入集合中,其实它是自动转换成Integer类后存入的,java中每一种基本类型都有对应的引用类型
  • 集合存放的是多个对象的引用,对象本身还是放在堆内存中
  • 集合可以存放不同类型,不限数量的数据类型

java集合可分为Set、List和Map三种大体系:

  • Set:无序、不可重复的集合
  • List:有序,可重复的集合
  • Map:具有映射关系的集合

在JDK5之后,增加了泛型,Java集合可以记住容器中对象的数据类型。

HashSet

HashSet是Set接口的典型实现,大多数时候使用Set集合时都是使用这个实现类。

HashSet按Hash算法来存储集合张的元素,因此具有很好的存取和查找性能。

HashSet具有以下特性:

  • 不能保证元素的排列顺序
  • 不可重复(指hashCode值不相同)
  • HashSet不是线程安全的
  • 集合元素可以是null
  • 集合可以存不同类型的对象

当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中存储位置。

如果两个元素的equals()方法返回true,但他们的hashCode()返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。

java学习总结 - 集合

泛型

如果想让集合只能存同样类型的对象,使用泛型。例如  Set<String> s = new HashSet<String>();

而 Set set = new HashSet(); 可以存不同类型的对象。

TreeSet:

TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。

java学习总结 - 集合

自然排序

TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列:

  • 如果this>obj,返回正数1
  • 如果this<obj,返回负数-1
  • 如果this=obj,返回0,则认为这两个对象相等
  • 必须放入同样类的对象。(默认会进行排序)否则可能会发生类型转换异常。我们可以使用泛型来进行限制。

定制排序

如果需要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator接口的实现类对象。由该Comparator对象负责集合元素的排序逻辑。

List与ArrayList

List代表一个元素有序且可重复的集合,集合中的每个元素都有其对应的顺序索引。

List允许使用重复元素,可以通过索引来访问指定位置的集合的元素。

List默认按元素的添加顺序设置元素的索引。

List集合里添加了一些根据索引来操作集合元素的方法。

java学习总结 - 集合

ArrayList和Vector

ArrayList和Vector时List接口的两个典型实现。

区别:

  • Vector时一个古老的集合,通常建议使用ArrayList
  • ArrayList时线程不安全的,而Vector时线程安全的
  • 即使为保证List集合线程安全,也不推荐使用vector

Map

Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的Key,另外一组用于保存Map里的Value.

Map中的key和value都可以是任何引用类型的数据

Map中的key不允许重复,即同一个Map对象的任何两个Key通过equals方法比较返回false

Key和Value之间存在单向一对一关系,即通过指定的Key总能找到唯一的,确定的Value。

HashMap是堆Map接口的经典实现。

HashMap 与 Hashtable

HashMap和Hashtable是Map接口的两个典型实现类。

区别:

  • Hashtable是一个古老的Map实现类,不建议使用
  • Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的
  • Hashtable不允许使用null作为key和value,而HashMap可以

与HashSet集合不能保证元素的顺序一样,Hashtable和HashMap也不能保证其中key-value对的顺序。

Hashtable、HashMap判断两个key相等的标准是:两个key通过equals方法返回true,hashCode值也相等。

Hashtable相等的标准是:两个value通过equalHashMap判断两个Values方法返回true。

TreeMap

TreeMap存储key-value时,需要根据key对key-value对进行排序。TreeMap可以保证所有的key-value对处于有序状态。

TreeMap的key的排序:

  • 自然排序: TreeMap的所有的key必须实现Comparable接口,而且所有的Key应该是同一个类的对象,否则将会抛出ClassCastException
  • 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。此时不需要Map的key实现Comparable接口

Collections操作集合的工具类

Collections时一个操作Set、List和Map等集合的工具类

Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制方法

排序操作:

java学习总结 - 集合

java学习总结 - 集合

Collections类中提供了多个synchronizedXxx()方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。