1.介绍

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。

其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理manipulate ,即平时我们俗称的增删查改 CRUD 。

例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等。

类和接口总览

Java 构建数据计算模型 java数据计算框架_键值对


这里简单介绍一下上图中的一些部分:(从左往右)(不需要着重记忆,了解单词的意思就行,只做初步了解),这篇后面博客开始会逐一介绍上图的每个部分

  1. stack:栈
  2. list:一般指代线性表
  3. ArrayList:就是我们常说的顺序表
  4. Queue:队列
  5. Deque:双端队列(可以从任意一端进出)
  6. LinkedList:可以当作链表来使用,底层是一个双向链表,由于它实现了Queue接口,也可以当作队列来使用(普通的队列:队尾进,队头出),因此就算是队列,也是通过链表来实现
  7. PriorityQueue:优先级队列,底层是一个堆
  8. Set:集合(数学意义上的那种集合),数据不可以重复
  9. TreeSet:二叉树,严格意义上来说是一个二叉搜索树
  10. HashSet:底层是一个哈希表
  11. Map:底层是一对键值对
  12. SortedMap:有序的键值对
  13. HashMap:底层也是一个哈希表
  14. TreeMap:底层也是一颗树
  15. lterator:迭代器,用来遍历集合
  16. Comparator:比较器
  17. Collections:操作集合的工具类

2.学习的意义

2.1 Java集合框架的优点及作用

  1. 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
  2. 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景

2.2 笔试及面试题

腾讯-Java后台开发面经

  1. HashMap 了解不,介绍一下,如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
  2. HashSet 和 HashMap 的区别是什么?
  3. HashMap 是线程安全的么?那需要线程安全需要用到什么?

阿里巴巴-Java后台开发面经

  1. ArrayList 和 LinkedList 的区别是什么?
  2. 有了解过 HashMap 的具体实现么?
  3. HashMap 和 ConcurrentHashMap 哪个效率更高?

今日头条-Java后台开发面经

  1. 编程题:判断一个链表是否是一个回文链表。
  2. Redis 的 zset 类型对应到 java 语言中大致是什么类型?
  3. hashCode 主要是用来做什么用的?

3.接口 interfaces

3.1 基本关系说明

如第一张图下面的讲解

3.2 Collection 接口常用方法说明

方法名

说明

boolean add(E e)

将元素e放入集合中

void clear()

删除集合中所有元素

boolean isEmpty()

判断集合中是否有元素,俗称空集合

boolean remove (object e)

如果e在集合中出现,就删掉其中一个

int size()

返回集合中的元素个数

object[] toArray()

返回一个装有所有集合元素的数组

3.3 Collection 示例

import java.util.Collection; 
import java.util.ArrayList; 
import java.util.Arrays; 
public class Demo { 
	public static void main(String[] args) { 
		Collection<String> list = new ArrayList<>(); 			
		System.out.println(list.size()); 
		System.out.println(list.isEmpty()); 
		list.add("我"); list.add("爱"); 
		list.add("Java"); 
		System.out.println(list.size()); 
		System.out.println(list.isEmpty()); 
		Object[] array = list.toArray(); 		
		System.out.println(Arrays.toString(array)); 
		for (String s : list) { 
			System.out.println(s); 
		}
		list.remove("爱"); 
		for (String s : list) { 
			System.out.println(s); 
		}
		list.clear(); 
		System.out.println(list.size()); 
		System.out.println(list.isEmpty()); 
	}
}

运行结果:

0
true 
3
false 
[我, 爱, Java] 
我
爱
Java 
我
Java 
0
true

3.4 Map 接口常用方法说明

方法名

说明

v get(object k)

根据指定的k查找对应的v

v getorDefault(object k,v defaultvalue)

根据指定的k查找对应的v,没有找到用默认值代替

v put(k key,v value)

将指定的 k-v 放入Map

boolean containsValue(object value)

判断是否包含value

boolean containsKey(object key)

判断是否包含k

Set<Map.Entry<K, V>> entrySet()

将所有键值对返回

boolean isEmpty()

判断是否为空

int size()

返回键值对数量

3.5 Map示例

public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("悟能","猪八戒");
        map.put("齐天大圣","孙悟空");
        System.out.println(map);
        map.put("齐天大圣","孙悟空2");
        System.out.println(map);
        System.out.println(map.get("悟能"));
        System.out.println(map.getOrDefault("玄奘","唐僧"));
        map.put("玄奘","唐三藏");
        System.out.println(map.getOrDefault("玄奘","唐僧"));

        Set<Map.Entry<String,String>> entrySet = map.entrySet();
        for (Map.Entry<String,String> entry:entrySet) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }

        /*map.put(null,null);
        System.out.println(map);*/
    }

运行结果

{齐天大圣=孙悟空, 悟能=猪八戒}
{齐天大圣=孙悟空2, 悟能=猪八戒}
猪八戒
唐僧
唐三藏
齐天大圣=孙悟空2
悟能=猪八戒
玄奘=唐三藏

对于最后一个方法,这里给大家看一张图来帮助大家理解

Java 构建数据计算模型 java数据计算框架_Java_02


我们可以看到:

  1. 首先我们通过map调用entrySet()方法的时候,就能把键值对提取出来(如图中键值对被红圈包裹起来)(蓝色的圈就相当于是Set集合)
  2. 其次我们将键值对返回给Map.Entry<String,String>,这个Set集合的类型就相当于是Map.Entry<String,String>类型
  3. 最后我们遍历Set的时候可以使用Map.Entry<String,String>类型来接受每个元素

注意:

  1. 往map当中存放元素的顺序,不一定是打印的顺序,原因是存放数据的方式不一样,根据某一个规则(后续会详细讲解)
  2. k值可以重复,但是重复之后他的v值是最后一次放进去的v值,语法允许这样写,但是我们一般不建议这样去做
  3. k和v都是可以为null的

4.重点总结

  1. Java 集合框架中接口、之间的关系及其含义
  2. Java 集合框架中接口和其各自对应的常见实现类之间的关系