集合第二节

来源:互联网 发布:朴槿惠 邪教 知乎 编辑:程序博客网 时间:2024/06/07 05:58

v 上节课补充:

ArrayListVector比较:

ArrayListVector的内部实现类似,Vector设计为线程安全的,为了保证线程安全,Vector在性能方面稍逊于ArrayList,目前我们的编写都是在单线程应用程序,应选择使用ArrayList.

v Set集合:

Set集合和List集合的很多用法是相同的,但是Set集合中的元素是无序的,元素也是不能重复的,Set集合中常用的类有HashSetTreeSet.

HashSet中常用的方法有:

返回类型

方法名称

作用

boolean

add(Object o)

添加元素

void

clear()

移除Set集合中的所有元素

boolean

contains(Object o)

判断集合中是否存在指定元素

boolean

isEmpty()

判断集合是否为空

Iterator

iterator()

返回Set集合中对元素迭代的迭代器

boolean

remove(Object o)

从集合中删除元素

int

size()

返回集合中的元素数量

HashSet存放规律Set中的数据是无序的,并不可重复,可以存放null

在存放数据的时候是根据对象的hashcode码进行存放的当两个对象的hashCode值相等的时候,还要去比较两个对象的equals方法是否相等,如果equals方法返回true,那么代表两个对象是同一个,不能添加进去,否则代表两个对象不是同一个对象,该对象可以添加进去。

注意:Set集合中存放数据时,要尽量避免经常发生hashCode相同的冲突,这会降低程序的性能,所以要在存放的对象的类中重写hashCode()方法,用来保证hashCode是唯一的。

例如:


Set set=new hashSet();     创建一个set集合

boolean boo1=set.add("4");

       System.out.println(boo1);

       添加了重复的元素,所以没有添加成功,返回false

        boolean boo2=set.add("4");

       System.out.println(boo2);

      booleanboo3=set.add("a");

       System.out.println(boo3);

       booleanboo4=set.add("u");

       System.out.println(boo4);

       set.add(newStudent(1, "张三", 18));   添加对象

       set.add(new Student(1, "张三", 18));

       System.out.println(set.size());    获取长度

    

Student类:

    

publicclass Student{

   private intid;

   private Stringname;

   private intage;

   public int getId() {

      returnid;

   }

   publicv oid setId(intid) {

      this.id = id;

   }

   public String getName() {

      returnname;

   }

   publicv oid setName(Stringname) {

      this.name = name;

   }

   publicint getAge() {

      returnage;

   }

   publicv oid setAge(intage) {

      this.age = age;

   }

   public Student(intid, Stringname,intage) {

      super();

      this.id = id;

      this.name = name;

      this.age = age;

   }

   @Override

   public String toString() {

      return"Student [id=" + id +",name=" +name +", age=" +age +"]";

   }

   

   @Override

            重写equals();方法

   public boolean equals(Objectobj) {

      System.out.println("equals被执行了");

      //1.判断obj是否为空

      if(obj==null){

          return false;

      }

      //2.判断是否属于同一类型

      if(!(objinstanceof Student)){

          return false;

      }

      //3.判断内容是否一样

      Student stu=(Student)obj;   //强制转换

      if(stu.getAge()==age&&stu.getName().equals(name)&&stu.getId()==id){

          return  true;

      }

      

      returnfalse;

   }

   @Override

   publicint hashCode() {

      System.out.println("hashCode被执行了");

      // TODO Auto-generated method stub

      return name.hashCode()+age+id;

   }

}

说明:1程序的执行结果set集合的长度为4,因为去除了重复的数据。

     2.存放对象的时候先去比较hashCode值,如果hashCode值相等再去比较equels要保证两个重复的对象不会添加到set集合中,必须要hashCode()方法。

注意:

  当两个对象的hashCode相等的时候,equals不一定相等,

              如果两个对象的equals相等,那么他们的hashCode肯定相等。

 

原创粉丝点击