Java集合

Java集合、泛型和枚举

Java集合

为了保存数量不确定的数据,以及保存具有映射关系的数据,提供了集合类

所有的集合类都位于java.util包下

  • 集合&数组

    数组既可以是基本类型的值,也可以是对象,集合只能保存对象

    数组长度固定,集合长度可变

Java接口

Java实现类

常用集合的分类

  • 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
posted @ 2021-01-11 11:48  GladysChloe  阅读(58)  评论(0)    收藏  举报