黑马程序员——java基础之Set集合

来源:互联网 发布:网络工程学院 编辑:程序博客网 时间:2024/05/21 15:01

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Set集合概述

Set集合元素的存入顺序和取出顺序是不一致的,集合中的元素不可以重复。Set集合的两个常用子类:HashSet和TreeSet。

二、HashSet

1.HashSet的常见方法

//HashSet的常见操作方法add()addAll()remove()removeAll()iterator()
2.HashSet集合保证元素唯一性的依据:

元素通过调用自己的hashCode和equals方法,比较异同。当hashcode值不同时,直接存入集合不进行equals判断。当hashcode相同时,继续进行equals判断,如果equals返回true则存入失败。

注意:当自定义对象存入HashSet中时,为了避免相同对象的存入,需要对象类根据自身的属性特征复写Object类的hashcode和equals方法。

3.练习题:自定义一个pers类,并将person对象存入HashSet集合,再将人对象的属性获取出来。

/* * 需求:自定义一个pers类,并将pers对象存入HashSet集合,再将人对象的属性获取出来 * 思路: * 1.定义Pers类,需要复写hashCode和equals以及toString方法 * 2.定义集合,将pers对象存入 * 3.通过迭代器将元素打印出来 */package com.itheima;import java.util.HashSet;import java.util.Iterator;class Demo{public static void main(String[] args){HashSet hs =new HashSet();hs.add(new Pers("zhangsan01",10));hs.add(new Pers("zhangsan02",20));hs.add(new Pers("zhangsan03",30));hs.add(new Pers("zhangsan01",10));//存入重复人对象hs.add(new Pers("zhangsan04",40));System.out.println(hs);//打印结果没有重复元素,说明重复元素没有存进来//定义迭代器取出元素Iterator it =hs.iterator();while(it.hasNext()){Pers p =(Pers)it.next();System.out.println(p);}}}//定义一个Pers类,用于描述人对象class Pers{private String name;private int age;Pers(String name,int age){this.name=name;this.age=age;}public int hashCode(){           //复写hashCode方法,保证元素存入的唯一性return name.hashCode()+age*36;}public boolean equals(Object obj){ //复写equals方法,保证元素存入的唯一性if(!(obj instanceof Pers))throw new RuntimeException("类型不匹配");Pers p = (Pers)obj;return this.name.equals(p.name)&&this.age==p.age;}public String toString(){    //复写toString方法,使得打印人对象出来的不是地址值return name+":::::"+age;}}

三、TreeSet

1.TreeSet常见操作方法

//TreeSet常见操作方法add();addAll();clear();remove();removeAll();iterator();
2.TreeSet保证元素唯一性的依据:

TreeSet集合中的元素通过调用自己的compareTo方法判断元素是否重复,return 0表示元素重复,return正数或负数表示元素不重复。

注意:TreeSet存入自定义对象时,对象必须具备比较性,即自定义的对象类必须实现comparable接口并复写compareto方法。

    当对象自己的比较性不符合需求时,我们可以自己传给TreeSet集合一个比较器X,X只需实现comparator接口即可。

    当元素自身具备比较性且集合接收了比较器时,以集合的比较器为准。

3.练习题:将字符串存入TreeSet集合中,按照字符串长度由短到长的顺序取出。

/* *需求:将字符串存入TreeSet集合中,按照字符串长度由短到长的顺序取出。 *思路: *1.字符串本身的compareTo方法比较的是自然顺序而非字符串长短 *2.需要自己定义一个比较器并传给TreeSet集合  */package com.itheima;import java.util.Comparator;import java.util.Iterator;import java.util.TreeSet;class Demo{public static void main(String[] args){//定义一个TreeSet集合,并将判断字符串长短的比较器传给集合TreeSet ts =new TreeSet(new lenComp());ts.add("abcdfdf");ts.add("abcdkkkdkgg");ts.add("abcde");ts.add("abcdeffdf");//定义迭代器,取出元素Iterator it = ts.iterator();while(it.hasNext()){String s =(String)it.next();System.out.println(s);          //验证打印结果是否为由短到长}}}//定义一个判断字符串长短的比较器class lenComp implements Comparator{public int compare(Object o1,Object o2){String s1 =(String)o1;//多态,必须强转,否则无法调用length()String s2 =(String)o2;//多态,必须强转,否则无法调用length()return new Integer(s1.length()).compareTo(new Integer(s2.length()));}}



0 0