Java中的数据结构类别包括数组、链表、队列、栈、树等等,但是在使用这些数据结构时,需要我们自己实现一些操作,例如查找、插入、删除等等。为了方便使用,Java中提供了许多内置的集合类,可以帮助我们轻松地使用这些数据结构。
一、列表(List)
List是Java中最基本常用的集合类之一,它用于存储一组有序的元素。它有序、可以放重复元素,提供了一系列按索引位置访问元素、查找元素等方法,常见的实现类有ArrayList和LinkedList。
1. ArrayList
ArrayList是一个动态数组,当数组满了时,会自动扩充容量,所以它适用于那些需要插入和删除元素较少但需要随机访问元素的场合::
//创建ArrayList ArrayList<String> list = new ArrayList<>(); //添加元素 list.add("a"); list.add("b"); list.add("c"); //查找元素 String s1 = list.get(1); //b //删除元素 list.remove(0);
2. LinkedList
LinkedList是一个双向链表,它适用于那些需要频繁插入和删除元素但不需要随机访问元素的场合:
//创建LinkedList LinkedList<String> list = new LinkedList<>(); //添加元素 list.add("a"); list.add("b"); list.add("c"); //查找元素 String s1 = list.get(1); //b //删除元素 list.remove(0);
二、集合(Set)
Set集合是一种不允许重复元素的(Collections和Arrays集合都可以有重复元素),适合于不需要元素按任何顺序排列的使用场合。
1. HashSet
HashSet是最常用的一个Set实现类,基于HashMap实现,底层使用HashMap存储数据。它不保证元素的顺序,也不允许包含重复元素。
//创建HashSet HashSet<String> set = new HashSet<>(); //添加元素 set.add("a"); set.add("b"); set.add("c"); set.add("a"); //重复元素 //查找元素 boolean b1 = set.contains("a"); //删除元素 set.remove("b");
2. TreeSet
TreeSet是基于TreeMap实现的,它提供有序的集合和排序功能,默认是自然排序。它不允许重复元素。
//创建TreeSet TreeSet<String> set = new TreeSet<>(); //添加元素 set.add("c"); set.add("b"); set.add("a"); //查找元素 String s1 = set.first(); //a String s2 = set.last(); //c //删除元素 set.remove("b");
三、映射(Map)
Map用于存储键值对,可以根据键快速访问相应的值。Java中的Map有多种实现方式,如HashMap、TreeMap等等。
1. HashMap
HashMap是使用哈希表实现,可以以O(1)时间复杂度访问元素,而键值对的存储顺序是无序的。它不允许重复的键,但是允许多个键对应的值相同。
//创建HashMap HashMap<String, Integer> map = new HashMap<>(); //添加键值对 map.put("Tom", 20); map.put("Mike", 19); map.put("Lucy", 18); //查找值 Integer age = map.get("Tom"); //20 //删除键值对 map.remove("Mike");
2. TreeMap
TreeMap是使用红黑树实现的,按照键排列,默认是按照自然序排列,键必须实现Comparable接口或在创建时提供一个Comparator实例。
//创建TreeMap TreeMap<String, Integer> map = new TreeMap<>(); //添加键值对 map.put("Tom", 20); map.put("Mike", 19); map.put("Lucy", 18); //查找值 Integer age = map.get("Tom"); //20 //删除键值对 map.remove("Mike");
四、队列(Queue)
队列是一种先进先出(FIFO)的数据结构,尾部插入元素,头部弹出元素。
1. LinkedList
LinkedList不仅是List,同时也是Queue,其实它是一种双向队列 Double Ended Queue。
//创建队列 Queue<Integer> queue = new LinkedList<>(); //入队 queue.offer(1); queue.offer(2); queue.offer(3); //出队 int i = queue.poll(); //1
2. PriorityQueue
优先队列是使用堆(heap)实现,每次操作的时间复杂度为O(logn),队头元素是当前堆中权值最小的元素(默认是自然序)。
//创建优先队列 PriorityQueue<Integer> queue = new PriorityQueue<>(); //入队 queue.offer(2); queue.offer(1); queue.offer(3); //出队 int i = queue.poll(); //1
五、总结
本文主要介绍了Java中常用的集合类,包括List、Set、Map、Queue等。每种集合类都有其适用场景和特点,使用不同的集合类可以使我们的程序更加高效、简洁和易于维护。