Java集合
Java集合、泛型和枚举
Java集合
为了保存数量不确定的数据,以及保存具有映射关系的数据,提供了集合类
所有的集合类都位于java.util包下
-
集合&数组
数组既可以是基本类型的值,也可以是对象,集合只能保存对象
数组长度固定,集合长度可变


常用集合的分类
-
Collection接口的接口 对象的集合(单列集合)
-
List接口:元素按进入先后有序保存,可重复
-
LinkedList接口实现类,链表,插入删除快,没有同步
-
ArrayList接口实现类,数组,随机访问,没有同步
-
Vector口实现类,数组,同步,线程安全
-
Stack是Vector类的实现类
-
-
-
Set接口:仅接收一次,不可重复,内部排序
-
HashSet使用hash表存储元素
-
LinkedHashSet链表维护元素的插入次序
-
-
TreeSet底层实现为二叉树,元素排好序
-
-
-
Map 接口 键值对的集合 (双列集合)
-
Hashtable接口实现类, 同步, 线程安全
-
HashMap 接口实现类 ,没有同步, 线程不安全
-
LinkedHashMap 双向链表和哈希表实现
-
WeakHashMap
-
-
TreeMap 红黑树对所有的key进行排序
-
IdentifyHashMap
-
何时使用

List集合:ArrayList & LinkedList
List是有序、可重复的集合,允许使用重复元素,可以通过索引访问指定位置的元素。
ArrayList类
ArrayList实现了可变数组的大小,提供了快速基于索引访问元素的方式,对尾部成员的增加和删除支持较好。
List list = new ArrayList();
允许对集合中的元素进行快速的随机访问,向ArrayList中插入与删除元素的速度相对较慢
LinkedList类
采用链表结构保存对象,便于向集合中插入或删除元素,随机访问元素相对较慢。
LinkedList<String> list = new LinkedList<String>();
ArrayList和LinkedList的区别和适用场景
-
ArrayList
优点:实现了基于动态数组的数据结构,地址连续,一旦存储好了,查询操作效率会比较高
缺点:因为地址连续,ArrayList要移动数据,插入和删除操作效率比较低
-
LinkedList
优点:基于链表的数据结构,地址是任意的,对于add和remove比较占优势,适用于要头尾操作或插入指定位置的场景
缺点:因为要移动指针,查询操作性能比较低
-
多次访问用ArrayList,多次增加删除用LinkedList
Set集合
HashSet类
HashSet 是按照 Hash 算法来存储集合中的元素。因此具有很好的存取和查找性能。
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值
HashSet hs = new HashSet(); //调用无参的构造函数创建HashSet对象
HashSet<String> hss = new HashSet<String>(); //创建泛型的HashSet集合对象
如果向 Set 集合中添加两个相同的元素,则后添加的会覆盖前面添加的元素,即在 Set 集合中不会出现相同的元素。
TreeSet类
使用 TreeSet 类实现的 Set 接口默认情况下是自然排序的,这里的自然排序指的是升序排序。
TreeSet<Double> scores = new TreeSet<Double>(); // 创建 TreeSet 集合
Map集合
Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键(key)对象和一个值(value)对象。用于保存具有映射关系的数据。key不能重复,value可以重复
HashMap users = new HashMap();
用key遍历:Iterator it = users.keySet().iterator(); while(it.hasNext())
Collections类
数组排序方法:Arrays.sort();
List集合排序方法和查找替换操作:
List prices = new ArrayList();
Collections.sort(prices); //对集合进行排序
Collections.reverse(prices); //反转排序
List products = new ArrayList();
Collections.fill(products, "AAA"); //把元素都改为AAA
List nums = new ArrayList();
Collections.max(nums); //找出最大值
Collections.min(nums); //找出最小值
Collections.replace(nums, 0, 1); //把nums中的0都换成1
Collections.frequency(nums, -5); //-5出现的次数
Collections.sort(nums);
Collections.binarySearch(nums, 3); //排序后才能进行二分法查询,获得元素的索引
Collections.copy(destList, srcList);
//把srcList的元素复制到destList里面,按之前的索引直接替换,destList的长度要大于等于srcList

浙公网安备 33010602011771号