1…set
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、有序就是怎么存进去的就怎么取出来
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:
Set集合的功能和Collection是一致的。
2…hashset集合
哈希表是存放一堆哈希值(内存地址值)的表,,,,存的时候他表的顺序不是按照你存的顺序来定义的,,arraylist是按顺序存,第一第二存进去,取也是第一第二,,set是按照哈希值大小来存的,在表里面是有顺序的按照哈希值大小顺序,,和你往表里面加元素的顺序不一致...取的时候按照哈希值大小值的顺序取,就是按照表里的顺序取,,表里元素的顺序不一定和存储顺序一致,,哈希表是按照哈希值大小值来存的
哈希表结构的特点是,先看哈希值,哈希值如果一样,再比较我们2是不是同一个对象
set集合只有一种取出方式就是迭代器,,
代码;重写hashCode()和equals()方法
public inthashCode()
{
System.out.println(this.name+"....hashCode");
returnname.hashCode()+age*12;
}
publicboolean equals(Object obj)
{
if(!(objinstanceof Person))
returnfalse;
Personp = (Person)obj;
System.out.println(this.name+"...eques..."+p.name);
returnthis.name.equals(p.name) && this.age == p.age;
}
3…treeset集合
|--TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
3.1…自然排序
代码;
class Student implements Comparable//该接口强制让学生具备比较性。
public int compareTo(Object obj)
{
if(!(objinstanceof Student))
thrownew RuntimeException("不是学生对象");
Students = (Student)obj;
if(this.age>s.age) 此对象大于指定的对象返回正数
return1;
if(this.age==s.age)
{
return0;
}
return-1;
}
3.2…比较器排序
代码:
//自定义一个比较器
public class MyCompare implementsComparator{
@Override
publicint compare(Object o1, Object o2) {
//TODO Auto-generated method stub
Studentstu1=(Student)o1;
Studentstu2=(Student)o2;
returnstu1.getName().compareTo(stu2.getName());
}
}
//使用比较器
TreeSet ts = new TreeSet(newMyCompare()); 集合加入一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。此时Student类里面也有自己的比较方式让对象自身具备比较性