Java 集合

集合框架的设计要满足以下几个目标:

  1. 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
  2. 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
  3. 对一个集合的扩展和适应必须是简单的。

img

从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

集合框架包含

LinkedList

  • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

  • Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。

  • 与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。

什么情况下使用ArrayList

  1. 频繁访问列表中的某一个元素
  2. 只需要在列表末尾进行添加和删除元素操作

什么情况下使用LinkedList

  1. 需要通过循环迭代来访问列表中的某些元素
  2. 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

语法格式:

1
2
LinkedList<E> list = new LinkedList<E>();
LinkedList<E> list = new LinkedList(Collection<? extends E> c);

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
LinkedList<String> sites = new LinkedList<String>();
//列表添加元素
sites.add("Google");
//在头部添加元素
sites.addFirst("Wiki");
//在尾部添加元素
sites.addLast("Haha");
//移除头部元素 返回第一个元素
sites.removeFirst();
//移除尾部元素 返回最后一个元素
sites.removeLast();
//获取开头元素
sites.getFirst();
//获取结尾元素
sites.getLast();
//获取链表大小
sites.size();
//获取指定下标的元素,注意和数组一样,下标从0️⃣开始
sites.get(i);
//也可以用for-each
for(String i:sites) System.out.println(i);
//将一个集合的所有元素添加到链表后面 成功返回true
sites.addAll(Collection c);
//清空链表
sites.clear();
//判断是否含有某个元素 返回true或false
sites.contains(Object o);
//链表转换成数组
Object str = sites.toArray();

ArrayList

  • ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

  • ArrayList 继承了 AbstractList ,并实现了 List 接口。

语法格式:

1
ArrayList<E> objectName = new ArrayList<>();//初始化

实例:

1
2
3
4
5
6
7
8
9
10
11
12
ArrayList<String> sites = new ArrayList<String>();
// 添加元素
sites.add("google");
//访问元素
sites.get(0);//索引从0️⃣开始
//修改元素
sites.set(2,"要修改的值");
// 求元素数量
sites.size();
//排序 字符串的话逐个按字母排序
Collections.sort(sites);
/*大部分方法和LinkedList一样*/

HashSet

  • HashSet基于HashMap来实现的,是一个不允许有重复元素的集合
  • HashSet允许有null
  • HashSet 是无序的,即不会记录插入的顺序。
  • HashSet 不是线程安全的, 如果多个线程尝试同时修改HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet的并发访问。
  • HashSet 实现了Set接口。

img

语法格式:

1
HashSet<String> sites = new HashSet<String>();

实例:

1
2
3
4
5
6
7
8
9
10
11
12
HashSet<String> sites = new HashSet<String>();
//元素添加
sites.add("Google");
sites.add("Google");//重复元素不会添加
//判断是否含有指定元素 返回true
sites.contains("Google")

//删除指定元素
sites.remove("Google");
//删除所有元素
sites.clear();

HashMap

  • HashMap是一个散列表,它存储的内容是键值对(key-value)映射
  • HashMap是无序的,即不会记录插入的顺序。
  • HashMapkeyvalue 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key和字符串(String)类型的 value。

img

语法格式:

1
HashMap<Integer,String> Sites = new HashMap<Integer,String>();

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HashMap<Integer,String> Sites = new HashMap<Integer,String>();
//添加元素
Sites.put(1,"Google");
//访问元素 获取key对应的value
Sites.get(key);
//移除元素 输入key值就可以移除
Sites.remove(key);
//同样的也可以用clear清理所有
Sites.clear();
// 返回所有 value 值
for (Integer i : Sites.keySet()) System.out.println("key: " + i + " value: " + Sites.get(i));

//输出每一个value
for(String value: Sites.values()) System.out.print(value + ", ");