面试官:介绍下项目中常用的集合

引言

Java集合框架为数据存储和操作提供了强大的工具。
本文主要介绍java常用集合的原理、优缺点、注意事项及使用示例。

正文

1.List

1.1. ArrayList
  • 原理: 基于动态数组实现,支持快速随机访问。
  • 优点: 随机访问速度快。
  • 缺点: 插入和删除较慢,尤其在中间位置。
  • 注意事项: 非线程安全。

示例:

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

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

        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}
1.2. LinkedList
  • 原理: 基于双向链表实现。
  • 优点: 插入和删除效率高。
  • 缺点: 随机访问速度慢。
  • 注意事项: 非线程安全。

示例:

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

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

        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

2. Set

2.1. HashSet
  • 原理: 基于哈希表实现。
  • 优点: 操作速度快。
  • 缺点: 无序。
  • 注意事项: 非线程安全。

示例:

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

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

        for (String fruit : set) {
            System.out.println(fruit);
        }
    }
}
2.2. TreeSet
  • 原理: 基于红黑树实现。
  • 优点: 元素有序。
  • 缺点: 操作速度比 HashSet 慢。
  • 注意事项: 非线程安全。

示例:

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

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

        for (String fruit : set) {
            System.out.println(fruit);
        }
    }
}

3. Map

3.1. HashMap
  • 原理: 基于哈希表实现。
  • 优点: 操作速度快。
  • 缺点: 无序。
  • 注意事项: 非线程安全。

示例:

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

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

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
3.2. TreeMap
  • 原理: 基于红黑树实现。
  • 优点: 键有序。
  • 缺点: 操作速度比 HashMap 慢。
  • 注意事项: 非线程安全。

示例:

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

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

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

注意事项总结

  • 线程安全: 默认集合类不是线程安全的。在多线程环境中,考虑使用同步包装或并发集合类。
  • 性能: 根据操作类型选择合适的集合类型。
  • 顺序: 选择合适的集合类型以满足顺序需求(如插入顺序、有序等)。

二、线程安全

1. Vector

  • 原理: 类似于 ArrayList,但所有方法都被同步。
  • 优点: 线程安全。
  • 缺点: 相比 ArrayList,性能较低,因为每个操作都需要获取锁。

示例:

import java.util.Vector;

public class VectorDemo {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("Apple");
        vector.add("Banana");
        vector.add("Orange");

        for (String fruit : vector) {
            System.out.println(fruit);
        }
    }
}

2. Hashtable

  • 原理: 类似于 HashMap,但所有方法都被同步。
  • 优点: 线程安全。
  • 缺点: 相比 HashMap,性能较低。

示例:

import java.util.Hashtable;

public class HashtableDemo {
    public static void main(String[] args) {
        Hashtable<String, Integer> table = new Hashtable<>();
        table.put("Apple", 1);
        table.put("Banana", 2);
        table.put("Orange", 3);

        for (String key : table.keySet()) {
            System.out.println(key + ": " + table.get(key));
        }
    }
}

3. Collections.synchronizedList / synchronizedSet / synchronizedMap

  • 原理: 使用 Collections 提供的静态方法包装集合,使其线程安全。
  • 优点: 线程安全。
  • 缺点: 每次访问集合时都需要同步,性能较低。

示例:

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

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

        synchronized (list) {
            for (String fruit : list) {
                System.out.println(fruit);
            }
        }
    }
}

4. ConcurrentHashMap

  • 原理: 使用分段锁机制提高并发性能。
  • 优点: 高效的线程安全。
  • 缺点: 比 HashMap 复杂。

示例:

import java.util.concurrent.ConcurrentHashMap;

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

        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

5. CopyOnWriteArrayList / CopyOnWriteArraySet

  • 原理: 每次修改时复制整个底层数组。
  • 优点: 适合读多写少的场景。
  • 缺点: 写操作开销大。

示例:

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListDemo {
    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

注意事项

  • 性能: 在选择线程安全集合时,考虑读写操作的频率。
  • 锁粒度: 使用更细粒度的锁(如 ConcurrentHashMap)可以提高并发性能。
  • 适用场景: 根据使用场景选择合适的线程安全集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值