标签:
实现类
(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(); } } }
最后附一张集合图
标签:
原文地址:http://blog.csdn.net/u010037865/article/details/51328729