前言:本篇开始对数据结构知识的介绍与学习,对于数据结构,我们这里以Java集合来进行探讨,学习Java集合与数据结构。本篇主要是先介绍一下,集合中的一些东西。
话不多说,直接进入主题。
本篇介绍内容:
- 什么是集合框架
- 集合框架的意义
- 握集合框架相关接口和常见的实现类
Java集合与数据结构:
- 一、Java集合框架的介绍
- 二、学习集合框架的意义
- 三、接口 interfaces
- 1.基本关系说明
- 2. Collection 接口说明
- 3.Collection 常用方法说明
- 四、Map 接口
- 1.Map 接口说明
- 2.Map 接口常用方法说明
- 五、实现 classes
一、Java集合框架的介绍
Java 集合框架 Java Collection Framework
,又被称为容器 container
,是定义在 java.util 包下的一组接口 interfaces
和其实现类 classes
。
其主要表现为将多个元素 element
置于一个单元中,用于对这些元素进行快速、便捷的存储 store
、检索retrieve
、管理 manipulate
,即平时我们俗称的增删查改 CRUD
。
总的来说,集合框架其实就是Java写好的数据结构。
而对于类和接口总览,我们有这么一个大致的图:
其中,Interface是接口,abstact class是抽象类,class是具体实现类。List是线性结构,Queue是队列,Set是不能重复的集合,Deque是双端队列等等。
接口:其实是对一个行为的"抽象"标准。
比如这里的队列,其实就是相当于大家在学校打饭,你必须从队尾开始排队,然后打完从队头出来,不能直接上去队头吧。然后如果是双端队列,那就可以从队尾进,也可以从队头进,同时两边也都可以出。
二、学习集合框架的意义
- 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码。
- 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景。
- 对于很多公司的笔试及面试题,集合框架都算是占据重要部分。
三、接口 interfaces
1.基本关系说明
① Collection
:用来存储管理一组对象 objects ,这些对象一般被成为元素 elements
- Set : 元素不能重复,背后隐含着查找/搜索的语义
- SortedSet : 一组有序的不能重复的元素
- List : 线性结构
- Queue : 队列
- Deque : 双端队列
② Map
: 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
- SortedMap : 一组有序的键值对
2. Collection 接口说明
3.Collection 常用方法说明
然后这里我们来了解一下Collection 常用的方法。
方法签名 | 说明 |
boolean add(E e) | 将元素 e 放入集合中 |
void clear() | 删除集合中的所有元素 |
boolean isEmpty() | 判断集合是否没有任何元素,俗称空集合 |
boolean remove(Object e) | 如果元素 e 出现在集合中,删除其中一个 |
int size() | 返回集合中的元素个数 |
Object[] toArray() | 返回一个装有所有集合中元素的数组 |
首先我们来了解一下Collection的这几行代码:
public static void main(String[] args) {
Collection collation = new ArrayList();
collation.add("abcd");
collation.add(12345);
//add就是添加元素放入集合中
}
这里的话都还好,但是add添加的时候,什么类型都可以添加,就比较随便了,怎么能随便什么类型都放一起呢,取的时候就麻烦了,所以这里Collection可以多一个尖括号<>
,而尖括号里面,是我们要add的类型,比如:
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("hello world!");
collection.add("hhahah");
//同时要注意 尖括号里面 放的类型 一定要是 类类型 不能是简单的基本类型
//Collection<int> collection = new ArrayList<>(); 错误的
Collection<Integer> collection1 = new ArrayList<>();
collection1.add(1);
collection1.add(23456);
}
而这种多了一个尖括号的语法,叫做泛型,是一种晦涩难懂的语法,我们后面再有一篇博客介绍它。
而上面的东西存进去之后,也是可以看见的,直接打印就行了:
然后我们挑两个演示一下这些方法:
1.clear
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("hello world!");
collection.add("hhahah");
Collection<Integer> collection1 = new ArrayList<>();
collection1.add(1);
collection1.add(23456);
System.out.println(collection);
System.out.println(collection1);
collection.clear();
System.out.println(collection);
System.out.println(collection1);
}
clear也就是清空里面的内容,最后打印的时候就只是一个空的了,其实clear就是把里面每一个元素置为空了:
2.isEmpty
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("hello world!");
collection.add("hhahah");
Collection<Integer> collection1 = new ArrayList<>();
collection1.add(1);
collection1.add(23456);
System.out.println(collection);
System.out.println(collection1);
System.out.println(collection.isEmpty());
}
就像前面说的,isEmpty就是看集合里面是否是空集合,不是就打印false,是就打印true,就是这样:
3.Object[] toArray()
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("hello world!");
collection.add("hhahah");
Collection<Integer> collection1 = new ArrayList<>();
collection1.add(1);
collection1.add(23456);
System.out.println(collection);
System.out.println(collection1);
Object[] objects = collection.toArray();//因为是Object[]类型所以要有其接收
System.out.println(Arrays.toString(objects));
//以数组的形式打印
/* String[] objects = (String[])collection.toArray();
System.out.println(Arrays.toString(objects)); 不行! */
}
这里就是换一个方式,返回一个装有所有集合中元素的数组,但是值得注意的是,我们上面的代码尝试强转为String类型,但是是不可以的!这其中的原因就比较复杂,整体可以理解为JVM对数组的处理 不建议进行强制类型转换,也就是编译通过了,但是到里面检查每一个元素的时候,就检查到不是一样的类型了。
四、Map 接口
1.Map 接口说明
2.Map 接口常用方法说明
对于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 containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
Set<Map.Entry<K, V>> entrySet() | 将所有键值对返回 |
boolean isEmpty() | 判断是否为空 |
int size() | 返回键值对的数量 |
那么同样的我们也在下面举一些例子:
- 首先是写入的,也就是put的(将指定的 k-v 放入 Map)和取出的get以及getOrDefault:
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("千金","安娜-谢尔巴科娃");
map.put("莎莎","特鲁索娃");
map.put("K宝","瓦利耶娃");
//写入就是put,前面的和后面的也就是K和V一一对应,比如千金就是安娜-谢尔巴科娃
String ret = map.get("千金");
System.out.println(ret);
//这里是取出来,输入对应的K得到对应的V
System.out.println(map.get("天天"));//如果没有就会返回null
System.out.println(map.getOrDefault("天天","金博洋"));
//然后getOrDefault就是当没有的时候,就输出后面的默认值
}
输出结果:
- 然后就是对于Map 接口中是否包含某一K值或某一V值:
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("千金","安娜-谢尔巴科娃");
map.put("莎莎","特鲁索娃");
map.put("K宝","瓦利耶娃");
boolean flg = map.containsKey("千金");
System.out.println(flg);//输出true
//查找是否存在此K值 存在输出true 反之false
boolean flg2 = map.containsValue("莎莎");
System.out.println(flg2);//输出false
//查找是否存在此V值 存在输出true 反之false
}
- 然后这个Set<Map.Entry<K, V>> entrySet()就比较有意思了,我们来慢慢了解它,先看这样一个代码打印出来的东西:
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("千金","安娜-谢尔巴科娃");
map.put("莎莎","特鲁索娃");
map.put("K宝","瓦利耶娃");
System.out.println(map);
//打印map里面的东西
}
你以为是按住顺序打印吗,我们来看一下结果:
其实不是这样的,对于哈希表,并不是简简单单的一个顺序存放,下面我们画一个图让大家了解一下哈希表,但并不是真正的哈希表,只是为了让大家了解:
对于上面的图,其实意思就是,当我们的K值进入哈希表的时候,是需要通过相当于是一个厂子也就是函数加工之后进去的,是随机放置在了某一k值位置,然后对于v值再放于其位置,然后当我们用这个方法。 Set<Map.Entry<String,String>> entrySet = map.entrySet();
的时候,就会讲这些V值和K值组合到一起放进一个地方,就是我们的entrySet:
所以这个合起来的数据类型,就是<Map.Entry<String,String>>
了。
而对于这个数据类型我们也可以打印看一下:
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("千金","安娜-谢尔巴科娃");
map.put("莎莎","特鲁索娃");
map.put("K宝","瓦利耶娃");
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for (Map.Entry<String,String> entry:
entrySet) {
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
}
得到的就是:
当然这里我们用的是
HashMap
,如果是用TreeMap
也是一样的,不同的地方就是TreeMap
中是有序的,而两者得到的结果也会有可能相同。
五、实现 classes
这里展示的是具体的某一个接口分别有哪些实现类:
interface | 顺序表 | 链表 | 堆 | 红黑树 | 哈希表 |
Set | TreeSet | HashSet | |||
List | ArrayList | LinkedList | |||
Queue | LinkedList | PriorityQueue | |||
Deque | LinkedList | ||||
Map | TreeMap | HashMap |
这就是本篇Java集合与数据结构篇1的全部内容啦。欢迎关注。一起学习,共同努力!也可以期待下个系列接下来的博客噢。
还有一件事: