Java高级特性之集合

JAVA集合框架
一、Java集合框架概述

Java高级特性之集合

文章插图
 
1、数组与集合的区别:
1) 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据 , 以及保存具有映射关系的数据 。
2)数组元素既可以是基本类型的值 , 也可以是对象;集合只能保存对象 。
2、Java集合类主要由两个根接口Collection和Map派生出来的 , Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列) , 因此Java集合大致也可分成List(有序、可重复集合、可直接根据元素的索引来访问)、Set(无序、不可重复集合、只能根据元素本身来访问)、Queue(队列集合)、Map(存储key-value对的集合 , 可根据元素的key来访问value)这四种 。
二、Java集合常见接口及实现类
1、Collection接口常见方法
Java高级特性之集合

文章插图
 
2、 List集合
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack 。
它们都可以容纳所有类型的对象 , 包括 null , 允许重复 , 并且都保证元素的存储顺序 。( 可重复 , 有顺序)
1)ArrayList
ArrayList 对数组进行了封装 , 实现了长度可变的数组(动态数组) , 和数组采用相同存储方式 , 在内存中分配连续的空间 , 它的优点在于遍历元素和随即访问元素的效率比较高 。
ArrayList特点:线程不安全 , 查询速度快 ; 底层数据结构是数组结构 ; 扩容增量:原容量的 1.5倍  ,  如 ArrayList的容量为10 , 一次扩容后是容量为15。
2)LinkedList
LinkedList是List接口的另一个实现 , 除了可以根据索引访问集合元素外 , LinkedList还实现了Deque接口 , 可以当作双端队列来使用 , 也就是说 , 既可以当作“栈”使用 , 又可以当作队列使用 。
LinkedList 采用链表存储方式 , 优点在于插入、删除元素时效率比较高 , 它提供了额外的 addFirst()、addLast()、removeFirst()和 removeLast()等方法 , 可以在LinkedList 的首部或尾部进行插入或者删除操作 。
3)Vector
与ArrayList相似 , 但是Vector是同步的 。所以说Vector是线程安全的动态数组 。它的操作与ArrayList几乎一样 。
3、 Set集合
实现Set集合的接口主要有:HashSet、TreeSet、LinkedHashSet;
Set集合与Collection的方法相同 , 由于Set集合不允许存储相同的元素 , 所以如果把两个相同元素添加到同一个Set集合 , 则添加操作失败 , 新元素不会被加入 , add()方法返回false 。(无序、不重复)
1)HashSet
HashSet是按照hash算法来存储元素的 , 因此具有很好的存取和查找性能 。
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速度很快的原因 。
HashSet特点:
不能保证元素的顺序;集合元素值可以是null;线程不安全 , 存取速度快; 底层实现是一个 HashMap(保存数据) , 实现Set接口; 默认初始容量为 16; 加载因子为 0.75:即当 元素个数 超过 容量长度的0.75倍 时 , 进行扩容; 扩容增量:原容量的 1 倍; 如 HashSet的容量为16 , 一次扩容后是容量为32 。


推荐阅读