续集!!!
文章目录
-
1、Set接口
-
2、LinkedList实现堆栈 Stack功能
-
3、TreeSet类
一、Set接口
集合体系结构图:
1、set接口是Collection接口的子接口。
2、是HashSet类和SortedSet接口的父接口,能继承他的属性和方法。
3、没有直接依赖关系,但是能使用Interator迭代器,因为他的父接口依赖于Iterator迭代器。
4、特点:
4.1 无序:元素添加的顺序与输出的顺序不一致。
4.2 不允许添加重复元素。
Set<String> set=new HashSet<>();
set.add("zs");
set.add("ls");
set.add("ww");
set.add("zs");
set.forEach(System.out::println);
5、遍历方式(2种):无序无下标
5.1 foreach
for (Student student : set) {
System.out.println(student);
}
5.2 迭代器
//2、获取迭代器
Iterator<Student> it = set.iterator();
//循环遍历
while(it.hasNext()) {
System.out.println(it.next());
}
6、问:不允许添加重复元素之请问元素是被覆盖了还是被过滤了???————被过滤了
6.1 首先比较需要用对象来存储
Set<Student> set=new HashSet<>();
set.add(new Student(1, "zs", 100f));
set.add(new Student(2, "ls", 50f));
set.add(new Student(3, "ww", 40f));
set.add(new Student(1, "zs", 120f));
Student stu=new Student();
stu.equals(null);
//打印
set.forEach(System.out::println);
6.2 建立实体类Student,添加序列化接口Serializable
public class Student implements Serializable{
private Integer sid;
private String sname;
private Float score;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Float getScore() {
return score;
}
public void setScore(Float score) {
this.score = score;
}
public Student() {
super();
}
public Student(Integer sid, String sname, Float score) {
super();
this.sid = sid;
this.sname = sname;
this.score = score;
}
}
6.3 a、默认使用equals比较,Object类型是引用类型,默认比较的是内存地址;选比较hashcode的值是否相同,在比较equals;
b、重写hashcode和equals方法,先比较hashcode值是否相同;再比较equals
c、 如果hashcode方法触发不相同,将会立马返回结果
d、hashcode值相同,则比较equals
e、hashcode值不相同,则不比较equals
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
// result = prime * result + ((score == null) ? 0 : score.hashCode());
result = prime * result + ((sid == null) ? 0 : sid.hashCode());
result = prime * result + ((sname == null) ? 0 : sname.hashCode());
return result;
}
//重写equals方法
@Override
public boolean equals(Object obj) {
//true代表已存在不允许添加;false代表不存在允许添加
//当前对象是否与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.getSid()==other.getSid()) {
return true;
}
return true;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]";
}
二、TreeSet类(Comparato和Comparable)
1、以某种特定的规则对集合中的元素进行排序(升序和降序)
2、用Set接口实例化实体类Student——实现了排序(字母)
Set<String> set = new TreeSet<>();
set.add("zs");
set.add("ls");
set.add("ww");
set.forEach(System.out::println);
实现结果:
3、用对象来比较;ps:ClassCastException类型转换异常(报错)
Set<Student> set = new TreeSet<>();
set.add(new Student(1, "zs", 100f));
set.add(new Student(2, "ls", 510f));
set.add(new Student(3, "ww", 140f));
ps:String能实现排序,但是这里却不可以;
because:String类型里实现了一个Comparable接口
Comparable接口叫做自然比较接口,默认实现排序,能默认对数据进行排序
Comparable有两个包:
a、java.lang.Comparable:自然比较接口
b、java.util.Comparator:比较器(推荐使用)
1、在实体类继承Comparable<Student>接口生成compareTo方法
@Override
public int compareTo(Student o) {
/**
* 比较者大于被比较者返回1
* 比较者等于被比较者返回0
* 比较者小于被比较者返回-1
*/
/*效果一样
* if(this.getSid()>o.getSid()) {
return 1;
}else if(this.getSid()==o.getSid()){
return 0;
}else {
return -1;
}*/
// return this.getSid()-o.getSid();//升序
return -(this.getSid()-o.getSid());//降序
// return this.getSname().hashCode()-o.getSname()
}
2、还可以使用有参的Comparator<Student>接口,只需要在TreeSet那里new NameComparator()
Set<Student> set = new TreeSet<>(new NameComparator());
set.add(new Student(1, "zs", 100f));
set.add(new Student(2, "ls", 510f));
set.add(new Student(3, "ww", 140f));
public class NameComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o1.getSid()-o2.getSid();
}
}
三、LinkedHashSet实现堆栈 Stack功能
package com.zking.collection02.util;
import java.util.LinkedList;
/**
* 堆栈
* @author zjjt
*
*/
public class MyStack {
/**
* 目标:使用LinkedList实现堆栈功能
* 特点:堆栈先进后出
*/
//LinkedList集合容器
private LinkedList lst=new LinkedList();
/**
* 压栈
* @param obj
*/
public void push(Object obj) {
lst.getFirst();//往第一个添加东西
}
/**
* 出栈
* @return
*/
public Object pop() {
Object first = lst.getFirst();
lst.removeFirst();//删除第一个
return first;
}
/**
* 计算容量的大小
* @return
*/
public int size() {
return lst.size();
}
public static void main(String[] args) {
//初始化
MyStack stack=new MyStack();
//压栈
stack.push("a");//第一 下标为4
stack.push("b");//第二 下标为3
stack.push("c");//第三 下标为2
stack.push("d");//第四 下标为1
stack.push("e");//第五 下标为0
while(stack.size()!=0) {
Object val= stack.pop();
System.out.println("结果:"+val);
}
}
}
总结
分享结束!!!