10.集合Set

 

,可变参数

1,   可变参数是在jdk1.5以后函数的参数可以定义为可变参数

可变参数的定义方式为(类型...变量名);  注意:”...” :只能是3

可变参数可以接受指定类型的0到多个实参,也可以接受指定类型的一个数组;

这些实参都会传入到形参变量代表的数组中,传了几个实参,形参数组的长度就是几

可变参数必须是参数列表的最后一个;

2,什么时候使用可变参数

当我们定义一个函数的时候,如果需要接收的数据个数不确定,那么就定义为可变参数

这样别人使用我们的方法时,可以按照实际需求传入不同数量的实参

:

importjava.util.Arrays;

publicclass ParamMehodDemo {

 

   /**Java1.5的新特性:

   publicstaticvoid main(String[] args) {

      show1(1,3,4,6,7);

      show("c",3,2,5);

   }

   privatestaticvoid show1(int... arr) {

      System.out.println(arr.length);

   }

   publicstaticvoid show(String str,int... arr) {

      System.out.println(arr.length);

   }

}

,List的分类

1,ArrayList

数组结构,查找块

2,LinkedList

链表结构,增删块

也是一种队列的实现,可以使用remove方法获取对首的元素;

3,Vector

ArrayList原理相同,但线程安全,效率略低

拥有一种自己特有的迭代方式:枚举;

使用elements()方法可以获取一个Enumeration接口,调用hasMoreElements()方法是否包含下一个,调用nextElements()获取下一个;

4,Stack: 堆栈结构;

Stack是一种栈结构的容器,先存的元素最后被取出,后存的元素先被取出;

       5.Queue:队列结构

              Queue是队列结构,先进先出,后进后出;

,Set集合

1,HashSet

除掉重复,没有顺序

HashSetadd方法会调用hashCodeequals,所以存储在HashSet中的对象需要重写这两个方法;

/**hashSet工作原理:

每次存储对象的时候,调用对象的hashCode方法,计算一个哈希值,在集合中查找是否包含与哈希值相同的元素;

    *              如果没有哈希值相同的元素,直接存入;

    *              如果有哈希值相同的元素,逐个使用equals方法比较

    *                 比较结果全为false则存入

    *                 比较结果有为true则不存;

    */

如何将自定义类对象存入HashSet进行去重复

 *    类中必须重写hashCode()方法和equals()方法

 *    equals()方法中比较所有属性

*     hashCode()方法要保证属性相同的对象返回值相同,属性不同的对象尽量不同

举例:

package cn.itcast;

 

//定义Person,实现comparable 

publicclass Personimplements Comparable<Person> {

   private Stringname;    //成员变量私有;

   privateintscore;

   privateintnum;

 

   // 定义有参构造函数;

   public Person(String name,int score,int num) {

      this.name = name;

      this.score = score;

      this.num = num;

   }

 

   //

   @Override

   // 重写hashCode方法

   publicint hashCode() {

      finalint prime = 31;

      int result = 1;

      result= prime * result + ((name ==null) ? 0 :name.hashCode());

      result= prime * result + score;

      result= prime * result + num;

      return result;

   }

 

   @Override

   // 重写equals方法

   publicboolean equals(Object obj) {

      if (this == obj)

         returntrue;

      if (obj ==null)

         returnfalse;

      if (getClass() != obj.getClass())

         returnfalse;

      Person other = (Person) obj;

      if (name ==null) {

         if (other.name !=null)

            returnfalse;

      }elseif (!name.equals(other.name))

         returnfalse;

      if (num != other.num)

         returnfalse;

      if (score != other.score)

         returnfalse;

      returntrue;

   }

 

   @Override

   // 重写toString方法

   public String toString() {

      return"Person>>[name=" +name + "  >>score=" + score +>>num="+ num + "]";

   }

 

   /*

    * 使用当前对象和另一个Person比较大小如果当前对象小,返回负数 如 *果当前对象大,返回正数 如果等于,返回0;

    */

   publicint compareTo(Person p) {

      int i = p.score -this.score;

      // 比较分数大小;

      return i != 0 ? i : (p.num-this.num);

}

}

