HashMap:

HashMap底层是hash散列表(数组与单向链表的结合,每个数组元素都是一个单向链表)
JDK1.8以后由数组加链表变成数组加链表加红黑树

HashMap的key和value都可以为空,但只能存在一个key为空,因为key不可重复。

常用方法:
clear() 清空集合
containsKey() 判断集合中是否有某一个key
containValue() 判断集合中是否有某一个value
entrySet();keyset() 遍历集合
get() 获取元素的value
isEmpty() 如果集合为空,返回true
put() ;remove() 添加/删除元素
size() 查询元素个数/集合长度

HashMap存储原理:

  1. 使用map.put()添加元素,会生成一个节点对象。它在底层的操作分为两步:<br />1、调用hashCode()方法,通过hash算法算出hash值,即当前生成的节点应该存放在数组的哪个位置上,节点除了有keyvalue外,还有指向下一个节点的内存地址,若没有下一个节点,内存地址为null。<br />2、存放,如果所算出的位置上有节点,调用equals()方法进行比较,如果key相同,当前value值覆盖原有value值。若key不同,后移。同一链表的hash值是相同的。

hashset

HashSet是属于Collection接口体系的,所以添加方法用add(),但HashSet底层有封装HashMap,是将添加的元素存放在map集合put方法中的key部分。HashSet能够快速定位一个元素,无序不可重复。
操作HashSet时,重写时要将equals和hashCode都重写

Hashtable

Hashtable:属于线程安全集合,key和value都不能为空,此外初始容量与HashMap不同,其他方面与HashMap一样。(属于线程安全的效率都比较低)

TreeMap

底层结构是二叉树,可以根据key去升序排序,根据二叉树的中序遍历进行排序
如果key为整形,那么是Integer类型,不是Int,因为Integer底层有排序规则,即Comparable接口,用来进行比较,才能进行排序,所以TreeMap集合的key的数据类型都必须包含排序规则。
方法:
firstKey()返回最小的key
lastKey()返回最大的key
%{0SFNHQY)E~3WSCBUQO59B.png

TreeSet集合

TreeSet集合和TreeMap集合的关系与HashSet集合和HashMap集合的关系类似,TreeSet底层也封装了 TreeMap。
在往TreeSet集合中添加元素如果是自定义的数据类型(比如自定义类),该类需要实现Comparable接口,重写Comparable接口中的compareTo方法。

Map小结:

Map接口的实现类主要有HashMap,HashTable和TreeMap;当元素的顺序很重要时选TreeMap,当元素不必以特定的顺序存储时,选HashMap。HashMap不是同步的,HashTable是同步的,但HashTable不推荐使用,因为HashMap提供了所有类似的功能并且速度更快,当需要在多线程环境下使用时,HashMap也可以转换为同步的。(异步就是一个对象可以同时给多个线程访问,同步就是一个对象只能给一个线程访问,其他线程都得排队等着。

HashMap可以通过Map m = Collection.synchronizedMap(HashMap)来达到同步的效果。
或者使用concurrentHashMap

Properties集合(线程安全)

java.util.Properties 集合 extends Hashtable implements Map
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。
Properties 集合是一个唯一和io流相结合的集合
属性列表中每个键及其对应值都是一个字符串,Properties集合的key和value都是字符串。可以用来存储配置信息。
添加元素的方法为setProperty(),获取元素value的方法为getProperty(key).

因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。
相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。

Properties 集合中一些操作字符串的特有方法:
Object setProperty(String key,String value);原理是调用Hashtable的方法put。
String getProperty(String key)通过key找到value值,此方法相对于Map集合中的get(key)方法
Set stringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串,此方法相当于Map集合中的keySet方法

可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
void store(OutputStream out,String comments)
void store(Writer writer,String comments)

  1. 参数:<br />OutputStream out:字节输出流,不能写入中文<br />Writer writer:文件输出流,可以写入中文<br />String comments:注释,用来解释说明保存的文件是做什么的,不能使用中文,会产生乱码,默认是Unicode编码,一般使用“”空字符串
  2. 使用步骤:<br />1.创建Properties集合对象,添加数据。<br />2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地。<br />3.使用Properties集合中的方法store,把集合中的临时数据,持久化的写入到硬盘中存储。<br />4.释放资源。

可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用
void load(InputStream inputStream)
void load(Reader reader)
参数:
InputStream inStream:字节输入流,不能读取含有中文的键值对
Reader reader:字符输入流,能读取含有中文的键值对。

  1. 使用步骤:<br />1.创建Properties集合对象<br />2.使用Properties集合对象中的方法load读取保存键值对的文件<br />3.遍历Properties集合
  2. 注意:<br />1.存储键值对的文件中,键与值默认的链接符号可以是=,空格(其他符号)<br />2.存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取。<br />3.存储键值对的文件中,键与值默认都是字符串,不用加引号。<br />