【深入探究Java集合框架】从List到Map的完整指南

简介: 【深入探究Java集合框架】从List到Map的完整指南


🌟 Java集合框架

Java集合框架是Java编程语言提供的一组类和接口,用于表示集合,并提供了相关的操作和算法。在Java集合框架中,集合分为三种类型:ListSetMap。其中,List是有序的集合,允许重复元素;Set是无序且不允许重复元素的集合;而Map是一种映射关系,它将一个键与一个值相关联。这些集合提供了非常多的操作,比如添加、删除、查找、排序等。

🍊 Collection

Java集合框架中的根接口是Collection,它提供了基本的集合操作。在Collection接口中有两个子接口:ListSet

🎉 List

List接口是有序的集合,允许重复元素。List接口有三个主要的实现类:ArrayListVectorLinkedList。其中,ArrayList底层是一个数组,使用空间较少,线程不安全,因此性能较高。默认情况下,ArrayList的初始容量为10,当添加元素时,如果当前容量不足,则会进行扩容,扩容为原来的1.5倍。Vector是一个线程安全的List实现,它的底层也是一个数组,但是比ArrayList慢。LinkedList底层是双向链表,因此添加和删除元素的性能非常高,但是查找元素的性能较低。

示例代码如下:

import java.util.List;
import java.util.ArrayList;
import java.util.Vector;
import java.util.LinkedList;
public class ListExample {
    public static void main(String[] args) {
        // ArrayList示例
        List<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a"); // 允许重复元素
        System.out.println("ArrayList示例:" + arrayList);
        // Vector示例
        List<String> vector = new Vector<>();
        vector.add("d");
        vector.add("e");
        vector.add("f");
        System.out.println("Vector示例:" + vector);
        // LinkedList示例
        List<String> linkedList = new LinkedList<>();
        linkedList.add("g");
        linkedList.add("h");
        linkedList.add("i");
        linkedList.add("g"); // 允许重复元素
        System.out.println("LinkedList示例:" + linkedList);
    }
}

🎉 Set

Set接口是无序并且不允许重复元素的集合。Set接口有三个主要的实现类:HashSetLinkedHashSetTreeSet。其中,HashSet底层实现是基于HashMap,使用哈希表来存储元素。当向HashSet中添加元素时,会根据元素的hashCode值来计算存储位置,如果该位置已经有元素,则将其链接在链表的末尾;如果链表长度达到8,则将链表转换为红黑树,以提高查找效率。LinkedHashSetHashSet的子类,底层实现也是基于HashMap,但是额外维护了一个链表,用于维护元素的插入顺序。TreeSet底层使用红黑树来存储元素,因此可以保证元素的有序性,并且提供了一些基于排序的操作。

示例代码如下:

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class SetExample {
    public static void main(String[] args) {
        // 创建一个HashSet集合
        HashSet<String> hashSet = new HashSet<>();
        // 添加元素到HashSet中
        hashSet.add("apple");
        hashSet.add("banana");
        hashSet.add("orange");
        hashSet.add("watermelon");
        hashSet.add("grape");
        hashSet.add("pineapple");
        // 遍历HashSet集合中所有元素
        for (String fruit : hashSet) {
            System.out.println(fruit);
        }
        // 创建一个LinkedHashSet集合
        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
        // 添加元素到LinkedHashSet中
        linkedHashSet.add("apple");
        linkedHashSet.add("banana");
        linkedHashSet.add("orange");
        linkedHashSet.add("watermelon");
        linkedHashSet.add("grape");
        linkedHashSet.add("pineapple");
        // 遍历LinkedHashSet集合中所有元素
        for (String fruit : linkedHashSet) {
            System.out.println(fruit);
        }
        // 创建一个TreeSet集合
        TreeSet<String> treeSet = new TreeSet<>();
        // 添加元素到TreeSet中
        treeSet.add("apple");
        treeSet.add("banana");
        treeSet.add("orange");
        treeSet.add("watermelon");
        treeSet.add("grape");
        treeSet.add("pineapple");
        // 遍历TreeSet集合中所有元素
        for (String fruit : treeSet) {
            System.out.println(fruit);
        }
    }
}

🎉 Map

Map是一种映射关系,它将一个键与一个值相关联。Map接口中的键是无序、不可重复的,值是无序但可重复的。Map接口有四个主要的实现类:HashMapLinkedHashMapTreeMapHashTable。其中,HashMap底层实现是基于哈希表,它使用键的hashCode值来计算存储位置,并使用链表(JDK1.8之后,链表长度达到8时会自动转化为红黑树)来解决哈希冲突。LinkedHashMapHashMap的子类,它维护了一个双向链表来维护元素的插入顺序。TreeMap底层使用红黑树来存储元素,根据键的自然排序或指定的比较器来排序键。HashTable是一个线程安全的Map实现,它的底层实现与HashMap相似,但不允许键或值为空,且操作都是同步的。

示例代码如下:

