- Map-HashMap【映射:由一个键指向一个值(键值是一对一的)】(重点掌握)
- Properties 配置文件
- Collections 工具类(掌握)
- 泛型(掌握语法)
一、回顾
- Timer定时器:
-
- Timer:其实就是创建一个线程并且启动
- TimerTask:就是Runnable的实现类
- (类是起到数据模板的作用)
- (接口是起到规范统一的作用)
- 数据结构
-
- 基于数组的数据结构
-
-
- 数组的创建方式:静态和动态
- 数组的特点:长度固定
- 数组有下标:查改快,增删插慢
-
-
- 基于链表的数据结构
-
-
- 增删插快,查改慢
-
-
- 基于树形的数据结构
- 栈结构:先进后出
- 双向队列:头尾(增删查改插)快
- 集合:保存数据的容器,基于某种数据结构
-
- 体系结构:
-
-
- Collection
-
-
-
-
- List:有序可重复
-
-
-
-
-
-
- ArrayList
- LinkedList
- Vector
-
-
-
-
-
-
- Set:无序不可重复
- 无序形成的原因:存放元素下标需要计算,底层数组的长度又是可以变化,计算出的位置是变化的
-
-
-
-
-
-
- Hashset
- LinkendHashset(哈希表+链表)
- TreeSet(树形结构)
-
-
-
二、Map-HashMap
1. 什么是Map?:
- Map是存放键值对(Entry:key value)的集合,存放的是一堆对值,key不能重复,value可以重复,一个key只能对应一个值
-
- key不能重
- value可以重复
- 一个key(键)只能对应一个值
2. Map的使用场景:
-
- 身份证号码 --- 人
- 只要是操作一堆纸,就需要使用map
- 存放一堆值:使用Entry;
- 一般使用map集合就都使用hashMap,需要为维护顺序使用LinkedHashMap,需要操作属性文件使用Properties,需要按,键的大小排序TreeMap;
3. map接口中的常用方法介绍:
-
- clear():清空Map集合
- containsKey(Object key):判断该集合中是否存在传入的key
- containsValue(Object value):判断该集合中是否存在传入值
- get(Object key):根据传入的键,获取对应的值
- isEmpty():判断集合是否为空
- put(k key,V value):向集合添加一个键值对(Entry),k是键 , v是值
- putAll(Map <? entends k ,? extends v>m):将传入集合中所有的键值对加入
- remove(Object key): 通过传入的键在集合中删除这个键值对
- size():获取集合键值对的对数
没有修改的方法?使用put(),只要键相同就发生覆盖,就是修改功能
4. Map集合遍历的方法
-
- 1.键和值都需要遍历
-
-
- Set entrySet():将集合中的键值对(Entry)放入Set集合中
-
-
- 2.只需要遍历键
-
-
- Set keySet():将所有的键放入Set集合中
-
-
- 3.只需要值
-
-
- Collection values():将键值中所有的值放入集合中
-
5. Map的体系结构
- Map是接口
- 哈希表(散列表:数组+链表)
- 常用实现的子类
-
- HashMap:基于哈希表(散列表:数组+链表)的实现,线程不安全,是无序,添加Entry的顺序和遍历的顺序不能保证一致不变
-
-
- 哈希表:底层是一个数组,数组中元素是一个链表
- 存在的位置需要通过Hash值来计算
-
-
-
-
- 存放的位置:
-
-
-
-
-
-
- key的hashCode % 底层数组的长度,默认长度为16
- 计算出的位置上有元素,这个时候就会发生哈希碰撞(哈希冲突),元素只能保存在链表上
-
-
-
-
-
-
- HashMap添加元素的流程
-
-
HashMap map = new HashMap() //底层创建一个长度16的数组
map.put("a",你好);
-
-
-
- 键是不重复的,去重机制:
-
-
-
-
-
-
- 1.将键:"a"的hashCode获取
- 2.去查看集合有没有一个键的hashCode和“a”的一样
-
-
-
-
-
-
-
-
- 没有:说明这个键在集合不存在
-
-
-
-
-
-
-
-
-
-
- 计算存放的下标位置,得到位置的下标
- 这个位置上如果没有值,直接将键值对放入这个位置
- 这个位置如果有值,是将这个元素加到这个位置的链表上去
-
-
-
-
-
-
-
-
-
-
- 有:说明hashCode遇到相同的
-
-
-
-
-
-
-
-
-
-
- 比较他们的equals
- 不同:说明键在集合中不存在,开始计算位置并添加
- 相同,说明键在集合已经存在,覆盖这个键对应的值-
-
-
-
-
-
- HashTable:线程安全的,不允许空值空键,null作为值
-
- properties:属性键值对,键和值都只能是字符串String,作用是读写属性文件的,解决编码问题
- TreeMap:基于树形结构的集合,可以根据键来做升序排列
-
- 当某个链表上的元素(Entry)个数大于等于8
-
-
- 去统计集合中所有的元素个数,如果个数大于64个
- 这个时候链表会形成树形(红黑树),提高查询效率
- 去统集合中所有元素的个数,如果总个数小于64
- 说明哈希碰撞很严重将数组扩容一次
-
-
- 如果一个链形成了树,但是这个链上的元素个数已经小于等于6,这个树就会转为链表
- TreeMap集合
-
- 底层使用的是红黑树结构
-
-
- 填加集到集合需要实现Comparable
- 去重机制:自然比较器或定制比较器的方法返回0
-
-
- TreeMap的键可以是任意类型,但是会以第一个加入的类型为准
三、特殊的集合Properties
- 用来操作属性文件的集合
- 属性文件:Properties
-
- propertie:文件中存放的就是键值对【Entry】
- 使用propertie操作属性文件作用:解决硬编码
1. 常用方法:
- getProperty(String key):通过传入的键获取值
- getProperty(String key, String defaultValue):
- setProperty(String key, String value):修改键对应的值
四、Collections(工具类)
类方法:对象.
静态方法:类名.
- addAll(All(Collection<? super T>c , T ... eelements)):简化添加元素
- fill:快速填充
- max:找集合中最大值
- min:找集合中最小值
- reverse(List<?>List):反转集合的元素
- shuffle(List<?>List):洗牌,打乱集合中元素的顺序
- sort(List<T>List):排序【升序】
- swap(List<?>List,int i , int j):交换;两个位置的元素
五、泛型
- 泛型:限制集合中元素的数据类型
- 作用:检查元素的类型,避免向上转型
- 类型的使用:<数据类型【只能使用引用类型】>
- 泛型的上下限:
-
- 上限:最大只能到那个类型<? extends 固定类型>
<? extends Number>:数据最大取到Nunmber
- 下限:最小只能取到的类型<? super Number>
<? super Number>:数据最小取到Nunmber
- 泛型表示的数据类型:
-
- E Element 元素,任意的元素类型,意思等价Object
- T Type 类型
- K key 键
- V Value 值
- R return 返回值的类