null的取值: 除了HashTable的K/V都不能null 其余可以存在null
–
但是在TreeMap、TreeSet两个类在加入第二个元素时,会调用Comparator比较器比较先后加入的元素是否重复(TreeMap比较的是Key值)。所以当加入第一个元素时,因为要创建根节点,即使第一个元素是null,也不会报错,因为此时不会调用比较器,再次加入元素则报错。
–
其他集合类HashSet(应该是同hashMap) / HashMap (加入第二个的话,会替换旧值)/ ArrayList / LinkedList均可接受null值。(set类最多只有一个null,
Collection 基本的接口-集合
├ List 子接口 按进入先后有序保存 可重复
│├ LinkedList 接口实现类 链表 插入删除更快
│├ ArrayList 接口实现类 数组 下标访问更快
│└ Vector 接口实现类 数组 同步 线程安全 性能相对其他慢一些
│ └ Stack
└ Set 子接口 仅接收一次,并做内部排序
├ HashSet (内嵌hashmap,原理类似,加入的时候判断是否返回旧val,是的话加入失败)
│ └ LinkedHashSet (具有 HashSet 的查询速度,且内部使用链表维护元素的顺序 ( 插入的次序 ) )。
└ TreeSet 使用红黑树算法维持结构,主要为了有顺序,但是性能不如hash
基本上set里面都包含了一个map,都是基于map实现的。
set的add方法根据map的add方法来判断能不能加入,如果key的hash和equals都一样,map的add调用之后返回旧的Value不返回null,所以添加失败,但是value还是更新了,但是保证了hashset的key的唯一(key还是不变的,就算value更新了)。
Map 基本的接口-键值对的集合
├ Hashtable 接口实现类 同步 线程安全 K/V都不能NULL
├ HashMap 接口实现类 没有同步 线程不安全 (加入的时候如果key重复,替换旧val并返回)
│├ LinkedHashMap 保持了顺序
│└ WeakHashMap
├ TreeMap 使用红黑树结构,主要为了有顺序,访问快,自动调整结构,性能不如hash
└ IdentifyHashMap
ArrayList、Vector和LinkedList的区别
都是可伸缩数组,动态改变长度。
前两个都是数组的方式存储,内存中开辟一块连续的空间存储数据。下标访问快,但是插入就慢。Vector是线程安全的,但是性能相对差一点。LinkedList因为是双向列表,所以顺序遍历快,但是通过下标随机访问就慢,插入删除数据快,不需要动其他数据。ArrayList 经常操作的是末尾加入数据,随机访问
Vector 多线程下的安全读写
LinkedList 遍历操作,插入删除操作,少随机访问HashMap、HashTable、TreeMap、WeakHashMap的区别
前三个是Map的实现类,存储键值对。
HashMap 根据key的HashCode存储,是数组+链表的结构存储数据,加入值的时候先通过key的hashCode计算hash,找到(bucket)数组下标然后循环遍历这个(entry)链表如果没有就加入头上,如果便利过程中发现key已经存在,那么替换value,并返回旧value。(自定义key,比如一个类,没有重写hashCode()方法和equals()默认是用Object的方法,如果引用对象相同则返回true,hashCode()返回对象地址最常用
HashTable是线程安全的,HashMap不支持线程的同步。
TreeMap 保证访问顺序 默认是自然key递增的顺序或者自己定义的顺序,实现了SortMap接口,通过红黑树算法保证顺序。
WeakHashMap的key 是弱引用,只要他的key不再被外部引用,就可以被垃圾回收器回收(HashMap的key被删了才会回收),其余类似HashMap
原本的结构图来自网上,自己修改了一部分-侵删
Collection是一个集合接口
Collections是针对集合类的一个包装类,提供一系列静态方法以实现对集合的搜索、排序、线程安全化等操作。
待续。。