package com.btp.t4;
import java.util.HashSet;
import java.util.Set;
import java.util.*;
import org.junit.Test;
/*
* Collection接口
* |--------List接口:存储有序的,可以重复的元素
* |--------ArrayList(主要的实现类)
* |--------LinkedList(适合频繁的插入,删除操作)
* |--------Vector(古老的,线程安全的,但效率要低于ArrayList)
* |--------Set接口:存储无序的,不可重复的元素.Set中常用的方法都是Collection下定义的
* |--------HashSet(主要实现类)
* |--------LinkedHashSet
* |--------TreeSet
*
*
* Set:存储的元素是无序的,不可重复的
* 1.无序性:无序性 != 随机性。真正的无序性指的是元素在底层存储的位置是无序的
* 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去
*
* 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。进而保证Set元素的不可重复性
*
* Set中的元素存储方法:使用了哈希算法
* 当向Set中添加对象时,首先调用此对象中所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在
* Set中的存储位置。若此位置之前没有存储对象,则这个对象直接存储到此位置,若此位置已有对象存储,再通过equals
* 方法比较这两个对象是否相同。如果相同,则后一个对象就不能再添加进来。一般不会出现hashCode相同而equals返回false
* >要求:hashCode方法和equals方法一致
*
* LinkedHashSet:
* 1.LinkedHashSet:使用链表维护了一个添加进集合的顺序,导致当我们遍历LinkedHashSet集合元素时,是按照添加进去的顺序遍历的
* 2.LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能
*
* TreeSet
* 1.向TerrSet中添加的元素必须是同一类的
* 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历(因为它们都重写了Comparable接口中的方法)
* 3.当自定义类没有实现Comparable接口时,当向TreeSet集合中添加自定义类的对象时,报错
* 4.当向TreeSet中添加自定义类的对象时,有两种排序方法①自然排序②定制排序
* 5.自然排序:要求自定义类实现java.lang.Comparable接口并重写其中的comparaTo(Object o)方法.在此方法中,指明按照自定义类的哪个属性进行排序
* 6.向TreeSet中添加对象的时候,首先按照comparaTo()方法进行比较,一旦返回0,虽然仅是两个对象的此属性值相同,但是程序会认为这两个对象是相同的,
* 进而后一个对象不能添加进来
* >comparaTo(),hashCode()和equals()方法保持一致
*/
public class TestSet {
@Test
public void testHashSet(){
Set set=new HashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("BB"));
set.add(null);
Person1 p1=new Person1("GG",12);
Person1 p2=new Person1("GG",12);
set.add(p1);
set.add(p2);//如果没有重写Person1的equals方法和HashCode方法,那么就算Person1的两个对象属性都相同,也是可以都加到set中
//所以还是需要同时重写加进去的对象的equals方法和HashCode方法,才能实现不可重复性
System.out.println(set.size());
System.out.println(set);//无序:但是不是随机的
}
@Test
public void LinkedHashSet(){
Set set=new LinkedHashSet();
set.add(new String("AA"));
set.add(123);
set.add(456);
set.add(new String("BB"));
set.add(null);
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
@Test
public void TreeSet1(){
Set set=new TreeSet();
set.add(new String("AA"));
set.add(new String("BB"));
set.add("JJ");
set.add("JJ");
set.add("MM");
for(Object str:set)
{
System.out.println(str);
}
}
@Test
public void TreeSet2(){
Set set=new TreeSet();
set.add(new Person1("MM",16));
set.add(new Person1("AA",13));
set.add(new Person1("CC",21));
set.add(new Person1("ZZ",199));
set.add(new Person1("BB",99));
set.add(new Person1("XX",99));
for(Object str:set)
{
System.out.println(str);
}
}
@Test
public void TreeSet3(){
//定制排序1
//1.创建一个实现了Comparator接口的类对象
Comparator com=new Comparator(){
//向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个对象排序的
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1=(Customer)o1;
Customer c2=(Customer)o2;
int i=c1.getId().compareTo(c2.getId());
if(i==0){
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
};
//将此对象作为形参传递给TreeSet的构造器中
TreeSet set=new TreeSet(com);
//向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
set.add(new Customer("AA",1003));
set.add(new Customer("BB",1002));
set.add(new Customer("GG",1004));
set.add(new Customer("CC",1001));
set.add(new Customer("DD",1001));
for(Object str:set){
System.out.println(str);
}
}
@Test
public void TreeSet4(){
//定制排序2
TreeSet set=new TreeSet(new Comparator(){
public int compare(Object o1, Object o2) {
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1=(Customer)o1;
Customer c2=(Customer)o2;
int i=c1.getId().compareTo(c2.getId());
if(i==0){
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
});
//向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
set.add(new Customer("AA",1003));
set.add(new Customer("BB",1002));
set.add(new Customer("GG",1004));
set.add(new Customer("CC",1001));
set.add(new Customer("DD",1001));
for(Object str:set){
System.out.println(str);
}
}
}
class Customer{
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Customer(String name,Integer id)
{
super();
this.name=name;
this.id=id;
}
public Customer()
{
super();
}
@Override
public String toString() {
return "Customer [name=" + name + ", id=" + id + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Customer other = (Customer) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
class Person1 implements Comparable{
String name;
Integer 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;
}
public Person1(String name,int age) {
super();
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Person1 [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person1 other = (Person1) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//当向TreeSet中添加Person1类对象时,依据此方法,确定按照哪个属性排列
@Override
public int compareTo(Object o) {
if(o instanceof Person1){
Person1 p=(Person1)o;
int i=this.age.compareTo(p.age);
if(i==0){
return this.name.compareTo(p.name);
}else{
return i;
}
}
return 0;
}
}