Set
1.1 特点(无序,唯一)
- 无序: 添加的数据顺序与所输出的顺序不一致;
System.out.println("------------无序------------");
//set集合
Set<String> st = new HashSet<String>();
//添加
st.add("aa");
st.add("bb");
st.add("cc");
for (String str : st) {
System.out.println(str);
//运行结果
------------无序------------
aa
bb
cc
- 唯一: 重复数据被过滤;
System.out.println("------------唯一(是数据被过滤掉了)------------");
st.add("aa");
for (String str : st) {
System.out.println(str);
}
//运行结果
------------唯一(是数据被过滤掉了)------------
aa
bb
cc
- 遍历一个对象;
System.out.println("-----------对象-----------");
//创建一个对象集合
Set<Student> stu = new HashSet<Student>();
stu.add(new Student(1,"liming","boy"));
stu.add(new Student(2,"zhangsai","girl"));
stu.add(new Student(3,"lisi","girl"));
stu.add(new Student(3,"lisi","boy"));
for (Student ss : stu) {
System.out.println(ss);
}
//其中创建实体类代码
public class Student implements Serializable{
private int sid;
private String sname;
private String sex;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int sid, String sname, String sex) {
super();
this.sid = sid;
this.sname = sname;
this.sex = sex;
}
public Student() {
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", sex=" + sex + "]";
}
public int hashCode() {
final int prime = 31;
int result = 1;
//比较时把其他两个元素注释掉不然没有效果
//result = prime * result + ((sex == null) ? 0 : sex.hashCode());
//result = prime * result + sid;
result = prime * result + ((sname == null) ? 0 : sname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
//判断当前对象与obj对象是否相同
if (this == obj)
return true;
//判断obj对象是否为空
if (obj == null)
return false;
//判断当前对象类型与obj对象类型是否一致
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if(this.getSname().equals(other.getSname()))
return true;
/* if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
if (sid != other.sid)
return false;
if (sname == null) {
if (other.sname != null)
return false;
} else if (!sname.equals(other.sname))
return false;
return true;
}*/
}
//运行结果
-----------对象没有比较时-----------
Student [sid=1, sname=liming, sex=boy]
Student [sid=3, sname=lisi, sex=boy]
Student [sid=3, sname=lisi, sex=boy]
Student [sid=2, sname=zhangsai, sex=girl]
-----------对象比较名字时(会去掉一个重复的)-----------
Student [sid=1, sname=liming, sex=boy]
Student [sid=3, sname=lisi, sex=boy]
Student [sid=2, sname=zhangsai, sex=girl]
-----------对象比较名字时(看是去掉哪一个改变其中一个性别)-----------
Student [sid=1, sname=liming, sex=boy]
Student [sid=3, sname=lisi, sex=girl]
Student [sid=2, sname=zhangsai, sex=girl]
1.2 遍历(①foreach ②迭代器,没有for)
① foreach
System.out.println("--------------foreach遍历---------------");
for (String ss : st) {
System.out.println(ss);
}
//运行结果
--------------foreach遍历---------------
aa
bb
cc
② 迭代器
System.out.println("--------------Iterator遍历---------------");
Iterator it = st.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//运行结果
--------------Iterator遍历---------------
aa
bb
cc
1.3 常用实现类
HashSet
TreeSet
①.定义:根据某种(规则)对里面的元素进行排序
②自然比较接口:java.lang.Comparable
System.out.println("---------------自然比较接口--------------");
Set<Student> su = new TreeSet<Student>(new NameComparator());
su.add(new Student(1,"lm","boy"));
su.add(new Student(2,"kd","girl"));
su.add(new Student(3,"as","girl"));
for (Student s : su) {
System.out.println(s);
}
//在实体类中加入代码 要实现序列化
public class Student implements Serializable{}
//排序
public int compareTo(Object o) {
Student stu = (Student) o;
//升序
return this.sid-stu.getSid();
//降序
return -(this.sid-stu.getSid());
}
//运行结果
---------------自然比较接口--------------
Student [sid=1, sname=cs, sex=girl]
Student [sid=2, sname=fs, sex=boy]
Student [sid=3, sname=as, sex=girl]
③比较器:java.util.Comparator
System.out.println("---------------比较器---------------");
Set<Student> su = new TreeSet<Student>(new SComparator());
su.add(new Student(3,"as","girl"));
su.add(new Student(2,"fs","boy"));
su.add(new Student(1,"cs","girl"));
for (Student s : su) {
System.out.println(s);
}
//创建一个类
import java.util.Comparator;
public class NameComparator implements Comparator<Student> {
//自然比较接口:java.util.Comparator
public int compare(Student o1, Student o2) {
//升序
return o1.getSname().hashCode()-o2.getSname().hashCode() ;
}
}
//运行结果
---------------比较器---------------
Student [sid=1, sname=cs, sex=girl]
Student [sid=2, sname=fs, sex=boy]
Student [sid=3, sname=as, sex=girl]
2.LinkedHashSet
①:元素是有顺序的
②:元素是不重复的
③:底层数据结果按照链表的结构存储的Linked