哈希表
数组与链表的结合体
HashMap集合:
最主要掌握:
map.put(k,v);
v= map.get(k);
以上两个原理
原理图如下:
HashMap集合的key,会先后调用两个方法,一个方法是hashCode(),一个方法是equals(),那么这两个方法都需要重写。
HashMap 的特点:无序不可重复
放在HashMap集合key部分的元素其实是放到了HashSet集合中了。所以HashSet集合中的元素也需要同时重写hashCode()+equals()方法。
注意:同一个单向链表上,所有节点的hash相同,因为它们的数组下标是一样的。但同一个链表上k和k的equals方法肯定返回的是false,都不相等。
HashMap集合的默认初始化容量(官方建议是2的倍数)是16,默认加载因子是0.75
·注意:如果一个类的equals方法重写了,那么hashCode()方法必须重写。并且equals方法返回如果是true,hashCode()方法返回值必须一样。
这两个方法可以直接用IDEA工具生成,但是要同时生成
终极结论:
放在HashMap集合key部分的,以及放在HashSet集合中的元素,需要同时重写hashCode方法和equals方法。
版本更变:
在JDK8之后,如果哈希表单向链表中元素超过8个,单向链表这种数据结构会变成红黑树数据结构,当红黑树数据上的节点小于6时,会重新把红黑树变为单向链表数据结构。
HashTable
HashTable的key和value都是不能为null的。
HashMap的key和value都是可以为null的。
HashTable方法都带有:synchronized:线程安全的。
线程安全有其他方案,这个HashTable对线程处理导致效率低,底层与HashMap相同都是哈希表数据结构,HashTable初始化容量是11,默认加载因子是0.75 ,扩容:原容量*2+1;
Properties
掌握set 存方法、get 取方法即可
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("123","456");
properties.setProperty("456","789");
properties.setProperty("789","000");
String s1= properties.getProperty("123");
String s2= properties.getProperty("456");
String s3= properties.getProperty("789");
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
TreeSet
public static void main(String[] args) {
TreeSet<String> strings = new TreeSet<>();
strings.add("123");
strings.add("fhfeus");
for (String s:strings) {
System.out.println(s);
}
TreeSet<Integer> integers = new TreeSet<>();
integers.add(123);
integers.add(2564);
integers.add(31548);
for (Integer i:integers) {
System.out.println(i);
}
}
自定义类型用TreeSet集合,其中无参构造需要自己实现Comparable接口,定制大小规则(返回正负数);
或者直接有参构造,使用比较器:
TreeSet<WuGui> wuGuis = new TreeSet<>(new WuGuiComparator());
结论
放到TreeSet或者TreeMap集合key部分的元素要想做到排序,包括两种方式:
·第一种:放在集合中的元素实现java.lang.Comparable接口。
·第二种:在构造TreeSet或者TreeMap集合的时候给它传一个比较器对象。
·Comparable和comparator怎么选?
–>当比较规则不会发生改变的时候,或者说比较规则只有1个的时候,建议实现Comparable接口。
–>如果比较规则有多个,并且需要多个比较规则之间频繁切换,建议使用Comparator接口。