黑马程序员-----------------集合框架-Set

来源:互联网 发布:二阶互补滤波算法 编辑:程序博客网 时间:2024/05/16 14:37

android培训、java培训、期待与您交流!

Set集合

Set集合的功能跟Collection功能是一直的。在Set集合中元素是无序的,存入和取出的顺序不一定一致,元素不可以有重复。

Set集合中主要的子类:HashSet、TreeSet

HashSet类

HashSet类是实现Set接口的类,它是利用哈希表算法来进行改进执行的效率,很有效的提升了增、删、改、查元素的操作速度。由于它里面的元素是无序的,因此在获取元素的时候得到得结果并不一定跟存入时候的顺序一致。另外,HashSet对象里面的元素是唯一存在的,若是另一个相同元素假如到HashSet对象时,该集合的元素个数不会增加。


package com.leo.blog;import java.util.*;public class HashSetDemo {public static void main(String[] args) {// TODO Auto-generated method stub//创建集合对象HashSet hs = new HashSet();//添加元素hs.add("Cat");hs.add("Dog");hs.add("Rabbit");hs.add("Dog");System.out.println(hs.size());//3System.out.println(hs.isEmpty());//falseSystem.out.println(hs.contains("Dog"));//truehs.remove("Dog");//移出Dog元素System.out.println(hs);//[Cat, Rabbit]hs.clear();//清除所有元素System.out.println(hs);//[]}}


要使用HashSet集合需要通过声明创建HashSet集合对象,来进行对数据的增删改查操作,从代码中可以看到,添加了四个元素其中两个是Dog打印集合长度的时候是3,这里就体现出了在HashSet集合中元素的唯一性。

HashSet如何保证其中值是否唯一的原理:判断元素的hashCod值是否相同,如果相同,继续判断元素的equals方法是否为true。

package com.leo.blog;import java.util.HashSet;class Animals{private String name;private int age;Animals(String name,int age){this.age = age;this.name  = name;}public int hashCode(){return name.hashCode()+age;}public boolean equals(Object obj){if(obj instanceof Human)return false;Animals as = (Animals) obj;return this.name.equals(as.name)&&this.age==as.age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}public class HashSetDemo1 {public static void main(String[] args) {// TODO Auto-generated method stub//创建集合对象HashSet hs = new HashSet();//添加元素hs.add(new Animals("Dog",4));hs.add(new Animals("Rabbit",5));hs.add(new Animals("Cat",1));//hs.add(new Animals("Dog",2));System.out.println(hs.contains(new Animals("Dog",4)));//true}}

如果把Animals类中的hashCode方法给去掉打印的结果是false,这里可以看出要比较HashSet中的元素是先获取哈希值判断是否相同,在进行元素比较。

TreeSet类:TreeSet并不是直接实现的Set接口而是实现的SortedSet接口,TreeSet集合里的每个元素类型必须是相同的,而且元素值会依照由小到大的规则排列。TreeSet底层采用的二叉树结构形式,保证元素唯一性的的是通过compareTo方法的返回值。

TreeSet集合中的一些特有的方法:

package com.leo.blog;import java.util.*;public class TreeSetDemo1 {public static void main(String[] args) {//创建集合对象TreeSet ts = new TreeSet();//添加元素ts.add(50);ts.add(25);ts.add(45);ts.add(30);//打印结果:集合是一个有序的集合System.out.println(ts);//[25, 30, 45, 50]System.out.println(ts.size());//获取集合长度:4System.out.println(ts.first());//获取集合中第一个元素:25System.out.println(ts.last());//获取最后一个元素:50System.out.println(ts.subSet(10, 30));//获取某个范围集合中的元素:25System.out.println(ts.tailSet(30));//获取大于等于30集合中元素:[30, 45, 50]System.out.println(ts.headSet(45));//获取小于等于45集合中的元素}}

从执行的结果可以看出,不管元素添加到TreeSet集合中元素的次序是怎样的,在集合中元素的存储是按照由小到大的顺序自动存放的。

TreeSet集合存放自定义对象:

按照学生的年龄对集合元素进行排序。当向TreeSet集合中添加自定义对象元素时,添加第二个的时候会出现强制类型转换错误的提示,

这是因为TreeSet集合不能直接对自定义的对象进行排序,这时就需要实现Comparable接口覆盖其中的compareTo方法对自定义对象的

内容进行排序。

package com.leo.blog;import java.util.*;class Student implements Comparable{private String name;private int age;Student(String name,int age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int compareTo(Object obj){if(!(obj instanceof Student))throw new RuntimeException("不是学生对象");Student s = (Student)obj;if(this.age>s.age)return 1;if(this.age == s.age)return 0;return -1;}}public class TreeSetDemo {public static void main(String[] args) {//创建集合对象TreeSet ts = new TreeSet();//添加元素ts.add(new Student("LEO",25));ts.add(new Student("LAY",24));ts.add(new Student("KOBE",35));ts.add(new Student("BOBO",23));//Student stu = (Student);//System.out.println();Iterator it = ts.iterator();//循环打印结果while(it.hasNext()){Student stu = (Student)it.next();System.out.println(stu.getName()+"-----"+stu.getAge());}}}
结果:

BOBO-----23
LAY-----24
LEO-----25
KOBE-----35

从结果可以看出自定义对象按照年龄进行了排序,不够这样有一个弊端比较局限,假若需要在存入一个元素

ts.add(new Student("WU",23));
这个元素就不会进入到集合中,以为TreeSet集合中已经存在了一个年龄为23的元素,这时就需要增加另外一个排序方式,让集合自身具备比较性

if(this.age == s.age)return 0;
需要将此处修改一下

if(this.age == s.age)return this.name.compareTo(s.name);



小结:

1.Tree集合中的元素是不能重复出现,所有元素都具有唯一性。

2.HashSet类实现Set接口,采用的是哈希表的算法来改进了执行效率,有效地提升了增删改查的效率。

3.TreeSet排序的两种方式:

3.1.让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法。

3.2.当元素自身不具备比较性时,或者具备比较性不满足需求是,这时就需要让集合自身具备比较性。在集合初始化的时候,就有比较方式。

当两种排序都存在时会以比较集合容器为主。 


0 0
原创粉丝点击