目录
什么是集合框架
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。
其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD 。
简单来说,集合框架就是由接口,抽象类,实现类组成的,这些类和接口里面实现了数据结构。
集合框架图大致如下:
我们知道接口其实就是对一个行为的抽象,也相当于一个标准,因为大多数类都有这种特性于是将其抽象成了一个接口。
我们从上往下看,Iterable是一个增强for-each循环的接口,实现这个接口的类都能使用for-each循环进行遍历。而我们看到Map并没有实现Iterable接口,因此Map下的类都不能使用for-each循环。
至于Collection
接口,其实就是用来管理元素的,而这些元素就是实现它的类。
List是一个线性表,包括数组和链表,Queue是一个队列,set是一个集合,里面的元素不能重复。
其中ArrayList底层是一个顺序表,LinkList底层是一个双向链表,能表示一个双向链表、普通队列和双端队列(队头队尾都能进出元素)。stack是一个栈,priorityQueue是一个优先队列,底层是一个二叉树。Treeset底层是一个红黑树,hashset底层是一个哈希表。hashmap底层也是一个哈希表,treeMap底层也是一个红黑树。(现在只是大致了解,后续博文会详细介绍)。
Map是一个键值对,也就数所谓的<Key,Value>结构,能够存储k值和v值,而左半部分collection下的只能存储k值。
集合框架中不止这些数据结构,还提供了一些工具,例如迭代器、比较器等;
collection接口
前面介绍了collection下面的一些类,那现在来使用一下collection熟练熟练。
因为大多数类都实现了collection接口,因此我们可以实现向下转型,就用ArrayList吧。对此不理解的可以戳这:多态中的向下转型。
Collection<Integer>coll = new ArrayList<>();
coll.add(1);
coll.add(2);
coll.add(3);
coll.add(4);
System.out.println(coll);
boolean ret1 = coll.contains(2);
System.out.println(ret1);
boolean flg1 = coll.isEmpty();
System.out.println(flg1);
boolean flg2 = coll.remove(2);
System.out.println(flg2);
System.out.println(coll.remove(2));
boolean ret2 = coll.contains(2);
System.out.println(ret2);
int size = coll.size();
System.out.println(size);
coll.clear();
System.out.println(coll.isEmpty());
关于尖括号中的Integer类型是属于泛型,不了解的也可以戳这:泛型。
运行结果如下:
Map接口
关于Map,其实相当于一个字典,首先是创建一个字典把一个key值和一个value值存进去。
然后就可以按照key值从字典中寻找对应的value值。
示例代码:
Map<String,String>map = new Hashtable<>();
map.put("三国演义","罗贯中");
map.put("红楼梦","曹雪芹");
map.put("西游记","吴承恩");
map.put("水浒传","施耐庵");
System.out.println(map);
map.put("Java","bit");
//如果字典中已经存在了key值,则返回对应的value值,如若没有,返回设置的默认值
String str1 = map.getOrDefault("Java","Bit");
System.out.println(str1);
System.out.println(map.remove("Java"));
String str2 = map.getOrDefault("Java","Bit");
System.out.println(str2);
System.out.println(map.containsKey("三国演义"));
System.out.println(map.containsValue("罗贯中"));
System.out.println(map.isEmpty());
System.out.println(map.size());
结果如下:
我们注意到插入的顺序与输出的顺序并不是相同的,这就得从哈希表的函数说起,因为一个k-v键值对值 存入map中会经过哈希函数的加工最后才存进哈希表中,因此顺序并不会相同。
示例:
entryset方法:
我们观察entrySet方法的返回值是一个Set<Map.Entry<K, V>> ,这个我们先不管,之后在将哈希表时再详细介绍,现在先学会使用:
Set<Map.Entry<String, String>>entry = map.entrySet();
//entry接收了map里的k-v键值对并存储在一个set集合里
//因此我们可以使用for-each循环
// 使用一个Map.Entry<String, String>类型的entry1
// 接收set集合里的所有Map.Entry<String, String>类型元素
for (Map.Entry<String, String> entry1: entry) {
System.out.println(entry1);
}
结果:
本文收录专栏《数据结构》。