Map 泛型
一、Collections工具类
只包含操作或返回集合的静态方法
注意:collection是List 和Set集合的根接口
二、Map
存放键值对的容器,一张Map不能包含重复的键,每个键可以映射到至多一个值。
key(键)的存入和取出是无序的,LinkedHashMap除外
(一)HashMap(掌握)
基于hashCode(),是一个线程不安全, key可以有一个null, value可以有多个null
1)判断重复机制
1.当调用put(K key ,V value),先判断hashCode,如果hashCode相等,则发生哈希碰撞(哈希冲突)
2.再判断equals比较value的值,如果相等,则覆盖;如果不相等,则形成链表,追加到链表末尾,当链表长度等于8时,优化为红黑树,当调用方法remove(K key),减少到6时,退回到链表结构
2)存放key位置的计算方式
用key的hashCode()%map.length
3)扩容方式
*2的方式扩容,扩容后length值发生改变,要重新计算hashCode值
(二)HashTable
是一个线程安全HashMap,key和value不能有null ,底层基于Entry(键值对)的数组、链表、红黑树
(三)TreeMap
基于红黑树,判断key重复的机制跟TreeSet一样,也有自然和定制排序功能
(四)ConCurrentHashMap
替代HashTable,效率高,线程安全
(五)LinkedHashMap
可以保证存入和取出的顺序
(六)遍历方式
(1)获取所有的键值对的set集合 Set<Map.Entry<K,V>> entrySet()
K getKey() 返回对应于此项的键
V getValue() 返回对应于此项的值
(2)获取所有的 key的set集合 Set keySet()
(3)获取所有的value的Collection集合 Collection values()
2.foreach循环或单向迭代器遍历获取集合
(七)使用选择
1、HashMap
具有超高的访问速度,插入、删除、查找元素更快
2、HashTable
JDK8后建议使用ConcurrentHashMap替代HashTable, 既能获取超高的访问速度,又能保证线程安全
3、LinkedHashMap
想保证存入和取出的顺序
4、TreeMap
如果需要让Map按照key进行升序或者降序排序
三、Properties(掌握)
是一个特殊的HashTable,常用来做配置文件、框架使用(作用:增强程序扩展性,减少硬编码问题),key和value都是String类型
(一)将内存中的数据写出到硬盘中
public static void main(String[] args) {
Properties properties = new Properties();
//Object setProperty(String key, String value) 调用方法 put
properties.setProperty("username", "root");
//PrintStream(String fileName) 创建一个新的打印流,没有自动行刷新,用指定的文件名
PrintStream printStream = null;
try {
printStream = new PrintStream("mysql.properties");
//void list(PrintStream out) 将此属性列表打印到指定的输出流中
properties.list(printStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{//void close() 关闭流
if(printStream!=null){
printStream.close();//void close() 关闭流
}
}
}
(二)将硬盘中的数据读取(加载)到内存中
public static void main(String[] args) {
Properties properties = new Properties();
/*FileInputStream(String name) 打开一个连接到一个实际的文件创建一个 FileInputStream
文件由文件系统中的路径名 name命名*/
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("mysql.properties");
//void load(InputStream inStream) 从输入字节流中读取属性列表(键和元素对)。
properties.load(fileInputStream);
//String getProperty(String key) 在这个属性列表中搜索指定的键的属性
String property = properties.getProperty("username");
System.out.println(property);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fileInputStream!=null){
try {
fileInputStream.close();//void close() 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(三)配置文件
-
后缀是 .properties
-
后缀是 .xml
-
后缀是 .ini 或者 .init
-
yml SpringBoot框架
四、泛型
是一个占位符号,当需要的时候,传入一个具体的类型即可
(一)作用
- 校验代码
- 避免强制转换
- 代码扩展性强
(二)使用
-
泛型类
直接在类上加< >
-
泛型方法
在返回值前,修饰符后加上需要的泛型
-
泛型上限和下限
(1)super:最小取到Number
? super Number
(2)extends:最大取到Number
? extends Number
4.泛型嵌套
Set<Entry<Object, Object>>
(三)注意事项
-
泛型中只能使用引用类型,不能使用基本数据类型
-
在泛型中集合或者数组元素是基本类型时,不能转换其对应的引用类型使用
-
在泛型中有继承关系的类之间也不能直接隐式向上造型
class A{} class B extends A{} ArrayList<A> list1 = new ArrayList<A>(); ArrayList<B> list2 = new ArrayList<B>(); list1 = list2;//错误