(16)集合&set

来源:互联网 发布:js分割数字 编辑:程序博客网 时间:2024/06/03 18:57

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类里面也有自己的比较方式让对象自身具备比较性

 

原创粉丝点击