回顾:
1、泛型主要约束类、接口、方法
常规的一些泛型符号:W,T,E,K,V(可以任意使用)
2、泛型的好处:
避免强制类型转型, 把运行出错的情况提前到编译错误
泛型的坏处:
只能存同样的数据类型
给类定义泛型的语法:
访问修饰符 class 类名<泛型>{
}
3、静态方法不能使用类的泛型的申明
给接口定义泛型:
访问修饰符 interface 类名<泛型>{
}
4、实现接口的泛型的两种情况:
- 实现类确定泛型 (Scannner)
- 不确定的泛型( List )
5、泛型的通配符 ? :
- <? extends E> 问号可以是泛型E 的子类, 包含E
- <? super E> 问号可以E的父类 包含E
6、泛型没有继承的概念
7、set 集合的特点: 无序,没有索引,不能够重复
- 实现类: HashSet 无序,没有索引,不能够重复, 是以hash表结构进行存(查询的速度快)
8、如何避免存同样的数据:
- 比较hashCode 与equals( ) 是否相等 ( 实际上是map来进行存的 )
Map
是一个接口,是双列集合的顶级
(Collection 是单列集合的顶级 )
-
Map:是以键值对的形式来进行存储(Key,Values);
语法: Map<Integer,String> map=new HashMap<>();
-
map 里的键(Key)都是唯一的,不能够重复, (Values)是可以重复,每一个键只能对应一个值(一 一对应,也就是映射的关系)
-
Map 的具体实现类有
- HashMap(重点)
- TreeMap
- Hashtable(少用)
- Map.Entry<K,V> :Map里面有一个内部接口的名字叫Entry
Map 常规的一些方法:
添加的方法
V put(K key,V value)
//通过键值对来进行添加
移除的方法:
V remove(Object key)
//通过键来删除键值对 (没有根据索引来移除)
判断类型的方法:
boolean containsKey(Object key)
判断这个键是否存在
boolean containsValue(Object value)
判断这个值是否存在
boolean isEmpty()
是否存在元素
获取性的方法:
void clear( )
清除所有的元素
V get(Object key)
通过键来获取值
int size( )
获取集合的长度
Collection<V> values()
获取所有的values()
Set<K> keySet( )
获取map中所有的键 ,返回值是一个Set
修改类方法
根据键来修改值,键必须存在
V put(K key,V value)
Collection 与 Map
Collection:
- 单列集合(存的数据都是独立)
- 单列集合的数据结构都是都是具体的数据
- 单列中的set集合不能出现重复的数据
Map:
- 双列集合 (以键值对进行存储)
- 双列集合的数据结构都是正对与键
- 双列集合是键不能出现重复的数据
双列集合的遍历方式:
- 获取到所有的key,来得到具体的值
- 把每一组数据当成是一个整体来进行遍历
Map集合里嵌套map 集合来进行遍历: 规律:从外层往内层剥皮
HashMap :
父接口是Map, 它的存储方式也是以hash表的结构来进行存储(无序)
-
HashMap 与HashSet : 都是以hash表结构来进行存储(查询速度快)
-
HashSet 相当于 map 里没有values 那一部分,只用去关注键的那一部分(hash值 与equals()来判断键是否重复)
-
HashMap: 只关注键,不关注值(任意的值都可以,还可以重复 )
-
HashMap 的一个子类是LinkedHashMap: 也是数组加上双重链表来进行存储, 有序
Hashtable 与HashMap 的区别
- 版本不一样: Hashtable 1.0 HashMap 1.2
- Hashtable 不符合命名规范 HashMap 是符合
- Hashtable 线程安全,效率地 HashMap 线程不安全 ,效率高
- HashMap 已经把Hashtable替换掉
疑问
Map集合在内存的分配上是怎样的?是键值在栈,Valus值在堆吗?