本文的核心内容:Java中的集合Set。
Set接口:元素无顺序 元素内容不可以重复
实现类HashSet、 LinkedHashSet、TreeSet
一:Set接口遍历的方式
1:迭代器遍历
public static void main(String[] args) {
Set<String> list=new HashSet<>();
list.add("Tom");
list.add("Jack");
list.add("Peter");
list.add("Jane");
list.add("Tom");
print(list);
}
//用泛型封装了类型
public static <T> void print (Collection<T> c)
{
Iterator<T> it=c.iterator();
while(it.hasNext())
{
T t=it.next();
System.out.println(t);
}
}
2:for遍历
public static <T> void print2 (Collection<T> c)
{
for(T t:c)
{
System.out.println(t);
}
}
3:forEach遍历
public static <T> void print3 (Collection<T> c)
{
c.forEach(new Consumer<T>() {
@Override
public void accept(T t) {
System.out.println(t);
}
});
}
二:Set接口元素去重
①HashSet
如果将自定义的类对象存入HashSet需要重写Object类的hasCode()和equals()方法,否则相同元素无法去重。
public static void main(String[] args) {
Set<Student> list=new HashSet<>();
list.add(new Student("Tom",15));
list.add(new Student("Jack",11));
list.add(new Student("Jane",18));
list.add(new Student("Peter",25));
list.add(new Student("Tom",15));
print3(list);
}
class Student
{
String name;
int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
@Override
public String toString(){
return "[Student:name="+this.name+" age="+this.age+"]";
}
@Override
public int hashCode() {
final int prime=31;
int result=1;
result=prime*result+age;
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;
Student other=(Student)obj;
if ( age!=other.age )
return false;
if ( name==null)
{
if (other.name!=null)
return false;
}else if (!name.equals(other.name))
return false;
return true;
}
}
②实现类LinkedHashSet为HashSet的子类, 维护元素添加到Set中的顺序。(如果要使用 LinkedHashSet 的话,也必须正确的覆盖对象的 hashCode 和equals 方法)
③TreeSet集合是Set集合的另一个实现类,它内部采用自平衡的排序二叉树来存储元素。
如果将自定义的类对象存入TreeSet,在构造TreeSet集合时需要传入比较器,去除重复元素。
public static void main(String[] args) {
Comparator<Student> c=new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if(o1.age!=o2.age)
return o1.age-o2.age;
else
return o1.name.compareTo(o2.name);
}
};
Set<Student> list=new TreeSet<>(c);
list.add(new Student("Tom",15));
list.add(new Student("Jack",11));
list.add(new Student("Jane",18));
list.add(new Student("Peter",25));
list.add(new Student("Tom",15));
Iterator it=list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
队列Queue 先进先出
常用方法:
add(); offer();
//添加队列满时,区别是,对于有界队列add()方法会抛出异常,offer()方法会返回一个false值。
romove(); poll();
//移除,当队列为空时,remove()会抛出异常,pill()不会抛异常,返回一个空指针。
elment(); peek();
//获取队头元素,elment();会抛异常 ,peek()不会抛异常,返回一个空指针