1. Set
1.1 特点:无序、对象不能重复
1.2 遍历
1.2.1 foreach
1.2.2 迭代器
1.3 常用实现类
HashSet
TreeSet:根据某种(规则)对里面的元素进行排序
自然比较接口: java.lang.Comparable
比较器: java.util.Comparator
String以AscII码进行比较,返回差值
LinkedHashSet:
1)元素是有顺序的
2)元素是不重复的
3)底层数据结构是按照链表的结构存储的 Linked
HashSet集合对象去重复方法
因为地址不同 所以我们要重写equals和hashCode方法
实体类如下:
package com.zhouzhuolin.collection.entity;
import java.io.Serializable;
// implements Comparable<Person>
public class Person{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Person() {
super();
}
/**
* 重写hashCode和equals 右键自动生成就行
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
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;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
测试类
package com.zking.collection.test;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import com.zking.collection.entity.Person;
public class SetDemo {
public static void main(String[] args) {
Set<Person> hs=new HashSet<Person>();
hs.add(new Person(4,"张三"));
hs.add(new Person(2,"小六"));
hs.add(new Person(18,"ww"));
hs.add(new Person(19,"ww"));
hs.add(new Person(1,"zs"));
hs.add(new Person(8,"ls"));
for (Person p : hs) {
System.out.println(p);
}
}
}
测试结果
TreeSet:根据某种(规则)对里面的元素进行排序
注意事项:当两种排序都存在时,比较器排序优先级更高
自然比较接口: java.lang.Comparable
比较器: java.util.Comparator
String以AscII码进行比较,返回差值
Comparable接口实现排序
实体类
package com.zhouzhuolin.collection.entity;
import java.io.Serializable;
// implements Comparable<Person>
public class Person implements Comparable<Person>{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Person() {
super();
}
//根据id排序
@Override
public int compareTo(Person o) {
if (this.id>o.getId())
return 1;
else {
if (this.id==o.getId())
return 0;
else
return -1;
}
// 自级比较
// 1 比较者大于被比较者
// 0 比较者等于被比较者
// -1 比较然者小于被比较者
// 正序
// return this.id - o.getId();
// 倒序
// return -(this.id - o.getId());
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
测试类
package com.zhouzhuolin.collection.test;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import com.zking.collection.entity.Person;
public class SetDemo {
public static void main(String[] args) {
Set<Person> hs=new TreeSet<Person>();
hs.add(new Person(4,"张三"));
hs.add(new Person(2,"小六"));
hs.add(new Person(18,"ww"));
hs.add(new Person(1,"zs"));
hs.add(new Person(8,"ls"));
for (Person p : hs) {
System.out.println(p);
}
}
}
测试结果
Comparator接口实现排序
测试类
package com.zhouzhuolin.collection.test;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import com.zking.collection.entity.Person;
public class SetDemo {
public static void main(String[] args) {
Set<Person> hs=new TreeSet<Person>(new NameComparable());
hs.add(new Person(4,"张三"));
hs.add(new Person(2,"小六"));
hs.add(new Person(18,"ww"));
hs.add(new Person(17,"ww"));
hs.add(new Person(1,"zs"));
hs.add(new Person(8,"ls"));
for (Person p : hs) {
System.out.println(p);
}
}
}
//实体类如上一样
class NameComparable implements Comparator<Person>{
@Override
public int compare(Person a, Person b) {
// TODO Auto-generated method stub
//根据传过来的对象值名字来比较
int abc=a.getName().compareTo(b.getName());
//假如名字相同 在用id比较
if (abc==0)
return a.getId() - b.getId();
return a.getName().compareTo(b.getName());
}
}
测试结果