JAVA学习日记(10)——集合框架及背后的数据结构

1.介绍

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

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

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

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

  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
悟能=猪八戒
玄奘=唐三藏

对于最后一个方法,这里给大家看一张图来帮助大家理解
在这里插入图片描述
我们可以看到:

  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 集合框架中接口和其各自对应的常见实现类之间的关系
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值