一、JAVA集合框架概述
集合可以看作是一种容器,用来存储对象信息 。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下 。
数组与集合的区别如下:
1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据 。
2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象 。
Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口) 。
Java集合框架图如下:
其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value 。
上图中淡绿色背景覆盖的是集合体系中常用的实现类,分别是ArrayList、LinkedList、ArrayQueue、HashSet、TreeSet、HashMap、TreeMap等实现类 。
二、Java集合常见接口及实现类
1. Collection接口常见方法(来源于Java API)
2. Set集合
Set集合与Collection的方法相同,由于Set集合不允许存储相同的元素,所以如果把两个相同元素添加到同一个Set集合,则添加操作失败,新元素不会被加入,add()方法返回false 。为了帮助理解,请看下面代码示例:
public static void main(String[] args) {
Set<String> set=new HashSet();
set.add("hello world");
set.add("hello 冰湖一角");
set.add("hello 冰湖一角");
System.out.println("集合中元素个数:"
+set.size());
System.out.println("集合中元素为:"
+set.toString());
}
}</pre>
运行结果如下:
集合中元素个数:2 集合中元素为:[hello world, hello 冰湖一角]
分析:由于String类中重写了hashCode()和equals()方法,用来比较指向的字符串对象所存储的字符串是否相等 。所以这里的第二个"hello 冰湖一角"是加不进去的 。
下面着重介绍Set集合几个常用实现类:
1)HashSet类
HashSet是Set集合最常用实现类,是其经典实现 。HashSet是按照hash算法来存储元素的,因此具有很好的存取和查找性能 。
HashSet具有如下特点:
♦ 不能保证元素的顺序 。
♦ HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步 。
♦ 集合元素值可以是null 。
HashSet存储原理如下:
当向HashSet集合存储一个元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,然后根据hashCode值决定该对象的存储位置 。HashSet集合判断两个元素相等的标准是(1)两个对象通过equals()方法比较返回true;(2)两个对象的hashCode()方法返回值相等 。因此,如果(1)和(2)有一个不满足条件,则认为这两个对象不相等,可以添加成功 。如果两个对象的hashCode()方法返回值相等,但是两个对象通过equals()方法比较返回false,HashSet会以链式结构将两个对象保存在同一位置,这将导致性能下降,因此在编码时应避免出现这种情况 。
HashSet查找原理如下:
基于HashSet以上的存储原理,在查找元素时,HashSet先计算元素的HashCode值(也就是调用对象的hashCode方法的返回值),然后直接到hashCode值对应的位置去取出元素即可,这就是HashSet速度很快的原因 。
重写hashCode()方法的基本原则如下:
♦ 在程序运行过程中,同一个对象的hashCode()方法返回值应相同 。
♦ 当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()方法返回值应该相等 。
♦ 对象中用作equals()方法比较标准的实例变量,都应该用于计算hashCode值 。
2)LinkedHashSet类
LinkedHashSet是HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素的存储位置 。但它使用链表维护元素的次序,元素的顺序与添加顺序一致 。由于LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet,但在迭代访问Set里的全部元素时由很好的性能 。
3)TreeSet类
TreeSet时SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用红黑树的数据结构来存储集合元素 。TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序 。
♦ 自然排序
推荐阅读
- 怎样科学的鉴别茶叶
- java对MongoDB数据库操作
- 浏览器是如何解析JavaScript的?
- JavaScript中几个常用函数的代码实现
- Java中String类的常用方法详解
- GC 一篇文章彻底了解Java垃圾收集机制
- Java编程中如何正确的将byte「」数组转化为String类型?
- 利用JavaScript实现滚屏显示
- java连接Mysql数据库遇到的bug
- java:究竟什么是可重入锁?
