黑马程序员——java集合框架——Set接口

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

java集合框架——Set接口

简介:

集合框架:一组专门用来存储其他对象的类(对象容器类)和接口的设计结构,统称为集合框架。而这组类的功能就是实现各种方式的数据存储。
Collection接口: 1、Set接口:存放的元素是无序并且不包含重复元素
      2、List接口:存放的元素是有序并且允许有重复元素
注:    这2种接口中的元素:即对象引用,元素类型都为Object
      这2种接口中的重复:是指两个对象用过equals判断相等
    这2种接口中的有序:是指元素存入的顺序与取出的顺序相同



Set接口:(三种常见实现类)

1、HashSet类:
不保存元素的加入顺序,根据元素的哈希码进行存放的,所以取出时也可以根据哈希码快速找到
判断元素是否重复的方法:hashCode()和equals()
注:(hashCode()的方法返回值是对象存储的物理地址的一个索引)
允许添加null元素

public class HashSetTest {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add("张三");
		hs.add("李四");
		hs.add("王五");
		hs.add("赵六");
		hs.add("孙琦");
		Iterator it = hs.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());

		}

	}

}

结果如图:



可以看出HashSet添加的顺序与迭代显示的结果顺序不一致,也验证了HashSet不保存元素加入顺序的特征。

2、LinkedHashSet类:
根据元素的哈希码进行存放,同时用链表记录元素的加入顺序
注:通过链表来存储对象,一般插入和删除效率较高

import java.util.Set;

public class LinkedHashSet {

	public static void main(String[] args) {
		Set<Student> linkHashSet =  new LinkedHashSet<Student>();
		
		
		Student stu1 = new Student(18,"zhw");
		Student stu2 = new Student(23,"zhxd");
		Student stu3 = new Student(25,"zhh");
		Student stu4 = new Student(25,"zha");
		Student stu5 = new Student(25,"zha");
		linkHashSet.add(stu3);
		linkHashSet.add(stu4);
		linkHashSet.add(stu1);
		//记录HashCode嘛顺序,按照顺序查找出来
		linkHashSet.add(stu2);
		linkHashSet.add(stu5);
		linkHashSet.add(null);
		Iterator it = linkHashSet.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
			
		}
		
	}

}
 

3、TreeSet类:
使用红黑树结构对加入的元素进行排序存放
注: 1、放入TreeSet类中的元素必须是可“排序”的。
    2、对加入的元素,若要实现compareTo()方法,必须实现comparable接口
如果对添加的对象没有实现comparable接口会引发异常:java.lang.ClassCastException
comparable接口强行对实现它的每个类的对象进行整体排序。
实现comparable接口的对象可以用作有序映射表中的键或有序集合中的元素,无序指定比较器



public class TreeSetTest {

	public static void main(String[] args) {
		Set ts = new TreeSet();
		Student stu1 = new Student(18, "zhw");
		Student stu2 = new Student(23, "zhxd");
		Student stu3 = new Student(25, "zhh");
		Student stu4 = new Student(25, "zha");
		ts.add(stu3);
		ts.add(stu4);
		ts.add(stu1);
		ts.add(stu2);
		ts.add(null);
		Iterator it = ts.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());

		}

	}

}

结果如图:



上图出现的结果是因为没有在Student类中实现接口Comparable


如果实现了Comparable接口:

package com.collection.demo;

public class Student implements Comparable {
	private int age;
	private String name;

	public Student(int age, String name) {
		this.age = age;
		this.name = name;
	}

	// 因为需要打印Student类的相关信息,所以要重写toString()方法
	public String toString() {
		return "Student [age=" + age + ", name=" + name + "]";
	}

	public int hashCode() {
		return age * name.hashCode();
	}

	public boolean equals(Object o) {

		Student s = (Student) o;
		return age == s.age && name.equals(s.name);

	}

	// 提供访问属性age的方法
	public int getAge() {
		return age;
	}

	// 提供设置属性age的方法
	public void setAge(int age) {
		this.age = age;
	}

	// 因为要实现comparable接口,所以要重写compareTo(Object o)方法
	// 判断执行compareTo方法的Student对象与传入的对象按排序的条件相比
	// 是大于,小于,还是等于传入的对象
	public int compareTo(Object o) {
		Student s = (Student) o;
		if (s.getAge() < this.getAge())
			return -1;
		else if (s.getAge() == this.getAge())
			return 0;
		else
			return 1;

	}

}

结果如图:





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值