------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------
package it.heima.mylog;
/**
* 知识点:集合框架Collection的子接口Set集合
*
* Set集合:元素不可以重复,没有顺序。
* Set接口下的常用子类:HashSet,TreeSet,LinkedHashSet
*
* HashSet集合:
*
* 内部数据结构是哈希表,不同步。
* 如何保证该集合的元素唯一性呢?通过对象的hashCode和equals方法来完成对象的唯一性的。
* 如果对象的hashCode值不同,那么就不需要判断equals方法了,就直接存储到哈希表中。
* 如果对象的hashCode值相同,那么就要再次判断对象的equals方法是否为true。
* 比较对象的equals方法,返回true,视为相同元素,不存。返回false,视为不同元素,进行存储。
*
* 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
* 一般情况,如果定义的类会产生很多对象的话,通常都需要覆盖hashCode,equals方法,
* 建立对对象判断是否相同的依据。
*
* TreeSet集合:
*
* 可以对集合中的元素进行排序,是不同步的。
* 判断元素的唯一方式,就是根据比较方法的返回结果是否为0,是0,就是相同元素,不存。
*
* TreeSet对元素进行排序的方式一:
* 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法。
* Comparable接口属于java.lang包中的,只有一个compareTo方法,比较此对象与指定对象的顺序,
* 如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。)
* 如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序,那该怎么办?让集合自身具备比较功能
*
* TreeSet对元素进行排序的方式二:
* 让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
* 将该类对象作为参数传递给TreeSet集合的构造函数。
* Comparator接口属于java.util包中,有compare和equals两个方法,也就是复写了Object中的equals方法。)
* if ( this.hashCode() == Obj.hashCode() && this.equals(obj) )
* 这样才能确定元素是否唯一性。
*
* 哈希表确定元素是否相同
* 1,判断的是两个元素的哈希值是否相同。若相同,在判断两个对象的内容是否相同(复写equals方法)。
* 2,判断哈希值相同,其实就是判断对象的hashCode的方法。判断内容相同,用的是equals方法。
* 啊,真啰嗦了,得顺溜。。。
* 3,如果哈希值不同,是不需要再判断equals方法了的。
*
* ======================================*/
/*练练手。。。*/
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
class CollSet {
public static void main(String[] args) {
showLinkedHashSet();
showHashSet();
showTreeSet1();
showTreeSet2();
}
private static void showTreeSet2() {
//我想按长度比较排序???要自定义比较器
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() - o2.length() ==0){
return o1.compareTo(o2);
}
return o1.length() - o2.length();
}
});
ts.add("et");
ts.add("te");
ts.add("jjgh");
ts.add("dfghtr");
System.out.println(ts);
}
private static void showTreeSet1() {
//默认按字典顺序排列,不能添加重复元素
TreeSet<String> ts = new TreeSet<String>();
ts.add("3zplan");
ts.add("azplan");
ts.add("1zplan");
ts.add("2zplan");
System.out.println(ts);
}
private static void showHashSet() {
Set<String> hs = new HashSet<String>();
hs.add("zplan1");
hs.add("zplan2");
hs.add("zplan4");
hs.add("zplan2");
System.out.println(hs);
Iterator<String> it = hs.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
/**
* 结论:
* 无序。呵呵,其实是相对有序的。
* 还有,HashSet是不能添加相同的元素的。
*
*/
}
private static void showLinkedHashSet() {
Set<String> link = new LinkedHashSet<String>();
link.add("zplan1");
link.add("zplan3");
link.add("zplan2");
link.add("zplan2");
System.out.println(link);
/**
* 结论:
* LinkedHashSet不可以添加相同的元素,打印的是有序的,FIFO先进先出
* [zplan1, zplan3, zplan2]
*/
}
}
// **********************Person类**********************************************
class Person implements Comparable<Object> {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
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;
}
@Override
// 复写
public String toString() {
return "姓名" + name + ";" + "年龄" + age;
}
@Override
// 复写
public int compareTo(Object obj) {
Person p = (Person) obj;
int temp = this.age - p.age;
return temp == 0 ? this.name.compareTo(p.name) : temp;
}
}
// ****************************************************************************
/* 记不得报了多少次错误多少次警告,一定很多。但也要明白,我也不记得改正了多少次错误,那一定也很多很多。 */
------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------