目标:Map集合概述
Map集合是另一个集合体系。
Collection是单值集合体系。
Map集合是一种双列集合,每个元素包含两个值。
Map集合的每个元素的格式:key=value(键值对元素)。
Map集合也被称为“键值对集合”。
Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}
Map集合有啥用?
1.Map集合存储的信息更加的具体丰富。
Collection: ["苍老师","日本","女","动作演员",23,"广州"]
Map : {name="苍老师" , jiaxiang=小日本 , sex="女" , age = 23 , addr=广州}
2.Map集合很适合做购物车这样的系统。
Map: {娃娃=30 , huawei=1 , iphonex=1}
注意:集合和泛型都只能支持引用数据类型,集合完全可以称为是对象容器,存储都是对象。
Map集合的体系:
Map<K , V>(接口,Map集合的祖宗类)
/ \
TreeMap<K , V> HashMap<K , V>(实现类,经典的,用的最多)
\
LinkedHashMap<K, V>(实现类)
Map集合的特点:
1.Map集合的特点都是由键决定的。
2.Map集合的键是无序,不重复的,无索引的。
Map集合后面重复的键对应的元素会覆盖前面的整个元素!
3.Map集合的值无要求。
4.Map集合的键值对都可以为null。
HashMap:元素按照键是无序,不重复,无索引,值不做要求。
LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
Map集合的常用API(重点中的重点)
- public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
- public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
- public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
- public boolean containKey(Object key):判断该集合中是否有此键。
目标:Map集合的遍历方式。
Map集合的遍历方式有:3种。
(1)“键找值”的方式遍历:先获取Map集合全部的键,再根据遍历键找值。
(2)“键值对”的方式遍历:难度较大。
(3)JDK 1.8开始之后的新技术:Lambda表达式。(暂时了解)
a.“键找值”的方式遍历Map集合。
1.先获取Map集合的全部键的Set集合。
2.遍历键的Set集合,然后通过键找值。
b.“键值对”的方式遍历:
1.把Map集合转换成一个Set集合:Set<Map.Entry<K, V>> entrySet();
2.此时键值对元素的类型就确定了,类型是键值对实体类型:Map.Entry<K, V>
3.接下来就可以用foreach遍历这个Set集合,类型用Map.Entry<K, V>
目标:Map集合存储自定义类型;
Map集合的键和值都可以存储自定义类型。
小结:
Map集合的键和值都可以存储自定义类型。
如果希望Map集合认为自定义类型的键对象重复了,必须重写对象的hashCode()和equals()方法
目标:LinkedHashMap的特点介绍。
LinkedHashMap是HashMap的子类。
-- 添加的元素按照键有序,不重复的。
HashSet集合相当于是HashMap集合的键都不带值。
LinkedHashSet集合相当于是LinkedHashMap集合的键都不带值。
底层原理完全一样,都是基于哈希表按照键存储数据的,
只是HashMap或者LinkedHashMap的键都多一个附属值。
小结:
HashMap集合是无序不重复的键值对集合。
LinkedHashMap集合是有序不重复的键值对集合。
他们都是基于哈希表存储数据,增删改查都很好。
目标:冒泡排序的讲解。
我们之前排序都是调用sun公司写好的API,直接实现排序!
我们现在来自己通过一种比较算法实现排序。编程思想的技术,提高编程能力和理解能力的。
冒泡排序的作用:
可以用于对数组或者对集合的元素进行大小排序!!
冒泡排序的核心算法思想:
int[] arr = new int[] {55, 22, 99, 88};
思想:每次从数组的第一个位置开始两两比较。把较大的元素与较小的元素进行层层交换。
最终把当前最大的一个元素存入到数组当前的末尾。这就是冒泡思想。
冒泡排序的核心点:每次两两比较找出当前最大值冒出到当前最后面即可!!
冒泡排序的实现核心:
1.确定总共需要冒几轮: 数组的长度-1.
2.每轮两两比较几次。
i(轮数) 次数 每轮次数的规律:数组长度-i-1 次
0 3
1 2
2 1
小结:
冒泡排序的核心点:每次两两比较找出当前最大值冒出到当前最后面即可!!
确定总共需要冒几轮: 数组的长度-1.
每轮两两比较几次。数组长度-i-1 次
目标:选择排序
选择排序的思想:从当前位置开始找出后面的较小值与该位置交换。
数组:int[] arr = {5 , 1 , 3 , 2}
选择排序的实现思路:
(1)控制选择几轮:数组的长度-1.
(2)控制每轮从当前位置开始比较几次。
i(轮数) 次数
0 3
1 2
2 1
小结:
从当前位置开始找出后面的较小值与该位置交换。
控制选择几轮:数组的长度-1.
以当前位置作为基准,从下一个元素开始遍历寻找出较小值与当前位置交换即可!
目标:二分查找
正常查找:从第一个元素开始遍历,一个一个的往后找,综合查找比较耗时。
二分查找:二分查找的前提:对数组是有要求的,数组必须已经排好序。
每次先与中间的元素进行比较,如果大于往右边找,如果小于往左边找,如果等于就返回该元素索引位置!
如果没有该元素,返回-1。综合性能比较好!!
小结:
定义一个方法,记录开始的索引位置和结束的索引位置。
取出中间索引位置的值,拿元素与中间位置的值进行比较,如果小于中间值,结束位置=中间索引-1.
取出中间索引位置的值,拿元素与中间位置的值进行比较,如果大于中间值,开始位置=中间索引+1.
循环正常执行的条件是:开始位置索引<=结束位置索引。 否则说明寻找完毕但是还是没有该元素值返回了-1.