简介
集合:集合是Java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
(1)数组长度的是固定的,集合的长度是可变的。
(2)数组中存储的都是同一类型的元素。集合存储的都是对象,对象的类型可以不一致。
Java集合类主要由两个根接口Collection和Map派生出来的。Collection有三个子接口: List、Set、Queue(Java5新增的队列)。Java集合大致也可分成List、Set、Queue、Map四种接口体系,注意:Map不是Collection的子接口。
Collection接口:单列数据,定义了存取一组对象的方法的集合。
Map接口:双列数据,保存具有映射关系“key-value”对。
Collection子接口:List接口
List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似数组的下标)来访问指定位置的集合元素。
List接口的实现类主要有:ArrayList、LinkedList和Vector
ArrayList: 有序,元素可重复,线程不安全。它是一个动态数组,允许任何符合规则的元素插入包括null。 它能快速随机访问存储的元素,支持随机访问,查询速度快,增删元素慢。
LinkedList: 有序,元素可重复,线程不安全。可以根据索引访问集合元素外,LinkedList还实现了Deque接口。内部以链表的形式保存集合中的元素,所以随机访问集合中的元素性能较差,但在频繁的插入或删除元素时有较好的性能,线程不安全。
Vector: 有序,元素可重复,线程安全。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的,属于强同步类。因此开销就比ArrayList要大,访问要慢。大多数清空下使用 ArrayList而不是Vector,因为同步完全可以由自己来控制。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack。
Collection子接口:Set接口
Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则会添加操作失败。
Set集合判断两个对象是否相同是根据 equals() 方法,而不是使用 == 运算符。
HashSet: 无序,元素不可重复,线程不安全。按Hash算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。
特点:
1、 不能保证元素的排列顺序
2、 HashSet不是线程安全的
3、 集合元素可以是null
HashSet集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则。
LinkedHashSet: 有序,元素不可重复,线程不安全。它是HashSet的子类,它也是根据元素的hashCode值来决定元素的存储位置。但它同时使用双向链表维护元素的次序,元素的顺序与添加顺序一致。
由于LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
LinkedHashSet不允许集合元素重复。
TreeSet: 有序(非输入顺序),元素不可重复,线程不安全。它是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口。
TreeSet底层使用红黑树结构存储数据元素。
TreeSet两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。
Map接口
Map与Collection并列存在。用于保存具有映射关系的数据:key-value
Map中的key和value都可以是任何引用类型的数据
Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashCode()和equals()方法
HashMap: 无序,元素不可重复,线程不安全。它是Map接口使用频率最高的实现类。允许使用null键和null值,与HashSet一样,不保证映射的顺序。
HashMap判断两个key相等的标准是:两个key通过equals() 方法返回true, hashCode值也相等。
HashMap判断两个value相等的标准是:两个value通过equals()方法返回true。
HashMap可以使用null值为key或value
LinkedHashMap: 有序,元素不可重复,线程不安全。它是 HashMap的子类,在HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。 该链表负责维护Map的迭代顺序,与插入顺序一致,因此性能比HashMap低,但在迭代访问Map里的全部元素时有较好的性能。
TreeMap: 有序(非输入顺序),元素不可重复,线程不安全。它是根据key-value对进行排序。TreeMap可以保证所有的Key-Value对处于有序状态。底层采用红黑树的数据结构。
TreeMap也有两种排序方式,自然排序和定制排序。
Hashtable: 无序,元素不可重复,线程安全。
它不允许使用null作为key和value。
Hashtable实现原理和HashMap相同,底层都使用哈希表结构,查询速度快。
Hashtable和HashMap一样也不能保证其中Key-Value对的顺序。
Properties: 无序,元素不可重复,线程安全。它是Hashtable 的子类,该对象用于处理属性文件。
由于属性文件里的key、value都是字符串类型,所以Properties里的key和value都是字符串类型 。