2021.11.16 Java HashMap、HashTable、Properties、TreeSet

哈希表
数组与链表的结合体
HashMap集合:
1.集合底层是哈希表/散列表的数据结构
最主要掌握:
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接口。


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值