set的简单使用
// 如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。主要应用在查重方面
public class Collection2{
public static void main(String[] args) {
Set<String> set = new HashSet<>();
System.out.println(set.add("abc")); // true
System.out.println(set.add("xyz")); // true
System.out.println(set.add("xyz")); // false 不能添加相同的字符串
System.out.println(set.contains("xyz")); // true
System.out.println(set.contains("XYZ")); // false 区分大小写
System.out.println(set.remove("hello")); // false 不能移除不存在的数据
System.out.println(set.size()); // 2 计算长度
}
}
// 最常用的set实现类是HashSet,实际上,HashSet仅仅是对HashMap的一个简单封装,
// HashSet是无序的,因为它实现了Set接口,并没有实现SortedSet接口;
// TreeSet是有序的,因为它实现了SortedSet接口
Queue的使用
// 队列是常用的数据结构之一,遵循的规则是:“先进先出”
public class Collection2{
public static void main(String[] args) {
Queue<String> q = new LinkedList<>();
// 添加3个元素到队列
q.offer("apple");
q.offer("shuai");
q.offer("xiaoshuai");
// 从队列取出元素
/*
* .offer() 向队列中添加数据,不要添加null进入数据
* .poll() 取出元素并且从队列中删除,如果取不到数据则返回null
* .peek() 取出元素但不从队列中删除,如果连续使用则获取的是同一个数据
* .size() 查看当前队列的长度
* */
System.out.println(q.poll()); // apple
System.out.println(q.poll()); // shuai
System.out.println(q.peek()); // xiaoshuai
System.out.println(q.size()); // 返回当前队列的长度
System.out.println(q.poll()); // 队列中取不到数据返回null
}
}
PriorityQueue的使用
Queue<String> q = new PriorityQueue<>();
// 默认是按照字符串进行比较,小的先出队列
// 模拟VIP用户可以优先办理业务
// 需要我们自定义Comparable接口
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class Collection2{
public static void main(String[] args) {
Queue<User> q = new PriorityQueue<>(new UserComparator());
q.offer(new User("Bob","A",1));
q.offer(new User("Alice","A",2));
q.offer(new User("xiaoshuai","A",10));
q.offer(new User("shuai","V",1));
System.out.println(q.poll()); // shuai/V1
System.out.println(q.poll()); // Bob/A1
System.out.println(q.poll()); // Alice/A2
System.out.println(q.poll()); // null
System.out.println(q.poll()); // null
}
}
class UserComparator implements Comparator<User>{
public int compare(User u1, User u2){
if (u1.number.charAt(0) == u2.number.charAt(0)){
// 如果两人的号都是A开头或者都是V开头,比较号的大小
return u1.number1.compareTo(u2.number1);
}
if (u1.number.charAt(0) == 'V'){
// u1的号码是V开头,优先级高
return -1;
}else {
return 1;
}
}
}
class User{
public final String name;
public final String number;
public final Integer number1;
public User(String name , String number , Integer number1){
this.name = name;
this.number = number;
this.number1 = number1;
}
public String toString(){
return name + "/" + number + number1;
}
}
Deque(双端队列的使用)
// 两端都能进或者出数据,我们称之为双端队列(Deque)
// Deque接口实际上扩展自Queue;
// 声明一个双端队列
Deque<String> deque = new LinkedList<>();
deque.offerLast("A"); // 从队尾插入数据
deque.offerFirst("A"); // 从队首插入数据
System.out.println(deque.pollLast()); // 从队尾删除数据
System.out.println(deque.pollFirst()); // 从队首删除数据
// 如果队列中没有数据,返回null
使用Stack(栈)
// 栈是常用的数据结构之一,遵循的规则是:“先进后出”
/*
Stack只有入栈和出栈的操作:
把元素压栈:push(E);
把栈顶的元素“弹出”:pop();
取栈顶元素但不弹出:peek()。
注意:我们用Deque可以实现Stack的功能;当Deque作为Stack使用时,我们调用上面方法去实现
为什么Java的集合类没有单独的Stack接口呢?因为有个遗留类名字就叫Stack,出于兼容性考虑,所以没办法创建Stack接口,只能用Deque接口来“模拟”一个Stack了。
*/
// Stack的在计算机中的作用非常广泛