Java 集合框架:从数据结构到性能优化,全面分析集合类 ...

打印 上一主题 下一主题

主题 997|帖子 997|积分 2991

Java 集合框架(Java Collections Framework,JCF)是 Java 语言中用于存储、操纵和管理数据的尺度库。它提供了一组通用的接口、类和方法,使开辟者能够高效地操纵不同范例的数据集合。
本文将联合 Java 集合框架类图,介绍集合框架的整体架构,并对各个集合类的特性、适用场景及优缺点举行具体分析。
1. Java 集合框架概览

Java 集合框架紧张分为 CollectionMap 两大类。


  • Collection(集合):用于存储一组对象,继续自 Iterable,包括 List、Set 等子接口。

  • Map(映射):用于存储键值对(key-value),不属于 Collection 接口,但同样是集合框架的一部分,如 HashMap、TreeMap 等。

2. Collection 体系

Collection 是 Java 集合框架的核心接口,它继续了 Iterable,允许集合中的元素举行迭代(如 for-each 循环)。
Collection 紧张分为 List 和 Set 两大类:
Collection 是 Java 集合框架的核心接口,它继续了 Iterable,允许集合中的元素举行迭代(如 for-each 循环)。
Collection 紧张分为 List 和 Set 两大类:
2.1 List(列表)

List 接口表示有序集合,允许元素重复,支持索引访问。

List 实现类特点


  • ArrayList:基于动态数组,查找快(O(1)),插入删除慢(O(n))。
  • LinkedList:基于双向链表,插入删除快(O(1)),查找慢(O(n))。
  • Vector:雷同 ArrayList,但线程安全(所有方法都使用 synchronized 举行同步)。
 实例:
ArrayList


  1. package List_;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. /**
  6. * @author lay
  7. * @version 1.0
  8. **/
  9. public class List_exercise_ {
  10.     @SuppressWarnings("all")
  11.     public static void main(String[] args) {
  12.         List arrayList = new ArrayList();
  13.         for (int i = 0; i < 12; i++) {
  14.             arrayList.add("小黄" + i);
  15.         }
  16.         //第二个位置插入元素"行书评教育",通过相应的方法,add()
  17.         arrayList.add(2,"行书评教育");
  18.         System.out.println("插入后数= "+arrayList);
  19.         Object o = arrayList.get(5);
  20.         System.out.println("获得的元素 = " +o +o.getClass());
  21.         arrayList.remove(6);
  22.         System.out.println("删除后的list:= "+ arrayList);
  23.         arrayList.set(7,"小米");
  24.         System.out.println("修改后的元素为:=" +arrayList);
  25.         Iterator iterator = arrayList.iterator();
  26. //        while (iterator.hasNext()) {
  27. //            Object next =  iterator.next();
  28. //            System.out.print(next);
  29. //        }
  30. //        for (int i = 0; i < arrayList.size(); i++) {
  31. //            Object o1 = arrayList.get(i);
  32. //            System.out.print(o1);
  33. //        }
  34.         //
  35.         for (Object object :arrayList) {
  36.                     System.out.println(object);
  37.         }
  38.     }
  39. }
复制代码
 LinkedList:

  1. package Collection_;
  2. import java.util.Iterator;
  3. import java.util.LinkedList;
  4. /**
  5. * @author lay
  6. * @version 1.0
  7. **/
  8. public class LinkedList_CRUD {
  9.     public static void main(String[] args) {
  10.         LinkedList linkedList = new LinkedList();
  11.         linkedList.add(1);
  12.         linkedList.add(2);
  13.         System.out.println(linkedList);
  14.         linkedList.remove();
  15.         System.out.println(linkedList);
  16.         Iterator iterator = linkedList.iterator();
  17.         while (iterator.hasNext()) {
  18.             Object o =  iterator.next();
  19.             System.out.println(o);
  20.         }
  21.     }
  22. }
