1. 遍历Map的几种方式?
1. 遍历Map集合需要用到的方法
- public set keySet():将Map集合中所有的Key转存到一个set集合中.
- public v get(object key):使用map集合中的get()方法通过map中的key获取其相应的value.
- public set<Map.Entry<k,v>> entrySet():将map集合中键值对然后要象获取并存到set集合中.
- public k getKey() : 通过此方法对键值对对象中的key进行获取.
- public v getValue() : 通过此方法对键值对对象中的value进行获取.
- public collection values() : 使用map中的values()方法将map集合中的所有value存到collection集合中.
2.遍历Map集合的几种方式
- 第一种( keySet() ) : 先获取所有key的集合,然后遍历,并通过key去获取对应的值.
- 第二种( entrySet() ) : 先获取所有键值对对象的集合,然后遍历并分别获取key和value.
- 第三种( values() ) : 通过map中的方法获取map中所有的value,并遍历得到每一个value,此方法只能获取到value值.
3.通过代码演示以上几种遍历方式
- 第一种( keySet() ) :
- 第二种( entrySet() ) :
- 第三种( values() ) :
4.Map的实现类
- TreeMap : 使用二叉树存储key-value.
- HashTable : 版本比较低,线程是安全的,但是效率低.
- HashMap : 使用比较多,线程是不安全的,但是效率高.
- LinkHashMap : 底层使用链表来维护key-value的次序.
- properties : 和map一样也是以key-value存储数据,如下图示例.
2.线程
1.线程的创建
(1) 继承Thread类
Thread类本质上其实是继承了Runnable接口,代表一个线程的实例,启动线程的唯一方法就是Threa类的start()方法,此方法将启动一个新的线程,并执行run()方法. 这种方式其实很简单,通过自己创建的类直接继承Thread类,并复写run()方法,然后在测试代码中声明自己创建的类,使用start()方法启动线程执行复写的run()方法.
(2)实现Runnable接口
Java中的类继承属于单继承,当自己定义的类已经继承了一个类就无法继承Thread类,但是其仍然可以实现多个接口.
(3) 实现Callable接口
实现Callable接口和实现Runnable接口很相似,区别就是Callable接口中需要重写的call()方法是有返回值的.
(4) 线程池方式
线程池其实就是容纳多个线程的容器,其中的线程可以重复使用,省去了频繁创建线程对像的操作,反复创建线程对象是非常耗费资源的.
2.Lock接口和synchronized解决线程安全问题时,优势是什么?
(1) 获取和释放锁的操作更加直观,锁运用更加灵活
Lock中的方法 : Lock() : 加锁. onLock() : 释放锁.
(2) 可以更加方便的实现公平锁
公平锁 : 线程获取锁的顺序是由线程加锁的顺序决定的,即先来先得.
非公平锁 : 一种对锁的抢占机制,是随机拿到锁的,也就是说会有一些线程是一直拿不到锁的,结果是不公平的.
3."=="、HashCode()、equals()的区别
1.单独说说"=="
如果"=="比较的是两个基本数据类型,那么其比较的是两个数据是否相等,如果比较的是两个引用数据类型,那么其比较的是两个数据的地址值。
2.HashCode()和equals()
(1) 类中没有重写此方法
HashCode()和equals()都是对地址值进行比较。
(2)类中重写此方法
HashCode():根据对象中的成员变量计算出一个hash值,然后进行比较。
equlas():比较的是两个对象中的成员信息是否相同。
注意:若是equlas()比较结果相同,则HashCode()比较结果一定相同。若HashCode()比较结果相同,equlas()比较结果不一定相同。