HashMap和Hashtable和TreeMap

HashMap和Hashtable区别

  • HashMap的key和value都可以为空值(null),初始化16,初始化容量建议2的倍数,加载因子0.75,扩容为加倍
  • Hashtable的键和值都不可以为null,初始化11,默认加载因子0.75,扩容为加倍再加一
  • Hashtable线程安全,HashMap不是线程安全
  • Hashtable过时了,不要再用,可用ConcurrentHashMap

属性类Properties介绍(学IO时再具体学习)

  • 一个Map集合,继承自Hashtable,key和value都得是String类型
  • 存 setProperty(String key, String value)
  • 取 getProperty(String key)

TreeSet(底层是TreeMap,TreeMap底层是二叉树)无序不可重复,但可排序

  • //源码构造方法
    public TreeSet() {
            this(new TreeMap<E,Object>());
        }
    
  • 对自定义的类型无法排序,若想要排序需要实现Comparable接口,重写compareTo(T o)方法

    Comparable<? super K> k = (Comparable<? super K>) key;
                do {
                    parent = t;
                    cmp = k.compareTo(t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);//相等就会被覆盖,所以是不可重复的
                } while (t != null);
    
  • TreeSet集合中的元素应当实现compareTo方法,equals可以不写

    //写一个Student类,用age来排序,这样是升序的,应该是返回正数就放在后面
    @Override
        public int compareTo(Student o) {
            if (this.age > o.age) {
                return 1;
            } else if (this.age < o.age) {
                return -1;
            } else {
                return 0;
            }
            //也可以写成 return this.age - o.age;
        }
    
  • 也可以直接在构造方法传比较器,这样对象就不需要实现Comparable(java.lang)接口,比较器Comparator(java.util)

    如果比较规则单一不怎么变就用comparable,否则就用Comparator

    public TreeMap(Comparator<? super K> comparator) {
            this.comparator = comparator;
        }
    //匿名内部类
    TreeSet<Student> set1 = new TreeSet<>(new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.age - o2.age;
        }
    });
    
  • TreeMap采用中序遍历,是自平衡二叉树

Collections集合工具类

  • public static <T> List<T> synchronizedList(List<T> list) //变成线程安全的
    
  • sort(List list)排序,这个方法存储的对象应当实现Comparable接口,也有对应的用Comparator

上一篇:Java NavigableMap为什么headMap对于相同的方法返回不同


下一篇:java-可以使用TreeMap检索给定键值以上的所有键/值对吗?