Hase表原理:
简单的说他是通过一种算法来计算哈希值,类似于我们获取到一个数据然后给他取余数 被除数是散列表的表长。这样优势在于 存取速度快。但同时有一个问题就是哈希冲突。简单来说就是我们100%9=1 10%=1 这两个算下来的哈希值一样。这时候就需要考虑 怎么放置数据。
解决哈希冲突:首先判断两个元素是否是同一个对象。底层比较是通过equal 方法比较的 ,相同的话不会插入到表里,不同的话 他会有好多种算法在继续算出他的哈希值,其中有一种叫做链地址法(拉链法) 它类似与链表。前一个元素里放着下一个元素的地址。如下图:
HaseSet :内部使用Hase表结构 不保证顺序,不同步。使用Equal 和haseCode 来比较对象是否相同。取出只有迭代器方法
TreeSet:内部使用二叉树结构,可以通过实现compareAble 接口 实现排序。还可以使用比较器作为TreeSet 构造参数传入。
一般集合中存储的对象覆盖hashCode 和equal 。
/**
* 对象自然排序 按照年龄排序
*/
@Override
public int compareTo(Student o) {
if (!(o instanceof Student)) {
throw new ClassCastException();
}
int temp = this.age - o.age;
return temp == 0 ? this.stuName.compareTo(o.stuName) : temp;
}
HashTable:内部数据结构哈希表 同步 不允许null 作为key value
HashMap:内部使用也是哈希表 不同步。允许key 和value 作为null 同步的话需要使用Collections.synchronizedMap(Map)
TreeMap:数据结构是二叉树。不是同步。可以对key 排序
LInkedHashMap:数据结构是链表和哈希表,集合存入和取出顺序一直。