黑马程序员-集合框架的Set集合

来源:互联网 发布:ben simmons数据 编辑:程序博客网 时间:2024/04/29 23:29

------- <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>、期待与您交流! ----------


0 0
原创粉丝点击