----------------------------------- android培训、java培训、期待与您交流! -----------------------------------
一 set 集合
1:特点不允许对象重复(靠equals来判断),最多允许一个null
2:对象的存入和取出是不一致的(无序)。
二 HashSet
1:底层的数据结构是Hash表,是线程不安全的,不同步。
2:元素的唯一性是通过hashCode和equalsl来完成的,当HashCode值相同,时才会判断equals。
HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的素有元素就可以的到结论。可见,HashSet集合具有很好的对象检索性能,但是,HashSet集合存储对象的效率相对要低些,因为向HashSet集合中添加一个对象时,要先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置。
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的hashCode方法,但是为它提供了一个hashCode方法也不会有什么不好,没准以后什么时候又用到这个方法了,所以,通常要求hashCode方法和equals方法一并被同时覆盖。
通常来说,一个类的两个实例对象用equals()方法比较的结果相等时,它们的哈希码也必须相等,但反之则不成立,即equals方法比较结果不相等的对象可以有相等的哈希码,或者说哈希码相同的两个对象的equals方法比较的结果可以不相等。
当一个对象被存储进HashSet集合中以后,就不能修改这个对象的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。
3 取出的方式:只有Iterator,
4 在用到HashSet是,一般都会覆盖掉他的hashSet和equals;
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p=(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
public boolean hashCode()
{
return name.hashCode()+age*38;
}
二 TreSet
底层的数据结构是二叉树(在数据多是比较有优势)二叉树所用的比较方法是compareTo(),通过此方法比较后把小的放在左边,大的在右边,正是由于这杨的比较方法所以他的效率比较高。当元素过多时他会自己去折中值。取元素的方法是先中左边(小的)开始。
1:可以对TreeSet集合中的元素进行排序,按照自然顺序排序,也就是unicode,
2: 第一种比较方式 让元素自身具备比较性,让没有比较性的元素必须实现Comparable,覆盖掉他的compareTo(Object obj),
public int compareTo(Object p)
{
if(!(p instanceof Person))
throw new RuntimeException("不是学生对象");
Person p1=(Person)p;
if(this.getAge()==p1.getAge())
return this.getName().compareTo(p1.getName());//字符串是实现了Compartable 的。
if(this.getAge()>p1.getAge())
return 1;
else
return -1;
3 第二种排序:当元素不具备比较性和具备的比较性不是我们需要的时。可以让TreeSet这歌容器具备比较性,这杨就需要这个集合在一初始化时就具备比较性。
TreeSet(Comparator<? super E> comparator)
TreeSet(Collection<? extends E> c)
age:class MyComparator implements Comparator
{
public int compare(Object a,Object b)
{
Person p1=(Person)a;
Person p2=(Person)b;
int num=p1.getName().compareTo(p2.getName());
System.out.println(p1.getAge()+"____"+p2.getAge()+num);
if(num==0)
{
if(p1.getAge()>p2.getAge())
return 1;
if(p1.getAge()<p2.getAge())
return -1;
else
return 0;
}
else
return num;
}
}