返回

Java & Android 集合框架须知须会(2)

Android

Java 和 Android 集合框架:提高应用程序效率和性能的关键

在 Java 和 Android 开发中,集合框架扮演着至关重要的角色,它为数据存储、组织和管理提供了强大的功能。通过熟练掌握集合框架,开发者可以显著提升应用程序的性能和效率。

一、Map 接口:键值对映射

Map 接口是一个键值对映射,键用于唯一标识一个值。键和值都可以是任意类型。常用的实现类包括:

  • HashMap: 非同步实现,基于哈希表,允许 null 键,不允许重复键。
  • LinkedHashMap: 保留键值对的插入顺序,支持最近最少使用(LRU)删除策略。
  • Hashtable: HashMap 的同步实现,线程安全,但性能较低。
  • TreeMap: 基于红黑树实现,键按自然顺序或指定比较器排序。
// 使用 HashMap 存储学生成绩
Map<String, Integer> studentGrades = new HashMap<>();
studentGrades.put("Alice", 90);
studentGrades.put("Bob", 85);

二、Set 接口:无重复元素的集合

Set 接口表示一组不包含重复元素的对象。常用的实现类有:

  • HashSet: 非同步实现,基于哈希表,不允许重复元素。
  • TreeSet: 基于红黑树实现,元素按自然顺序或指定比较器排序。
  • EnumSet: 专门用于枚举类型的 Set,只能存储枚举类型的元素。
  • LinkedHashSet: 保留插入顺序,支持 LRU 删除策略。
// 使用 HashSet 存储唯一单词
Set<String> uniqueWords = new HashSet<>();
uniqueWords.add("Hello");
uniqueWords.add("World");

三、List 接口:有序元素集合

List 接口是一个有序的元素集合。常用的实现类包括:

  • ArrayList: 基于数组实现,支持快速随机访问,插入和删除较慢。
  • LinkedList: 基于双向链表实现,插入和删除快速,随机访问较慢。
  • Stack: 后进先出(LIFO)栈,只能在栈顶添加和删除元素。
  • Vector: 线程安全的 ArrayList,性能较低。
// 使用 ArrayList 存储购物清单
List<String> shoppingList = new ArrayList<>();
shoppingList.add("Bread");
shoppingList.add("Milk");

四、Queue 接口:先进先出队列

Queue 接口表示一个先进先出(FIFO)队列。常用的实现类有:

  • LinkedList: 可以作为 Queue 实现,支持 FIFO 原则。
  • PriorityQueue: 优先级队列,元素按优先级出队。
  • ArrayDeque: 双端队列,支持从两端添加和删除元素。
// 使用 PriorityQueue 模拟银行排队
PriorityQueue<Customer> bankQueue = new PriorityQueue<>((a, b) -> a.getArrivalTime() - b.getArrivalTime());
bankQueue.add(new Customer("Alice", 10));
bankQueue.add(new Customer("Bob", 5));

五、Android 集合框架:针对 Android 平台的优化

Android 集合框架是 Java 集合框架的一个子集,专门针对 Android 平台进行优化。它包含了基本数据结构(List、Set、Map、Queue)和高级集合类(Cursor、SparseArray)。

Android 集合框架的特点:

  • 线程安全: 类都支持多线程使用。
  • 高性能: 经过针对 Android 平台优化。
  • 内存高效: 优化内存使用。
  • 跨平台: 可以在 Android、Java 等平台使用。
// 使用 Cursor 访问 SQLite 数据库结果集
Cursor cursor = db.query("table", null, null, null, null, null, null);
while (cursor.moveToNext()) {
    String name = cursor.getString(0);
    int age = cursor.getInt(1);
}

常见问题解答

1. HashMap 和 TreeMap 的区别是什么?

HashMap 基于哈希表,允许 null 键,插入顺序无序。TreeMap 基于红黑树,键按顺序排序,不允许 null 键。

2. 为什么使用 ArrayList 而不是 LinkedList?

ArrayList 对于随机访问更快,而 LinkedList 对于插入和删除操作更快。

3. PriorityQueue 如何确定优先级?

PriorityQueue 根据元素的自然顺序或指定的比较器确定优先级。

4. Android 集合框架和 Java 集合框架有什么区别?

Android 集合框架是 Java 集合框架的一个优化子集,针对 Android 平台进行了调整。

5. 如何在 Java 中创建线程安全的集合?

可以使用 Collections.synchronizedList()、Collections.synchronizedSet()、Collections.synchronizedMap() 方法创建线程安全的集合。

结论

Java 和 Android 集合框架为开发人员提供了强大的工具,可以高效地存储、组织和管理数据。通过熟练掌握这些框架,开发者可以显著提升应用程序的性能和效率。