文章目录 HashMap(键值对) HashSet TreeMap(键值对) TreeSet HashMap(键值对) HashMap 存放元素时,是key-value这样的组合时,在存放元素时,如果原本已经
文章目录
- HashMap(键值对)
- HashSet
- TreeMap(键值对)
- TreeSet
HashMap(键值对)
HashMap 存放元素时,是key-value这样的组合时,在存放元素时,如果原本已经存在对应的key,则直接改变对应的value,并返回旧的value,而在判断key是否存在(相等)的时候是先比较key的hashCode,再比较相等(==)或equals的。HashMap中判断元素是否相同主要有两个方法,一个是判断key是否相同,一个是判断value是否相同:- HashMap是怎样判断元素Key是否相同的,就是先判断key的hashCode是否相同,再判断key是否相等(==)或equals的(Map中判断key是否相同是通过containsKey()方法进行的,有兴趣可以去看源码)
- 判断value是否相同的,对于非null形式的value是通过value的equals来进行判断的,而null形式的只要相等即可,即保存的元素中有value为null即可
HashSet
HashSet中的元素其实是通过HashMap来保存的,在每个HashSet对象中都持有一个对应的HashMap对象的引用,在对HashSet进行元素的添加、删除等操作时都是通过其持有的HashMap来进行的。在保存元素时其会将对应的元素作为持有的HashMap的key来进行保存,对应的value是一个常量Object,所以其在保存的时候判断元素是否相同所使用的是HashMap判断key是否相同的逻辑。(判断是否包含某一元素时也是调用了所持有的HashMap的containsKey方法来进行判断的)TreeMap(键值对)
TreeMap中存放的元素都是有序的,而且是根据key进行排序的。TreeMap在对存放的元素进行排序时有两种方式:- 一种是通过自身持有的Comparator进行排序
- 另一种是通过实现了Comparable接口的key进行排序,优先使用第一种方式,当持有的Comparator(默认为null)为null时则采用第二种方式。
第一个元素将直接存进去。之后的元素分两种情况进行,一种是根据Comparator来比较,另一种是根据Comparable来比较比较了现有元素的key与当前存放元素的key的结果为0(重复)时,将认为当前存放的元素key在原有Map中已经存在,然后改变原有的key对应的value为新value,而不再新存入key-value对,然后就直接返回了旧value。TreeMap判断元素是否存在的逻辑是通过判断Comparator或Comparable进行比较后的结果是否为0,所以我们在使用TreeMap希望实现某种类似于元素equals的逻辑时要特别小心。TreeMap的containsValue的逻辑还是判断的对应的value是否equals,与HashMap类似,(有兴趣可以去看源码)TreeSet
TreeSet是的Set的一种实现,其存放的元素是不重复的,而且是有序的默认情况下所存放的元素必须实现Comparable接口,因为默认情况下将把元素当做Comparable对象进行比较。TreeSet也是可以通过Comparator来比较其中存放的元素的,这可以在构造TreeSet的时候通过传入一个Comparator对象或一个持有Comparator对象的TreeMap来实现。TreeSet的实现与HashSet的实现类似,其内部也持有了一个Map的引用,只不过它引用的不是HashMap,而是TreeMap。TreeSet中元素的新增、删除等操作都是由其持有的TreeMap来实现的,所以与HashSet类似,TreeSet中判断元素是否相同的方式与TreeMap是一致的,也是通过Comparator或Comparable来判定的,而不是传统的equals方法。(有兴趣可以去看源码)