import java.util.*;
public class MapExamples {
    public static void main(String[] args) {
        // 创建HashMap示例
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("Alice", 25);
        hashMap.put("Bob", 30);
        hashMap.put("Charlie", 35);
        System.out.println("HashMap: " + hashMap);
        // 创建LinkedHashMap示例
        Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("Alice", 25);
        linkedHashMap.put("Bob", 30);
        linkedHashMap.put("Charlie", 35);
        System.out.println("LinkedHashMap: " + linkedHashMap);
        // 创建TreeMap示例
        Map<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("Alice", 25);
        treeMap.put("Bob", 30);
        treeMap.put("Charlie", 35);
        System.out.println("TreeMap: " + treeMap);
        // 创建HashTable示例
        Hashtable<String, Integer> hashTable = new Hashtable<>();
        hashTable.put("Alice", 25);
        hashTable.put("Bob", 30);
        hashTable.put("Charlie", 35);
        System.out.println("HashTable: " + hashTable);
    }
}

🍊 集合的选择

在Java集合框架中,集合的选择应该根据集合的特点和使用场景进行选择。例如,如果需要有序并且允许重复元素的集合,则应该选择List接口;如果需要无序并且不允许重复元素的集合,则应该选择Set接口;如果需要维护映射关系,则应该选择Map接口。但是,具体的实现类的选择应该根据集合的性能需求和使用场景进行选择。例如,如果需要高效的随机访问和修改元素,则应该选择ArrayList;如果需要高效的添加和删除元素,则应该选择LinkedList。如果需要维护元素的插入顺序,则应该选择LinkedHashSetLinkedHashMap。如果需要元素的自然排序或者指定的比较器进行排序,则应该选择TreeSetTreeMap。如果需要线程安全,则应该选择VectorHashTable

Java代码示例:

🎉 1. 有序并允许重复元素的集合 List

List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list);

🎉 2. 无序并且不允许重复元素的集合 Set

Set<String> set=new HashSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");
System.out.println(set);

🎉 3. 维护映射关系的集合 Map

Map<String,Integer> map=new HashMap<String,Integer>();
map.put("Hello",1);
map.put("World",2);
map.put("Java",3);
System.out.println(map);

🎉 4. 高效的随机访问和修改元素 ArrayList

List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list.get(1));
list.set(1,"Python");
System.out.println(list);

🎉 5. 高效的添加和删除元素 LinkedList

List<String> list=new LinkedList<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list);
list.addFirst("Python");
list.removeLast();
System.out.println(list);

🎉 6. 维护元素的插入顺序 LinkedHashSet

Set<String> set=new LinkedHashSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");
System.out.println(set);

🎉 7. 元素的自然排序或者指定的比较器进行排序 TreeSet

Set<String> set=new TreeSet<String>();
set.add("Hello");
set.add("World");
set.add("Java");
System.out.println(set);

🎉 8. 线程安全 Vector

List<String> list=new Vector<String>();
list.add("Hello");
list.add("World");
list.add("Java");
System.out.println(list);

🎉 9. 线程安全 HashTable

Map<String,Integer> map=new Hashtable<String,Integer>();
map.put("Hello",1);
map.put("World",2);
map.put("Java",3);
System.out.println(map);


相关文章
|
6天前
|
安全 Java 大数据
|
28天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
26天前
|
存储 算法 Java
Java集合框架知识点学习核心总结
Java集合框架包含Collection、List(ArrayList、LinkedList)、Set(HashSet、TreeSet)、Map(HashMap、TreeMap)接口及迭代器、泛型、比较器。迭代器用于遍历集合,泛型避免类型转换,比较器用于元素比较。集合框架还提供排序、查找、去重算法。Java 8新增Stream API、Lambda表达式和Optional类,提升集合操作效率。
19 6
|
29天前
|
存储 安全 Java
精通Java集合框架:高效数据处理之道
【4月更文挑战第2天】Java集合框架核心包括Collection、List、Set、Map接口,及ArrayList、LinkedList、HashSet等实现类。选择合适类型如ArrayList(随机访问)和LinkedList(插入删除)能提升性能。使用Collections工具类进行排序、查找等操作,结合并发集合如CopyOnWriteArrayList和ConcurrentHashMap以支持多线程。性能调优、理解接口特性和应用场景是关键,助你高效处理数据。
精通Java集合框架:高效数据处理之道
|
5天前
|
算法 安全 搜索推荐
Java集合常见工具类
Java集合常见工具类
6 0
|
6天前
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
8 0
|
7天前
|
存储 设计模式 算法
Java从入门到精通:2.1.1深入学习Java核心技术——掌握Java集合框架
Java从入门到精通:2.1.1深入学习Java核心技术——掌握Java集合框架
|
8天前
|
存储 Java C++
Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
21 0
|
8天前
|
存储 算法 安全
Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
15 0
|
12天前
|
存储 安全 算法
Java基础教程(11)-Java中的集合类
【4月更文挑战第11天】Java集合框架核心是Collection和Map接口,其中Collection分为List和Set,常用实现有ArrayList、LinkedList、HashSet和TreeSet。Map接口实现如HashMap和Hashtable,提供键值对存储。面试常问的HashMap与Hashtable差异在于线程安全、继承关系、null值接受及扩容策略。遍历集合通常使用Iterator,也可用for-each循环。Hash涉及数据压缩映射,用于快速查找,存在碰撞可能性。