package cn.itcast;

//导包

import java.util.HashSet;

 

publicclass HashSetDemo {

   publicstaticvoid main(String[] args) {

      // 创建HashSet集合

      HashSet<Person>hs = new HashSet<Person>();

//    new Person (name, score,num)

      hs.add(new Person("李斯",59,1000));

      hs.add(new Person("嬴政",60,10000));

      hs.add(new Person("子婴",59,5665));

      hs.add(new Person("项羽",60,8899));

     

      hs.add(new Person("子婴",60,9988));

      hs.add(new Person("子婴",59,5665));

      hs.add(new Person("项羽",60,9900));

     

     

      //增强for循环;

      for(Person p:hs)

         System.out.println(p);

   }

 

}

2,LinkedHashSet

HashSet的子类,除去重复,且保留原存储顺序

3,TreeSet

除掉重复,且可以按照某种顺序排序

可以对Set集合中的元素进行排序。

       底层数据结构是二叉树。

       保证元素唯一性的依据: compareTo方法return 0.

TreeSet排序的第一种方式:让元素自身具备比较性。

                           元素需要实现Comparable接口,覆盖compareTo方法。

                           也种方式也成为元素的自然顺序,或者叫做默认顺序。

TreeSet的第二种排序方式:

       当元素自身不具备比较性时,或者具备的比较性不是所需要的。

       这时就需要让集合自身具备比较性。

       在集合初始化时,就有了比较方式。

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

定义一个类,实现Comparator接口,覆盖compare方法。

注意:排序时,当主要条件相同时,一定判断一下次要条件。

当两种排序都存在时,以比较器为主。

举例调用上面的Person

package cn.itcast;

 

import java.util.TreeSet;

 

publicclass TreeSetDemo {

   publicstaticvoid main(String[] args) {

      // 创建一个TreeSet集合,

      TreeSet<Person>ts = new TreeSet<Person>();

      ts.add(new Person("刘邦", 95, 10000));

      ts.add(new Person("项羽", 70, 1000));

      ts.add(new Person("张良", 87, 8899));

      ts.add(new Person("陈平", 85, 7788));

     

      ts.add(new Person("刘邦", 55, 5555));

      ts.add(new Person("陈平", 59, 5566));

      ts.add(new Person("项羽", 70, 8877));

//遍历ts,按顺序打印出不重复的对象;

      for (Person p : ts)

         System.out.println (p);

   }

 

}

class MyComparatorimplementsComparator {

   publicint compare(Object o1,Object o2) {

      Person p1 = (Person)o1; 

//强制类型转换,将集合中取出的对象转成Person,然后根据Person属性进行比较

      Person p2 = (Person)o2;

//比较人名是否相同

      int i = p1.getName().compareTo(p2.getName());

//如果人名相同,比较学号是否相同,如果都相同,说明是同一个人,不比较分数;

      if(i == 0)

         returnnew Integer(p1.getNum()).compareTo(new Integer(p2. getNum ()));

      return i;

   }

}

4,迭代方式

1,使用迭代器Iterator

for(Iterator iter = set.iterator();iter.hasNext();) {

System.out.println(iter.next());

}

2,使用增强for循环;

for(Object obj : ts) {

System.out.println(obj);

}

              3.TreeSet特有:逆向迭代(descendingIterator).Java1.6版本新特性;

                    :

                    TreeSet<String> ts = new TreeSet<String>();

         ts.add("zzz");

         ts.add("aaa");

         ts.add("cab");

         ts.add("xx");                   

Iterator it = new TreeSet().descendingIterator();

                     while(it.hasNext())

                            System.out.println(it.next());

                    //获取集合中按自然顺序排列的第一个元素,并从集合中移除,改变集合长度;java1.6新特性,如果set集合为空,返回null

      System.out.println("ts.pollfirst="+ts.pollFirst());

      System.out.println(ts.size());

                           打印结果:  zzz

xx

cab

aaa

ts.pollfirst=aaa

3

5,小结:

1,学会hashSet

2,学会TreeSet

3,学会迭代方式;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值