复制代码
 Vector:

  1. package Collection_;
  2. import java.util.List;
  3. import java.util.Vector;
  4. /**
  5. * @author lay
  6. * @version 1.0
  7. **/
  8. public class Vector_Detail {
  9.     public static void main(String[] args) {
  10.         Vector vector = new Vector();
  11. //        Vector vector = new Vector(8);
  12.         for (int i = 0; i < 10; i++) {
  13.             vector.add(i);
  14.         }
  15.         vector.add(100);
  16.         System.out.println("vector=" + vector);
  17.     }
  18. }
复制代码
2.2 Set(集合)

Set 接口表示无序集合,不允许重复元素。

Set 实现类特点


  • HashSet:基于 HashMap 实现,元素无序,插入、删除、查找时间复杂度均为 O(1)。
  • TreeSet:基于红黑树(TreeMap)实现,元素有序(默认升序,可自定义 Comparator 规则),插入、删除、查找复杂度 O(log n)。
实例:
HashSet


  1. package Set_;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. /**
  6. * @author lay
  7. * @version 1.0
  8. **/
  9. public class Set_Methods_ {
  10.     @SuppressWarnings("all")
  11.     public static void main(String[] args) {
  12.         Set set = new HashSet();//以Set接口的实现类hashset
  13.         set.add("sdfa");
  14.         set.add("john");
  15.         set.add("lucy");
  16.         set.add("john");//重复
  17.         set.add("jack");
  18.         set.add("hsp");
  19.         set.add("mary");
  20.         set.add(null);//
  21. //        System.out.println(set);
  22. //        for (int i = 0; i < 10; i++) {
  23. //            System.out.println(set);
  24. //        }
  25.         //遍历
  26.         Iterator iterator = set.iterator();
  27.         while (iterator.hasNext()) {
  28.             Object o =  iterator.next();
  29.             System.out.println(o);
  30.         }
  31.         set.remove(null);
  32.         for (Object o :set) {
  33.             System.out.println(o);
  34.         }
  35.     }
  36. }
复制代码
 TreeSet

  1. package Collection_;
  2. import java.util.Comparator;
  3. import java.util.TreeSet;
  4. /**
  5. * @author lay
  6. * @version 1.0
  7. **/
  8. @SuppressWarnings("all")
  9. public class TreeSet_ {
  10.     public static void main(String[] args) {
  11.         TreeSet treeSet = new TreeSet();
  12.         treeSet.add(145);
  13.         treeSet.add(45);
  14.         treeSet.add(5);
  15.         treeSet.add(741);
  16.         System.out.println(treeSet);//无参构造器无序
  17.         //使用匿名内部类,
  18.         TreeSet treeSet1 = new TreeSet(new Comparator() {
  19.             @Override
  20.             public int compare(Object o1, Object o2) {
  21.                 //向下转型
  22. //                return ((String) o1).compareTo((String) o2);
  23.                 return ((String) o1).length()-((String) o2).length();
  24.             }
  25.         });
  26.         treeSet1.add("Z");
  27.         treeSet1.add("Dse");
  28.         treeSet1.add("Sse");
  29.         treeSet1.add("Wwefwa");
  30.         treeSet1.add("Wasefefe");
  31.         System.out.println(treeSet1);
  32.     }
  33. }
复制代码
3. Map 体系

Map 接口用于存储键值对(key-value),key 不能重复,但 value 可以重复。

Map 实现类特点


  • HashMap:基于哈希表,默认 key 无序,插入、删除、查找 O(1)。
  • LinkedHashMap:继续 HashMap,但维护 key 的插入顺序,遍历时按插入顺序输出。
  • TreeMap:基于红黑树,key 有序,查找 O(log n)。
  • Hashtable:HashMap 的线程安全版本,但服从较低(同步方法降低并发性能)。
  • Properties:继续自 Hashtable,专门用于配置文件(key-value 均为字符串)。
实例用法:
 
