set的简单使用

  1. // 如果我们只需要存储不重复的key,并不需要存储映射的value,那么就可以使用Set。主要应用在查重方面
  2. public class Collection2{
  3. public static void main(String[] args) {
  4. Set<String> set = new HashSet<>();
  5. System.out.println(set.add("abc")); // true
  6. System.out.println(set.add("xyz")); // true
  7. System.out.println(set.add("xyz")); // false 不能添加相同的字符串
  8. System.out.println(set.contains("xyz")); // true
  9. System.out.println(set.contains("XYZ")); // false 区分大小写
  10. System.out.println(set.remove("hello")); // false 不能移除不存在的数据
  11. System.out.println(set.size()); // 2 计算长度
  12. }
  13. }
  14. // 最常用的set实现类是HashSet,实际上,HashSet仅仅是对HashMap的一个简单封装,
  15. // HashSet是无序的,因为它实现了Set接口,并没有实现SortedSet接口;
  16. // TreeSet是有序的,因为它实现了SortedSet接口

Queue的使用

  1. // 队列是常用的数据结构之一,遵循的规则是:“先进先出”
  2. public class Collection2{
  3. public static void main(String[] args) {
  4. Queue<String> q = new LinkedList<>();
  5. // 添加3个元素到队列
  6. q.offer("apple");
  7. q.offer("shuai");
  8. q.offer("xiaoshuai");
  9. // 从队列取出元素
  10. /*
  11. * .offer() 向队列中添加数据,不要添加null进入数据
  12. * .poll() 取出元素并且从队列中删除,如果取不到数据则返回null
  13. * .peek() 取出元素但不从队列中删除,如果连续使用则获取的是同一个数据
  14. * .size() 查看当前队列的长度
  15. * */
  16. System.out.println(q.poll()); // apple
  17. System.out.println(q.poll()); // shuai
  18. System.out.println(q.peek()); // xiaoshuai
  19. System.out.println(q.size()); // 返回当前队列的长度
  20. System.out.println(q.poll()); // 队列中取不到数据返回null
  21. }
  22. }

PriorityQueue的使用

  1. Queue<String> q = new PriorityQueue<>();
  2. // 默认是按照字符串进行比较,小的先出队列
  3. // 模拟VIP用户可以优先办理业务
  4. // 需要我们自定义Comparable接口
  5. import java.util.Comparator;
  6. import java.util.PriorityQueue;
  7. import java.util.Queue;
  8. public class Collection2{
  9. public static void main(String[] args) {
  10. Queue<User> q = new PriorityQueue<>(new UserComparator());
  11. q.offer(new User("Bob","A",1));
  12. q.offer(new User("Alice","A",2));
  13. q.offer(new User("xiaoshuai","A",10));
  14. q.offer(new User("shuai","V",1));
  15. System.out.println(q.poll()); // shuai/V1
  16. System.out.println(q.poll()); // Bob/A1
  17. System.out.println(q.poll()); // Alice/A2
  18. System.out.println(q.poll()); // null
  19. System.out.println(q.poll()); // null
  20. }
  21. }
  22. class UserComparator implements Comparator<User>{
  23. public int compare(User u1, User u2){
  24. if (u1.number.charAt(0) == u2.number.charAt(0)){
  25. // 如果两人的号都是A开头或者都是V开头,比较号的大小
  26. return u1.number1.compareTo(u2.number1);
  27. }
  28. if (u1.number.charAt(0) == 'V'){
  29. // u1的号码是V开头,优先级高
  30. return -1;
  31. }else {
  32. return 1;
  33. }
  34. }
  35. }
  36. class User{
  37. public final String name;
  38. public final String number;
  39. public final Integer number1;
  40. public User(String name , String number , Integer number1){
  41. this.name = name;
  42. this.number = number;
  43. this.number1 = number1;
  44. }
  45. public String toString(){
  46. return name + "/" + number + number1;
  47. }
  48. }

Deque(双端队列的使用)

  1. // 两端都能进或者出数据,我们称之为双端队列(Deque)
  2. // Deque接口实际上扩展自Queue;
  3. // 声明一个双端队列
  4. Deque<String> deque = new LinkedList<>();
  5. deque.offerLast("A"); // 从队尾插入数据
  6. deque.offerFirst("A"); // 从队首插入数据
  7. System.out.println(deque.pollLast()); // 从队尾删除数据
  8. System.out.println(deque.pollFirst()); // 从队首删除数据
  9. // 如果队列中没有数据,返回null

使用Stack(栈)

  1. // 栈是常用的数据结构之一,遵循的规则是:“先进后出”
  2. /*
  3. Stack只有入栈和出栈的操作:
  4. 把元素压栈:push(E);
  5. 把栈顶的元素“弹出”:pop();
  6. 取栈顶元素但不弹出:peek()。
  7. 注意:我们用Deque可以实现Stack的功能;当Deque作为Stack使用时,我们调用上面方法去实现
  8. 为什么Java的集合类没有单独的Stack接口呢?因为有个遗留类名字就叫Stack,出于兼容性考虑,所以没办法创建Stack接口,只能用Deque接口来“模拟”一个Stack了。
  9. */
  10. // Stack的在计算机中的作用非常广泛