JAVA之集合

java集合 可以分为两种体系,Collection体系和Map体系。

Collection为单例集合的顶层接口,它表示一组对象,这些对象也成为Collection的元素。需要注意的是,JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如Set和List)的实现。

其中List是元素有序(指的是存储时,与存放顺序保持一致)、可重复的集合。Set是元素无序、不可重复的集合。

Map是一个双列集合,保存具有映射关系“key-value对”的集合。Map中的key和value是一一对应的,且key不允许重复 ,但是value允许重复。

Collection可以分为list集合和set集合。

1 list集合

list集合是一种有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素。

与set集合不同的是,列表通常允许重复的元素。

list集合的特点:①有序:存储和取出的元素顺序 一致 ②可重复:存储的元素可以重复。

list集合主要可以分为Arraylist,Linkedlist和Vector。

Arraylist底层数据结构是数组,具有查询快,增删慢的特点。

Linkedlist底层数据结构是链表,具有查询慢,增删快的特点。

Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:

  Vector 是同步访问的。

  Vector 包含了许多传统的方法,这些方法不属于集合框架。 

Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。

在介绍set集合之前,需要了解何为哈希值。

哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。

Object类中的 public int hashCode()方法可以返回对象的哈希码值。

哈希值特点 :同一个对象多次调用hashCode()方法返回的哈希值是相同的。

默认情况下,不同对象的哈希值是不同的,而重写hashCode()方法,可以实现不同对象的哈希值相同。

2 set集合

set集合是元素无序,不可重复的集合。

set集合分为HashSet,LinkedHashSet和TreeSet集合。

2.1 HashSet集合

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

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

HashSet不能保证元素的排列顺序,且它不是线程安全的,集合元素可以是null。

HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。

对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现相等的对象具有相等的散列码(hashcode)。

值得注意的是,重写equals方法的时候一般都需要同时重写hashCode方法。通常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。

2.2 LinkedHashSet集合

LinkedHashSet 是 HashSet 的子类
LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。

LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
LinkedHashSet 不允许集合元素重复。

2.3 TreeSet集合

TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。

TreeSet底层使用红黑树结构存储数据。

TreeSet 两种排序方法:自然排序和定制排序默认情况下,TreeSet 采用自然排序。

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

如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj) 方法的返回值来比较大小。

定制排序

TreeSet的自然排序要求元素所属的类实现Comparable接口,如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。
利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。

此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。
使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。

3 Map集合

Map是一个双列集合,保存具有映射关系“key-value对”的集合。Map中的key和value是一一对应的,且key不允许重复 ,但是value允许重复。

Map集合的常用实现类有HashMap,LinkedHashMap和 Hashtable。

3.1 HashMap集合

HashMap是Map接口使用频率最高的实现类。

它是无序的集合,存储元素和取出元素的顺序可能不一致。

HashMap底层是哈希表,查询速度非常快(jdk1.8之前是数组+单向链表,1.8之后是数组+单向链表/红黑树 ,链表长度超过8时,换成红黑树)。

HashMap存储自定义类型键值,Map集合保证key是唯一的:作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一。

3.2 LinkedHashMap集合

LinkedHashMap是一个有序 的集合 ,它的存储元素和取出元素的顺序是一致的 。

LinkedHashMap底层是哈希表+链表(记录元素顺序)。它相对于HashMap的改进之处就是:元素存储有序了。

3.3 Hashtable

和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射。
Hashtable 的函数都是同步的,这意味着它是线程安全的,但是速度慢。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

4 Collections工具类

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

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

Collections类的常用方法:

reverse(List):反转 List 中元素的顺序;
shuffle(List):对 List 集合元素进行随机排序;
sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序;
sort(List,Comparator):根据指定的 Comparator比较器 产生的顺序对 List 集合元素进行排序;
swap(List,i,j):将指定 list 集合中的 i 处元素和 j 处元素进行交换。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值