黑马程序员——JAVA笔记——集合框架2——Set

原创 2015年07月07日 23:37:15

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


|--Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复,该集合中没有索引。
|--HashSet:底层数据结构是哈希表。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会调用equals判断是否为true。
如果元素的HashCode值不同,不会调用equals。
注意,对于判断元素是否存在(contains),以及删除(remove)等操作,依赖的方法是元素的hashCode和equals方法。
|--TreeSet:

例:往HashSet集合中存入自定义对象,姓名和年龄相同为同一个人,重复元素。

class Demo
{
	public static void main(String[] args)
	{
		HashSet hs=new HashSet();
		hs.add(new Person("a1",11));
		hs.add(new Person("a2",12));
		hs.add(new Person("a3",13));
//		hs.add(new Person("a2",12));

//		System.out.println("contains:"+hs.contains(new Person("a1",11)));
		
		System.out.println("remove:"+hs.remove(new Person("a3",13)));
		
		Iterator it=hs.iterator();
		
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			System.out.println(p.getName()+"--"+p.getAge());
		}
	}
}

class Person
{
	private String name;
	private int age;

	public int hashCode()
	{
		System.out.println(name+"....hashCode");
		return name.hashCode()+age;//*39
	}
	
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Person))
			return false;
		Person p=(Person)obj;
		System.out.println(this.name+"..equals.."+p.name);
		return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
	}
	
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	public int getAge() 
	{
		return age;
	}
	
	public void setAge(int age) 
	{
		this.age = age;
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(String name)
	{
		this.name=name;
	}
	
}


|--TreeSet: 可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法return 0。

TreeSet排序的第一种方式:让元素自身具备比较性,
元素需要实现Comparable借口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫默认顺序。

TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。


例(第一种方式):往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
记住,排序时,当主要条件相同时,一定要判断次要条件。

class Demo
{
	public static void main(String[] args)
	{
		TreeSet ts=new TreeSet();
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));

		Iterator it=ts.iterator();
		while(it.hasNext())
		{
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}

	}
}

class Student implements Comparable//该接口强制让学生具备比较性
{
	private String name;
	private int age;
	
	public int compareTo(Object obj)
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student)obj;
		
		System.out.println(this.name+"..compareto.."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
	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;
	}
}

当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两重排序都存在时,以比较器为主。

例(第二种方式):定义一个类,实现Comparator借口,覆盖compare方法。以return 0判断元素是否相同。

class Demo
{
	public static void main(String[] args)
	{
		TreeSet ts=new TreeSet(new MyCompare());
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi007",29));

		Iterator it=ts.iterator();
		while(it.hasNext())
		{
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}

	}
}

class MyCompare implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		
		int num = s1.getName().compareTo(s2.getName());
		if(num==0)
		{
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		}
		return num;
	}
}

class Student implements Comparable//该接口强制让学生具备比较性
{
	private String name;
	private int age;
	
	public int compareTo(Object obj)
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student)obj;
		
//		System.out.println(this.name+"..compareto.."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
	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;
	}
}


黑马程序员学习笔记 Java的三大框架

如果做javaweb开发,spring是一定要学的,现在主流还是ssh,就是strurs+hibernate+spring,其中hibernate是持久层,用来持久化数据库操作的,如果不喜欢可以学点别...
  • Mr_April
  • Mr_April
  • 2015年07月03日 17:12
  • 1530

黑马程序员_我的Linux基础整理笔记

Linux Linux文件目录和分区 文件目录: /:根目录 /root:存放root用户的相关文件 /home:存放普通用户的相关文件 /bin:存放普通用户的可执行命令 /sbin:...
  • zhengzhongjie1990
  • zhengzhongjie1990
  • 2014年07月05日 17:08
  • 1510

黑马程序员前端与移动开发学院2.0课程震撼来袭!

随着移动互联网深入发展,大前端时代的前端开发工程师在公司中的地位逐渐上升。前端工程师也摆脱了只是写写HTML标签、CSS样式、写写简单的JS效果的时代。大前端时代的前端工程师要求既能掌握基本的设计图的...
  • itcast_cn
  • itcast_cn
  • 2016年11月04日 11:15
  • 1468

黑马程序员 java学习笔记——集合框架2

Map集合 Map:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。...
  • PleaseCallMeWisely
  • PleaseCallMeWisely
  • 2014年08月01日 22:02
  • 218

黑马程序员——java基础拾遗之集合框架(一) List 和 Set

集合类:方便对多个对象进行操作,存储等。 和数组的区别 数组的长度固定,集合的长度可变,数组可以存储基本数据类型,集合只能存对象 数组存内容的类型必须相同,集合类可以存储不同类型的对象 ...
  • bbdeyouxang
  • bbdeyouxang
  • 2014年08月28日 16:45
  • 364

黑马程序员——Java集合框架—Set

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • guoying252166655
  • guoying252166655
  • 2014年09月02日 21:54
  • 426

黑马程序员——JAVA基础------集合框架(二)----Set接口

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——一、Set接口1 、 Set 接口public interface Set extends Collection一 ...
  • qq_28712437
  • qq_28712437
  • 2015年07月20日 14:48
  • 193

黑马程序员_java集合框架——Set

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流!  ---------------------- Set:...
  • zhangyubao521
  • zhangyubao521
  • 2013年06月12日 12:06
  • 286

黑马程序员——Java基础--集合框架(2)

------- android培训、java培训、期待与您交流! ---------- 一  Set接口 定义一个Person类: public class Person impleme...
  • qq_28621519
  • qq_28621519
  • 2015年08月16日 22:24
  • 158

黑马程序员java学习笔记——集合框架

集合框架     概述     面向对象语言对事物的描述都是以对象的形式体现的,为了方便对多个对象的操作,就对对象进行存储,集合就是存处对象最常用的一种方式,数据多了用对象存,对象多了就用集合存。...
  • tianxiang865468097
  • tianxiang865468097
  • 2015年06月07日 09:42
  • 286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——JAVA笔记——集合框架2——Set
举报原因:
原因补充:

(最多只允许输入30个字)