TreeMap

  1. package Map_;
  2. import java.util.Comparator;
  3. import java.util.TreeMap;
  4. /**
  5. * @author lay
  6. * @version 1.0
  7. **/
  8. public class Tree_Map {
  9.     public static void main(String[] args) {
  10. //        TreeMap treeMap = new TreeMap();//默认构造器无序
  11.         TreeMap treeMap = new TreeMap(new Comparator() {
  12.             @Override
  13.             public int compare(Object o1, Object o2) {
  14. //                return ((String) o1).compareTo((String) o2);//按字符顺序排序
  15.                 return ((String) o1).length() -((String) o2).length();//按字符顺序排序
  16.             }
  17.         });
  18.         treeMap.put("ada","123");
  19.         treeMap.put("eqr","3");
  20.         treeMap.put("zrr","13");
  21.         treeMap.put("rhth","1");
  22.         System.out.println(treeMap);
  23.     }
  24. }
复制代码
Hashtable

  1. package Map_;
  2. import java.util.Hashtable;
  3. /**
  4. * @author lay
  5. * @version 1.0
  6. **/
  7. @SuppressWarnings("all")
  8. public class Hashtable_ {
  9.     public static void main(String[] args) {
  10.         //1. Properties 继承 Hashtable
  11. //2. 可以通过 k-v 存放数据,当然 key 和 value 不能为 null
  12. //增加
  13.         Hashtable properties = new Hashtable();
  14. //properties.put(null, "abc");//抛出 空指针异常
  15. //properties.put("abc", null); //抛出 空指针异常
  16.         properties.put("john", 100);//k-v
  17.         properties.put("lucy", 100);
  18.         properties.put("lucsdfy", 100);
  19.         properties.put("ludsfwerwcy", 100);
  20.         properties.put("lerucy", 100);
  21.         properties.put("luercy", 100);
  22.         properties.put("lucwery", 100);
  23.         properties.put("wr", 100);
  24.         properties.put("lweic", 100);
  25.         properties.put("lic", 88);//如果有相同的 key , value 被替换
  26.         System.out.println("properties=" + properties);
  27.     }
  28. }
复制代码

Properties

  1. package Map_;
  2. import java.util.Properties;
  3. /**
  4. * @author lay
  5. * @version 1.0
  6. **/
  7. public class Properties_ {
  8.     public static void main(String[] args) {
  9.         Properties properties = new Properties();
  10. //properties.put(null, "abc");//抛出 空指针异常
  11. //properties.put("abc", null); //抛出 空指针异常
  12.         properties.put("john", 100);//k-v
  13.         properties.put("lucy", 100);
  14.         properties.put("lic", 100);
  15.         properties.put("lic", 88);//如果有相同的 key , value 被替换,也是修改
  16.         System.out.println("properties=" + properties);
  17.         System.out.println(properties.get("lic"));
  18.         properties.remove("lic");
  19.         System.out.println(properties);
  20.     }
  21. }
复制代码
 4. List、Set、Map 的对比总结


5. 线程安全性



  • 非线程安全:ArrayList、LinkedList、HashMap、HashSet
  • 线程安全:Vector、Hashtable、Properties
  • 加锁实现线程安全:Collections.synchronizedList(new ArrayList<>())
6. 选择合适的数据结构


7. 结论

Java 集合框架提供了丰富的数据结构,以满足不同的开辟需求。


  • List 适用于有序、允许重复的场景,如 ArrayList 得当快速查找,LinkedList 得当频仍插入删除
  • Set 适用于去重的场景,如 HashSet 去重但无序,TreeSet 去重且有序
  • Map 适用于键值对存储,HashMap 查询快但无序,TreeMap 查询稍慢但有序,LinkedHashMap 维护插入顺序
  • 线程安全的集合类(如 Vector、Hashtable)在现代并发编程中较少使用,建议使用 ConcurrentHashMap 等更优方案。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表