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的在计算机中的作用非常广泛