Map&泛型

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();
				}
			}
		}
	}
(三)配置文件
  1. 后缀是 .properties

  2. 后缀是 .xml

  3. 后缀是 .ini 或者 .init

  4. yml SpringBoot框架

四、泛型

是一个占位符号,当需要的时候,传入一个具体的类型即可

(一)作用
  1. 校验代码
  2. 避免强制转换
  3. 代码扩展性强
(二)使用
  1. 泛型类

    直接在类上加< >

  2. 泛型方法

    在返回值前,修饰符后加上需要的泛型

  3. 泛型上限和下限

    (1)super:最小取到Number

    ? super Number

    (2)extends:最大取到Number

    ? extends Number

4.泛型嵌套

​ Set<Entry<Object, Object>>

(三)注意事项
  1. 泛型中只能使用引用类型,不能使用基本数据类型

  2. 在泛型中集合或者数组元素是基本类型时,不能转换其对应的引用类型使用

  3. 在泛型中有继承关系的类之间也不能直接隐式向上造型

    class A{}
    class B extends A{}
    ArrayList<A> list1 = new ArrayList<A>();
    ArrayList<B> list2 = new ArrayList<B>();
    list1 = list2;//错误
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值