本文参考了知乎作者“Hello浩辰”的Java容器详解Ⅰ——概述和菜鸟教程的相关文章。
一、常用容器
java容器分为两大部分:Collection和Map。Collection是单个元素的集合,又可以分为List、Queue和Set。Map用来存储一组键值对,又可以分为HashMap和TreeMap。
二、List列表
List的特点就是所有的元素是可以重复的。
1. ArrayList
ArrayList是一个可以动态增长的数组, ArrayList由于底层是使用数组实现的,所以随机访问速度快,插入删除较慢。
(1) 常用方法:
add()
:添加元素addAll()
:将集合中的所有元素添加到ArrayList中clear()
:清空元素contains()
:判断元素是否在ArrayList中get()
:根据索引获取元素remove()
:根据索引删除元素size()
:返回ArrayList大小set()
:根据索引修改元素
(2) 实例:
package ecnu.cn;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class MyTest {
public static void main(String[] args) {
ArrayList<String> sites = new ArrayList<String>();
// 增加元素
sites.add("Zhihu");
sites.add("Google");
sites.add("Taobao");
sites.add("Runoob");
sites.add("Temp");
// 修改元素
sites.set(2, "Tianmao");
// 删除元素
sites.remove(4);
// 获取元素
System.out.println("下标为1的元素:" + sites.get(1));
// 获取大小
System.out.println("size: " + sites.size());
// 判断元素是否存在
System.out.println("Taobao是否存在:"+sites.contains("Taobao"));
// 使用迭代器遍历
Iterator<String> it = sites.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println("\n");
// 普通遍历
for (int i = 0; i < sites.size(); i++) {
System.out.print(sites.get(i) + " ");
}
// 排序
Collections.sort(sites);
// 遍历
for (String site : sites) {
System.out.print(site + " ");
}
System.out.println("\n");
// 清空
sites.clear();
System.out.println("size: " + sites.size());
}
}
(3) 使用场景:
- 频繁访问列表中的某一个元素。
- 只需要在列表末尾进行添加和删除元素操作。
2. LinkedList
LinkedList是使用双向链表实现的,在列表中插入和删除速度快,但是查找需要遍历整个链表,速度较慢。使用LinkedList可以实现很多队列、栈的数据结构。
(1) 常用方法:
add()
:添加元素addFirst()
:在头部添加元素addLast
:在尾部添加元素addAll()
:将集合中的所有元素添加到LilnkedList中clear()
:清空元素contains()
:判断元素是否在LilnkedList中get()
:根据索引获取元素getFirst()
:获取头部元素getLast()
:获取尾部元素remove()
:根据索引删除元素removeFirst()
:删除头部元素removeLast()
:删除尾部元素size()
:返回LilnkedList大小set()
:根据索引修改元素
(2) 实例:
package ecnu.cn;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
public class MyTest {
public static void main(String[] args) {
LinkedList<String> sites = new LinkedList<>();
// 增加元素
sites.add("Zhihu");
sites.add("Google");
sites.add("Taobao");
// 在头部添加
sites.addFirst("Runoob");
// 在尾部添加
sites.addLast("Temp");
// 修改元素
sites.set(2, "Tianmao");
// 普通遍历
// size()获取大小
for (int i = 0; i < sites.size(); i++) {
// 获取元素
System.out.print(sites.get(i) + " ");
}
System.out.println("\n");
// 删除元素
sites.remove(4);
// 删除头部元素
sites.removeFirst();
// 删除尾部元素
sites.removeLast();
// 获取first元素
System.out.println("First:" + sites.getFirst());
// 获取last元素
System.out.println("Last: "+sites.getLast());
// 判断元素是否存在
System.out.println("Taobao是否存在:"+sites.contains("Taobao"));
// 使用迭代器遍历
Iterator<String> it = sites.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println("\n");
// 排序
Collections.sort(sites);
// 遍历
System.out.println("排序后:");
for (String site : sites) {
System.out.print(site + " ");
}
System.out.println("\n");
// 清空
sites.clear();
System.out.println("size: " + sites.size());
}
}
(3) 使用场景:
- 你需要通过循环迭代来访问列表中的某些元素。
- 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
3. Vector
Vector是一个已经被弃用的类,因为他是线程同步的,而我们平时使用的时候都是非同步的,使用同步的坏处就是会在一个记录上加锁,防止多个程序访问同一条数据导致数据不同步。这样会导致访问速度变慢。
三、Queue队列
队列是一个满足“先进先出”的数据结构。
1. LinkedList
LinkedList提供了方法支持队列操作,并且实现了Queue接口,所以LinkedList是队列的一种实现,可以通过LinkedList向上转型为Queue。
2. PriorityQueue
PriorityQueue是优先级队列。
四、Set集合
集合中的元素不可以重复。
1. HashSet
-
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
-
HashSet 允许有 null 值。
-
HashSet 是无序的,即不会记录插入的顺序。
-
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
-
HashSet 实现了 Set 接口。
(1) 常用方法
add()
:添加元素addAll()
:将集合中的所有元素添加到HashSet中clear()
:清空元素contains()
:判断元素是否在HashSet中remove()
:根据索引删除元素size()
:返回HashSet大小
(2) 实例
package ecnu.cn;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
public class MyTest {
public static void main(String[] args) {
HashSet<String> sites = new HashSet<>();
// 增加元素
sites.add("Zhihu");
sites.add("Google");
sites.add("Taobao");
sites.add("Runoob");
sites.add("Temp");
// 删除元素
sites.remove(4);
// 判断元素是否存在
System.out.println("Taobao是否存在:"+sites.contains("Taobao"));
// 使用迭代器遍历
Iterator<String> it = sites.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println("\n");
// 遍历
for (String site : sites) {
System.out.print(site + " ");
}
System.out.println("\n");
// 清空
sites.clear();
System.out.println("size: " + sites.size());
}
}
2. TreeSet
TreeSet底层使用的是红黑树。
五、Map映射
Map是使用键值对存储的一种结构,所以在处理列如单词统计等方面是杀手锏。
1. HashMap
HashMap更适合查找、删除、插入。
-
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
-
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
-
HashMap 是无序的,即不会记录插入的顺序。
-
HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
(1) 常用方法
clear()
:清空HashMapsize()
:获取大小put()
:添加键值对putAll()
:将所有键值对添加到HashMap中containKey()
:是否包含keycontainValue()
:是否包含valueget()
:根据key获取valuekeySet()
:获取key的集合values()
:获取所有value
(2) 实例
package ecnu.cn;
import java.util.HashMap;
import java.util.Iterator;
public class MyTest {
public static void main(String[] args) {
HashMap<Integer, String> sites = new HashMap();
// 增加元素
sites.put(1, "Zhihu");
sites.put(2, "Google");
sites.put(3, "Taobao");
sites.put(4, "Runoob");
sites.put(5, "Temp");
// 删除元素
sites.remove(4);
// 是否包含key
System.out.println("是否包含为5的key:"+sites.containsKey("5"));
// 是否包含value
System.out.println("是否包含为Taobao的value:"+sites.containsValue("Taobao"));
// 遍历
// 获取所有key的集合
for (Integer key : sites.keySet()) {
// 根据key获取value
System.out.println("key: " + key + " value: " + sites.get(key));
}
System.out.println();
// 遍历所有的值
for (String value : sites.values()) {
System.out.print(value + " ");
}
System.out.println("\n");
// 清空
sites.clear();
System.out.println("size: " + sites.size());
}
}
2. TreeMap
TreeMap更适合遍历。