java中的list、set、map

Java集合框架(Java Collections Framework, JCF)是Java语言中为表示和操作集合而设计的一套统一的标准的体系结构,它定义在java.util包下。集合框架主要包括接口、实现类和算法三部分,为开发者提供了丰富的数据结构和算法,用于存储和操作数据。以下是对Java集合框架的详细介绍:

一、集合框架的组成

  1. 接口:集合框架定义了一系列接口,这些接口是抽象数据类型的表示,使得集合的操作和集合的具体实现细节相独立。主要的接口包括:

    • Collection:所有集合的根接口,定义了集合的基本操作,如添加、删除、遍历等。
    • List:有序的集合接口,允许存储重复元素,可以通过索引访问元素。
    • Set:无序的集合接口,不允许存储重复元素。
    • Map:键值对映射接口,每个键最多映射到一个值,键是唯一的。
  2. 实现类:集合框架提供了接口的具体实现类,如ArrayListLinkedListHashSetTreeSetHashMapTreeMap等。这些实现类根据不同的数据结构和算法,提供了不同的性能特性和使用场景。

  3. 算法:集合框架还提供了一些算法,如排序和查找算法,这些算法可以对实现了集合接口的类进行操作。

二、主要接口及其实现类

  1. List接口

    • 有序性:List集合中的元素是有序的,元素的插入顺序决定了它们在集合中的位置。
    • 可重复性:List集合允许存储重复的元素。
    • 主要实现类
      • ArrayList:基于动态数组实现,支持高效的随机访问,但在插入和删除元素时(尤其是当操作发生在列表中间时),性能较低。
      • LinkedList:基于双向链表实现,插入和删除操作效率较高,但随机访问性能较差。
  2. Set接口

    • 无序性:Set集合中的元素是无序的,且不允许有重复元素。
    • 主要实现类
      • HashSet:基于哈希表实现,提供了快速的插入、删除和查找操作,但不保证元素的顺序。
      • TreeSet:基于红黑树实现,元素处于排序状态,支持自然排序或自定义排序。
  3. Map接口

    • 键值对映射:Map接口表示一组键值对的映射关系,每个键最多映射到一个值。
    • 主要实现类
      • HashMap:基于哈希表实现,提供了快速的插入、删除和查找键值对操作,但不保证键的顺序。
      • TreeMap:基于红黑树实现,键处于排序状态,支持自然排序或自定义排序。

三、集合框架的特性

  1. 动态大小:Java集合可以根据需要动态增长或缩小大小,无需手动管理容量。
  2. 泛型支持:集合框架通过泛型提供了类型安全的操作,可以在编译时检查类型错误。
  3. 迭代支持:集合提供了迭代器(Iterator)来遍历元素,方便进行操作和遍历。
  4. 多样化的实现:Java集合提供了多种实现,可以根据不同的需求选择适合的实现类。
  5. 同步性:集合框架提供了同步和非同步的实现,可以根据多线程的需求选择合适的实现类。但需要注意的是,即使是线程安全的实现类(如VectorHashtable),在迭代过程中也可能需要外部同步来避免并发修改异常。

四、使用场景

  • ArrayList:适用于需要频繁随机访问元素的场景。
  • LinkedList:适用于需要频繁插入和删除元素的场景。
  • HashSet:适用于需要快速查找和去重的场景。
  • TreeSet:适用于需要有序集合的场景。
  • HashMap:适用于需要快速查找和插入键值对的场景。
  • TreeMap:适用于需要按照键排序的场景。

Java集合框架是Java开发中不可或缺的一部分,它提供了丰富的数据结构和算法,适用于各种不同的使用场景。了解集合的分类、特性、使用场景以及各自的优劣势,可以帮助开发人员在项目中选择合适的集合实现,提高代码的质量和效率。

以下是Java中List、Set、Map类型的示例:

List(列表)示例:

import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        list.add("Banana"); // 重复元素被允许

        System.out.println(list); // 输出: [Apple, Banana, Cherry, Banana]
    }
}

Set(集合)示例:

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

public class SetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Banana"); // 重复元素不会被添加

        System.out.println(set); // 输出可能是: [Banana, Cherry, Apple],顺序不保证
    }
}

Map(映射)示例:

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

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Cherry", 3);
        map.put("Banana", 4); // “Banana”键的值会被更新为4

        System.out.println(map); // 输出: {Apple=1, Banana=4, Cherry=3}
    }
}

1. List的其他实现类

LinkedList

LinkedList是一个实现了List接口的双向链表。它允许所有可能的列表操作,并且所有操作都是按照双重链接列表的需要执行的。在列表的头部和尾部插入和删除元素时效率特别高。

import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
    public static void main(String[] args) {
        List<String> linkedList = new LinkedList<>();
        linkedList.add("Apple");
        linkedList.addFirst("Orange"); // 在列表头部插入
        linkedList.addLast("Grape"); // 在列表尾部插入

        System.out.println(linkedList); // 输出可能是: [Orange, Apple, Grape]
    }
}
Vector

Vector是一个实现了可增长数组的类,类似于ArrayList,但它是同步的。这意味着它是线程安全的,但性能上可能会比ArrayList差一些。

import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("Apple");
        vector.addElement("Banana"); // Vector特有的方法,与add效果相同

        System.out.println(vector); // 输出: [Apple, Banana]
    }
}

2. Set的其他实现类

TreeSet

TreeSet是一个基于红黑树实现的Set接口,它可以确保集合元素处于排序状态。

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

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

        System.out.println(treeSet); // 输出: [Apple, Banana, Cherry],元素已排序
    }
}

3. Map的其他实现类

LinkedHashMap

LinkedHashMapHashMap的一个子类,它维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代器的遍历顺序,该顺序可以是插入顺序或者是访问顺序。

import java.util.LinkedHashMap;
import java.util.Map;

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

        // 遍历LinkedHashMap,将按照插入顺序输出
        for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
ConcurrentHashMap

ConcurrentHashMap是专为并发环境设计的,它提供了比Hashtable更高的并发级别。它内部细分了多个段(Segment),每一段维护着一块独立的数组和锁,从而实现更高的并发访问性能。

import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
        concurrentHashMap.put("Apple", 1);
        concurrentHashMap.putIfAbsent("Banana", 2); // 如果键不存在,则添加

        System.out.println(concurrentHashMap); // 输出: {Apple=1, Banana=2}
    }
}

这些示例展示了Java集合框架中不同实现类的用法和特性,可以根据具体需求选择合适的实现类。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂跳跳虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值