码迷,mamicode.com
首页 > 其他好文 > 详细

Set、Map集合

时间:2016-05-07 11:17:58      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

实现类

      (1)HashSet

        采用的结构是数组加链表结构(哈希表)

          无序:因为存放的位置是根据hashCode来计算的.

          不能重复依据: hashCode   equals 

          hashCode要和equals兼容  为了提高性能

 

           HashSet的存储原理

根据每个对象的哈希码值(调用hashCode()获得)用固定的算法算出它的存储索引,把对象存放在一个叫散列表的相应位置(表元)中:

如果对应的位置没有其它元素,就只需要直接存入。

          如果该位置有元素了,会将新对象跟该位置的所有对象进行比较(调equals()),以查看是否已经存在了:还不存在就存放,已经存在就不存储。

取对象时:

    根据对象的哈希码值计算出它的存储索引,在散列表的相应位置(表元)上的元素间进行少量的比较操作就可以找出它。

             技术分享

代码示例:

package com.qf.day17_1;
/**
 * 重写hashCode和equals来进行比较元素是否相同
 * @author Administrator
 *
 */
public class Employee {
	String name;
	int age;
	String gender;
	String address;
	public Employee() {
		// TODO Auto-generated constructor stub
	}
	public Employee(String name, int age, String gender, String address) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.address = address;
	}
	public void show() {
		System.out.println(name+age+gender+address);
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return name.hashCode()+age;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		Employee e=(Employee)obj;
		boolean b1= name.equals(e.name);
		boolean b2= age==e.age;
		return b1&&b2;
	}
}

package com.qf.day17_1;

import java.util.HashSet;

public class Demo1 {
	public static void main(String[] args) {
		Employee e1 = new Employee("张三", 20, "男", "北京海淀");
		Employee e2 = new Employee("李四",21,"男","北京朝阳");
		Employee e3 = new Employee("王五",22,"男","浙江杭州");
		Employee e4 = new Employee("王五",22,"男","浙江杭州");
		
		HashSet<Employee> employees = new HashSet<Employee>();
		employees.add(e1);
		employees.add(e2);
		employees.add(e3);
		employees.add(e4);
		
		for (Employee employee : employees) {
			employee.show();
		}
	}
}

运行结果:

技术分享


      (2)TreeSet

        采用的结构是红黑自平衡二叉树

        无序:添加顺序和存储顺序不一样 ,但是存储有一定顺序    

        不能重复依据

     Comparable接口

所有可“排序”的类都可以通过实现java.lang.Comparable接口来实现,该接口中的唯一方法:

public int compareTo(Object obj); 该方法如果

返回 0,表示 this ==obj

返回正数,表示 this> obj

返回负数,表示 this< obj

可“排序”的类通过Comparable接口的compareTo方法来确定该类对象的排序方式。

 

Comparator接口

使用Comparable接口定义排序顺序有局限性:实现此接口的类只能按compareTo()定义的这一种方式排序。

如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类)TreeSet有一个构造方法允许给定比较器,它就会根据给定的比较器对元素进行排序.

Comparator接口中的比较方法:

public int compare(Object o1, Object o2); 该方法如果

–      返回0,表示o1 == o2

–      返回正数,表示o1 > o2

返回负数,表示o1 < o2

Comparable与Comparator区别

1> Comparable是用在集合元素对象上,Comparator是实现比较器

2> Comparable实现compareTo方法 Comparator 是实现compare方法

3> 两个方法返回值都是整数,0表示重复,负数 前面比后面晓正数 前面比后面大



Comparable

类实现Comparable接口

public class Person implements Comparable<Person>{
	String name;
	int age;
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public void show() {
			System.out.println(name+age);
	}
	@Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		System.out.println(name+"----------->"+o.name);
		
		int num=age-o.age;
		return num==0?name.compareTo(o.name):num;
		
	}
}


import java.util.TreeSet;

public class Demo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1 = new Person("奥巴马",50);
		Person p2 = new Person("萨达姆",40);
		Person p3 = new Person("本拉登",30);
		Person p4 = new Person("金三胖",20);
		Person p5 = new Person("金三胖",18);
		
		TreeSet<Person> persons = new TreeSet<Person>();
		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
		persons.add(p4);
		persons.add(p5);
		
		for (Person person : persons) {
			person.show();
		}
	}

}
运行结果

技术分享


Comparator

实现比较器

import java.util.Comparator;

public class Mycomparator implements Comparator<Person> {

	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		int num = o1.age-o2.age;
		return num==0?o1.name.compareTo(o2.name):num;
	}

}

public class Demo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1 = new Person("奥巴马",50);
		Person p2 = new Person("萨达姆",40);
		Person p3 = new Person("本拉登",30);
		Person p4 = new Person("金三胖",20);
		Person p5 = new Person("金三胖",18);
		
		TreeSet<Person> persons = new TreeSet<Person>(new Mycomparator());
		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
		persons.add(p4);
		persons.add(p5);
		
		for (Person person : persons) {
			person.show();
		}
	}

}

运行结果

技术分享技术分享


最后附一张集合图


技术分享技术分享

Set、Map集合

标签:

原文地址:http://blog.csdn.net/u010037865/article/details/51328729

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!