Java核心技术【十八】Java集合框架精讲:List、Set、Map

发布于:2024-07-02 ⋅ 阅读:(10) ⋅ 点赞:(0)

Java集合框架精讲:List、Set、Map的使用详解与代码示例

Java集合框架是Java编程中不可或缺的一部分,它提供了一系列容器类,用于存储和操作不同类型的数据集。在Java集合框架中,ListSetMap是最常用的三种集合类型,它们各自具有独特的特性和使用场景。本文将详细介绍这三种集合的特性和使用场景,并通过代码示例帮助你更好地理解它们的运作机制,同时对比它们在不同场景下的适用性。

一、List:有序且允许重复的集合

List是一种有序的集合,它允许元素重复,并且可以保持元素的插入顺序。List的主要实现类包括ArrayListLinkedList

1. ArrayList

ArrayList是基于动态数组实现的List,它提供了随机访问元素的能力,适用于需要频繁访问元素但较少修改元素的场景。

1.1 特点

  • 基于动态数组实现,提供了随机访问元素的能力。
  • 在数组末尾添加元素效率较高,但在数组中间插入或删除元素效率较低,因为需要移动大量元素。
  • 元素是有序的,且可以包含重复元素。

1.2 适用场景

  • 当你需要频繁访问集合中的元素时,ArrayList是不错的选择。
  • 如果集合的大小已知或接近最终大小,使用ArrayList可以避免多次扩容带来的性能损耗。
  • 不适合需要频繁在集合中间进行插入或删除操作的场景。

1.3 代码示例

package java_core_18;
import java.util.List;
import java.util.ArrayList;

public class ArrayListExample {

	public static void main(String[] args) {
		
		 List<String> list = new ArrayList<>();
	        list.add("Apple");
	        list.add("Banana");
	        list.add("Cherry");

	        System.out.println("List: " + list);
	        System.out.println("List中的第一个元素: " + list.get(1));

	}

}

1.4 运行结果

List: [Apple, Banana, Cherry]
List中的第一个元素: Banana

2. LinkedList

LinkedList是基于双向链表实现的List,它在元素的添加和删除操作上表现更优,适用于需要频繁修改元素的场景,尤其是在集合头部或尾部进行操作。

2.1 特点:

  • 基于双向链表实现,适合在集合的任意位置插入或删除元素。
  • 随机访问元素效率较低,因为需要从头遍历链表。
  • 元素是有序的,且可以包含重复元素。

2.2 适用场景:

  • 当你需要频繁在集合的任意位置进行插入或删除操作时,LinkedList是一个好的选择。
  • 如果集合中元素的访问主要是通过迭代器进行的,LinkedList可以提供较好的性能。
  • 不适合需要频繁随机访问元素的场景。

2.3 示例代码

package java_core_18;
import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {

	public static void main(String[] args) {
		
		List<String> list = new LinkedList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        System.out.println("List: " + list);
        list.remove(1); // 从list中删除 "Banana"元素
        System.out.println("新的 List: " + list);
	}

}

2.4 运行结果

List: [Apple, Banana, Cherry]
新的 List: [Apple, Cherry]

二、Set:无序且不允许重复的集合

Set是一种不允许元素重复的集合,它不保证元素的顺序。Set的主要实现类包括HashSetTreeSet

1. HashSet

HashSet是基于哈希表实现的Set,它提供了较快的添加和查找速度,但元素的顺序是不确定的。HashSet适用于需要快速查找元素的场景。

1.1 特点

  • HashSet是基于HashMap实现的,底层使用HashMap来存储元素,因此元素是无序的。
  • 不允许重复元素,通过equals()hashCode() 方法来判断元素的相等性。
  • 提供了常数时间复杂度 (算法的执行时间是常量,不随输入规模的增加而增加) 的添加、删除和查找操作。

1.2 适用场景

  • 当你需要存储一个元素集合,且需要快速判断元素是否存在集合中时,HashSet是一个很好的选择。
  • 如果集合中的元素需要唯一性,并且元素的顺序不重要,使用HashSet可以提供高效的元素管理和查找。
  • 适合需要快速添加和删除元素的场景,特别是在处理大数据量时,HashSet的性能优势明显。

1.3 示例代码

package java_core_18;

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); //无法添加成功

        System.out.println("Set: " + set);
    }
}

1.4 运行结果

