您的位置:首页 > 职场人生

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

2014-04-18 13:21 405 查看
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());//3
System.out.println(hs.isEmpty());//false
System.out.println(hs.contains("Dog"));//true
hs.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());//获取集合长度:4

System.out.println(ts.first());//获取集合中第一个元素:25
System.out.println(ts.last());//获取最后一个元素:50
System.out.println(ts.subSet(10, 30));//获取某个范围集合中的元素:25
System.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.当元素自身不具备比较性时,或者具备比较性不满足需求是,这时就需要让集合自身具备比较性。在集合初始化的时候,就有比较方式。

当两种排序都存在时会以比较集合容器为主。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: