标签:
实现类
(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