一 Set類集合
Set集合中的對象不按特定的方式排序,只是簡單的將對象加入到集合中,但是Set集合不能包括重複對象
Set接口繼承了Collection接口,因此也包含Collection接口的所有方法
1 Hashset集合
HashSet擴展自AbstractSet並且實現Set接口。
boolean
add(E e)
如果此set中尚未包含指定元素,則添加指定元素。
void
clear( )
從此set中移除所有元素。
object
clone( )
返回此Hashset實例的淺表副本:並沒有複製這些元素本身。
boolean
contains (object 0)
如果此set包含指定元素,則返回true。
isEmpty( )
如果此set不包含任何元素,則返回true。
iterator( )
返回對此set中元素進行迭代的迭代器。
remove (bject 0)
如果指定元素存在於此set中,則將其移除。
int
size( )
返回此set中的元素的數量(set 的容量)。
2 HashSet集合特點
public class myjavademo {
public static void main(String []args) {
HashSet<Integer> hs = new HashSet<>();
hs.add(1);
hs.add(2);
hs.add(3);
System.out.println(hs.add(6));
System.out.println(hs.add(6)); //檢驗HashSet是否允許重複元素加入
System.out.println(hs); //檢驗HashSet是否有序
}
}
3 放入自定義類型數據出現的問題
class Student{
private String name;
private int id;
public Student(){}
public Student(String name, int id)
{
super();
this.name = name;
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
@Override
public String toString()
{
return "Student [name=" + name + ", id=" + id + "]";
}
}
class Test{
public static void main(String []args) {
HashSet<Student> hs = new HashSet<>();
hs.add(new Student("zhangsan",1));
hs.add(new Student("lisi",2));
hs.add(new Student("wangwu",3));
System.out.println(hs.add(new Student("haha",4)));
System.out.println(hs.add(new Student("haha",4)));
System.out.println(hs);
}
}
結果
true
true
[Student [name=yiyi, id=1], Student [name=wawa, id=4], Student [name=wawa, id=4], Student [name=lili, id=3], Student [name=feifei, id=2]]
4 LinkedHashSet集合
LinkedHashSet繼承自HashSet
數據結構 有兩個 鏈表和哈希表
鏈表保證有序 哈希表保證元素唯一
5 Treeset集合
Itreable 接口 實現該接口可以使用增強for循環
Collection 描述所有集合共性的接口 |
Set接口 無序,不可以重複的集合
HashSet 線程不安全,存取速度快。底層是以hash表實現的。
TreeSet 紅-黑樹的數據結構,默認對元素進行自然排序(String)。
如果在比較的時候兩個對象返回值爲0,那麼元素重複。
案例:使用TreeSet集合存儲字符串元素,並遍歷
public class myjavademo {
public static void main(String[] args)
{ TreeSet ts = new TreeSet();
ts.add("ccc");
ts.add("aaa");
ts.add("ddd");
ts.add("bbb");
System.out.println(ts); // [aaa, bbb, ccc, ddd]
}
}
6 Treeset的排序方式
方式一:元素自身具備比較性
元素自身具備比較性,需要元素實現Comparable接口,重寫compareTo方法,也就是讓元素自身具備比較性,這種方式叫做元素的自然排序也叫做默認排序。
方式二:容器具備比較性
當元素自身不具備比較性,或者自身具備的比較性不是所需要的。那麼此時可以讓容器自身具備。需要定義一個類實現接口Comparator,重寫compare方法,並將該接口的子類實例對象作爲參數傳遞給TreeMap集合的構造方法。
注意:當Comparable比較方式和Comparator比較方式同時存在時,以Comparator的比較方式爲主;
注意:在重寫compareTo或者compare方法時,必須要明確比較的主要條件相等時要比較次要條件。
我們來看一下方式一的案例
public class myjavademo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("aa", 20, "男"));
ts.add(new Person("bb", 18, "女"));
ts.add(new Person("cc", 17, "男"));
ts.add(new Person("dd", 17, "女"));
ts.add(new Person("dd", 15, "女"));
ts.add(new Person("dd", 15, "女"));
System.out.println(ts);
System.out.println(ts.size()); // 5
}
}
class Person implements Comparable {
private String name;
private int age;
private String gender;
public Person() {
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public int hashCode() {
return name.hashCode() + age * 37;
}
public boolean equals(Object obj) {
System.err.println(this + "equals :" + obj);
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ "]"; }
@Override
public int compareTo(Object obj) {
Person p = (Person) obj;
System.out.println(this+" compareTo:"+p);
if (this.age > p.age) {
return 1;
}
if (this.age < p.age) {
return -1;
}
return this.name.compareTo(p.name);
}
}
public class myjavademo {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("aa", 20, "男"));
ts.add(new Person("bb", 18, "女"));
ts.add(new Person("cc", 17, "男"));
ts.add(new Person("dd", 17, "女"));
ts.add(new Person("dd", 15, "女"));
ts.add(new Person("dd", 15, "女"));
System.out.println(ts);
System.out.println(ts.size()); // 5
}
}
class Person implements Comparable {
private String name;
private int age;
private String gender;
public Person() {
}
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public int hashCode() {
return name.hashCode() + age * 37;
}
public boolean equals(Object obj) {
System.err.println(this + "equals :" + obj);
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ "]"; }
@Override
public int compareTo(Object obj) {
Person p = (Person) obj;
System.out.println(this+" compareTo:"+p);
if (this.age > p.age) {
return 1;
}
if (this.age < p.age) {
return -1;
}
return this.name.compareTo(p.name);
}
}
我們再來看一下方式二的案例
public class myjavademo {
public static void main(String[] args) {
TreeSet ts = new TreeSet((Collection) new MyComparator());
ts.add(new Book("語文", 100));
ts.add(new Book("數學", 75));
ts.add(new Book("英語", 50));
ts.add(new Book("歷史", 35));
ts.add(new Book("語文", 100));
ts.add(new Book("地理", 100));
System.out.println(ts);
}
}
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
Book b1 = (Book) o1;
Book b2 = (Book) o2;
System.out.println(b1+" comparator "+b2);
if (b1.getPrice() > b2.getPrice()) {
return 1;
}
if (b1.getPrice() < b2.getPrice()) {
return -1;
}
return b1.getName().compareTo(b2.getName());
}
}
class Book {
private String name;
private double price;
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Book(String name, double price) {
this.name = name; this.price = price;
}
@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + "]";
}
}
7 LinkedHashSet
會保存插入的順序。
看到array,就要想到角標。
看到link,就要想到first,last。
看到hash,就要想到hashCode,equals.
看到tree,就要想到兩個接口。Comparable,Comparator。