Set: [Apple, Banana]

2. TreeSet

TreeSet是基于红黑树实现的Set,它保证元素的自然排序或自定义排序,适用于需要排序的场景,例如存储唯一且需要排序的元素集合。

2.1 特点

  • 基于红黑树实现,保证了元素的自然排序或自定义排序。
  • 元素是无序的(从客户端角度看),但从内部实现上看,元素按照排序规则存储。
  • 不允许重复元素。

2.2 适用场景

  • 当你需要存储一个元素集合,并且需要这些元素自动排序时,使用TreeSet
  • 如果集合中的元素需要唯一性,并且排序是必要的,TreeSet是一个理想的选择。
  • 不适合需要频繁随机访问元素的场景,虽然TreeSet提供了对数时间复杂度的查找,但相比ArrayList的随机访问还是较慢。

2.3 代码示例

package java_core_18;

import java.util.TreeSet;
import java.util.Set;

public class TreeSetExample {
	
    public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("Banana");
        set.add("Apple");
        set.add("Cherry");

        System.out.println("排序Set: " + set);
    }
}

2.4 执行结果

可以看到Set集合中自动根据元素的开头英文字母进行了排序:

排序Set: [Apple, Banana, Cherry]

三、Map:键值对集合

Map是一种将键映射到值的集合,每个键都是唯一的,且只能映射一个值。Map的主要实现类包括HashMapTreeMap

1. HashMap

HashMap是基于哈希表实现的Map,提供了快速的键值对添加和查找能力,但不保证键值对的顺序。适用于需要快速查找和插入键值对的场景。

1.1 特点:

  • HashMap是基于哈希表实现的键值对集合,提供了快速的键值对查找、插入和删除操作。
  • 键是唯一的,不允许重复,但值可以重复。
  • 提供了平均常数时间复杂度的键值对查找、插入和删除操作。

1.2 适用场景:

  • 当你需要存储键值对,且需要快速通过键来查找对应的值时,HashMap是一个理想的解决方案。
  • 如果键值对集合中的键需要唯一性,并且不需要排序,HashMap提供了高效的查找和插入性能。
  • 适合处理大量数据,特别是当键值对的数量很大时,HashMap的高性能查找可以显著提升应用的响应速度。

1.3 示例代码

package java_core_18;

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Cherry", 3);

        System.out.println("Map: " + map);
        System.out.println("Apple的值为: " + map.get("Apple"));
    }
}

1.4 运行结果

Map: {Apple=1, Cherry=3, Banana=2}
Apple的值为: 1

2. TreeMap

TreeMap是基于红黑树实现的Map,它保证键值对按照键的自然顺序或自定义排序,适用于需要排序的场景,例如存储需要按照一定顺序访问的键值对集合。

2.1 特点

  • 基于红黑树实现,保证了键值对按照键的自然排序或自定义排序。
  • 键是唯一的,不允许重复。
  • 提供了对数时间复杂度 (表示算法的运行时间随着输入规模n的增加而以对数的速度增长)的键值对查找、插入和删除操作。

2.2 适用场景

  • 当你需要存储键值对,并且需要这些键值对自动排序时,使用TreeMap
  • 如果键值对集合中的键需要唯一性,并且排序是必要的,TreeMap是一个理想的选择。
  • 不适合需要频繁随机访问键值对的场景,虽然TreeMap提供了对数时间复杂度的查找,但相比HashMap平均常数时间复杂度还是较慢。

2.3 代码示例

package java_core_18;

import java.util.TreeMap;
import java.util.Map;

public class TreeMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("Banana", 2);
        map.put("Apple", 1);
        map.put("Cherry", 3);

        System.out.println("排序Map: " + map);
    }
}

2.4 执行结果

排序Map: {Apple=1, Banana=2, Cherry=3}

结束语

在Java中选择集合类型时,ArrayList适合随机访问和较少的中间插入删除;LinkedList适用于频繁的两端插入删除和迭代访问;HashSetHashMap提供快速的查找和不重复元素/键的存储,适合不需要排序的场景;而TreeSetTreeMap则保证了元素和键值对的排序,适合需要排序和唯一性的场景。选择时应综合考虑数据访问模式、操作需求、排序需求和性能要求,以达到最优的代码效率和可维护性。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。
源码地址:https://gitee.com/code-in-java/csdn-blog.git