1.treeSet

目前学习了三个及各类,分别为:

ArrayList:底层是数组,可以根据下标操作数据,数据可以重复,存取数据类型保持一致

LinkedList:底层是双向链表,有头有尾,可以根据头尾来操作数据,数据也可以重复,存取数据类型保持一致

HashCode:底层是一个hash表,不能保存重复的数据(一个萝卜一个坑)。存取相对无序。

TreeSet:它也是Set接口下面的一个实现类,可以保证数据唯一性,存取相对无序,同时可以对存入的数据进行排序。底层是二叉树(数据结构)。不能存重复数据

  1. 只要将数据存到TreeSet集合中,就已经开始进行排序了,默认的自然排序是升序。。。

1.1TerrSet存放自定义的对象

案例,使用TreeSet储存Student对象,按照年龄进行排序。

如果存入的是一个对象的话,需要让类实现一个比较器接口Comparable这个接口

1. compareTo

重写下面的compareTo(Student student)返回值是int类型的数据

实现这个方法的时候,这个只可以是正数、负数、0

如果是正数,表示对象调用此方法大于指定对象

如果是负数,表示对象调用此方法小于指定对象

如果是0,表示对象调用此方法等于指定对象

  1. package com.qfedu.test1TreeSet;
  2. import java.util.TreeSet;
  3. //TreeSet集合存入Person对象,属性name、age
  4. //按照name属性字典顺序进行比较,如果一样在按照年龄进行比较
  5. class Person implements Comparable<Person>{
  6. String name;
  7. int age;
  8. public Person(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Person [name=" + name + ", age=" + age + "]";
  16. }
  17. @Override
  18. public int compareTo(Person o) {
  19. //字符串按照字典顺序用String类下重写的 conpareTo方法
  20. int number = this.name.compareTo(o.name);
  21. if (number == 0) {//名字意义按照年龄排
  22. int number2 = this.age - o.age;
  23. return number2;
  24. }
  25. return number;
  26. }
  27. }
  28. public class Demo2 {
  29. public static void main(String[] args) {
  30. TreeSet<Person> set = new TreeSet<Person>();
  31. set.add(new Person("z朱志伟", 24));
  32. set.add(new Person("g谷小天", 30));
  33. set.add(new Person("l刘子贤", 20));
  34. set.add(new Person("z朱航", 23));
  35. set.add(new Person("z朱志伟", 18));
  36. System.out.println(set);
  37. for (Person person : set) {
  38. System.out.println(person);
  39. }
  40. }
  41. }

2. 比较器

除了实现Comparable接口之外,还有一种写法,比较器

需要使用接口Comparator

案例

  1. package com.qfedu.test1TreeSet;
  2. import java.util.Comparator;
  3. import java.util.TreeSet;
  4. //比较器
  5. class Animals{
  6. String name;
  7. int age;
  8. public Animals(String name, int age) {
  9. super();
  10. this.name = name;
  11. this.age = age;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Animals [name=" + name + ", age=" + age + "]";
  16. }
  17. }
  18. class MyComparator implements Comparator<Animals>{
  19. @Override
  20. public int compare(Animals o1, Animals o2) {
  21. int num1 = o1.age - o2.age;
  22. return num1;
  23. }
  24. }
  25. public class Demo3bijiaoqi {
  26. public static void main(String[] args) {
  27. TreeSet<Animals> set = new TreeSet<Animals>(new MyComparator());
  28. set.add(new Animals("a", 12));
  29. set.add(new Animals("b", 120));
  30. set.add(new Animals("c", 123));
  31. set.add(new Animals("d", 12));//没了
  32. set.add(new Animals("e", 99));
  33. System.out.println(set);
  34. for (Animals animals : set) {
  35. System.out.println(animals);
  36. }
  37. }
  38. }

2.匿名内部类

目的就是减少代码量的

2.1基于抽象类的匿名内部类【重点】

  1. package com.qfedu.test2niming;
  2. //基于抽象类的匿名内部类
  3. abstract class Teacher{
  4. public abstract void work();
  5. }
  6. public class Demo3 {
  7. public static void main(String[] args) {
  8. test(new Teacher() {
  9. @Override
  10. public void work() {
  11. // TODO Auto-generated method stub
  12. System.out.println("我要当老板");
  13. }
  14. });
  15. }
  16. //一个方法传的是抽象类,抽象来正常需要一个正常类去继承
  17. //但是可以直接new抽象类,然后调用下面的方法
  18. public static void test(Teacher teacher) {
  19. teacher.work();
  20. }
  21. }

2.2基于接口的匿名内部类【重点】

案例1

  1. package com.qfedu.test2niming;
  2. //方法1
  3. interface A{
  4. void eat();
  5. }
  6. public class Demo4 {
  7. public static void main(String[] args) {
  8. //案例1
  9. A a = new A() {
  10. @Override
  11. public void eat() {
  12. System.out.println("吃饭");
  13. }
  14. };
  15. a.eat();
  16. //案例2
  17. new A() {
  18. @Override
  19. public void eat() {
  20. System.out.println("a ?");
  21. }
  22. }.eat();;
  23. }
  24. }

案例2

  1. package com.qfedu.test2niming;
  2. //方法2
  3. interface B{
  4. void eat();
  5. }
  6. public class Demo5 {
  7. public static void main(String[] args) {
  8. test(new B() {
  9. @Override
  10. public void eat() {
  11. // TODO Auto-generated method stub
  12. System.out.println("谷小天吃粑粑");
  13. }
  14. });
  15. }
  16. public static void test(B b) {
  17. b.eat();
  18. }
  19. }

改进Comparator

3.Map集合

集合用来存储数据的,双边队列。Map

K:键 V:值

  1. HashMap 基于hash值进行存储的,是key
  2. TreeMap 基于二叉树进行存储
  3. public

方法:Map常用方法

  1. K是键 V是值
  2. 增:
  3. v put(k,v);//键一样,替换值。键不一样,内容可以重复
  4. v putAll();
  5. 删:
  6. v remove(object key);
  7. v put(k,v);//当K存在就修改内容,k不存在就是添加值
  8. int size();//返回键值对的数量
  9. boolean isEmpty();//是否为空
  10. boolean containsKey(object k);//有没有这个键k
  11. boolean containsValue(object v);//是否有v这个值
  12. v get(object K);//根据键找值
  13. Set<k> keySet();//取出键,存到Set集合中
  14. Collection<v> values();//取出值,存到Collection集合中
  15. 为什么K键存SetV值存Collection????
  16. Set不可重复,所以K键存Set
  17. 因为K是唯一的,key是通过hash值进行存储的。value可以重复
  18. Set<map.Entry<k,v>> entrySet();//把Map转换成Set 方便遍历
  19. //Set<Map.Entry<String, String>> entry = map.entrySet();

经典问题:

为什么K键存Set,V值存Collection????
Set不可重复,所以K键存Set中
因为K是唯一的,key是通过hash值进行存储的。value可以重复

  1. package com.qfedu.test3Map;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Set;
  6. public class Demo1 {
  7. public static void main(String[] args) {
  8. Map<String, String> map = new HashMap<String, String>();
  9. //增 改都是put
  10. map.put("003", "王梦哲");
  11. map.put("001", "朱志伟");
  12. map.put("001", "朱爷");//键一样,替换值
  13. map.put("002", "朱航");
  14. //键不能一样,且根据键排序
  15. System.out.println(map);
  16. //putAll 增加集合
  17. Map<String, String> map1 = new HashMap<String, String>();
  18. map1.put("004", "刘子贤");
  19. map1.put("005", "张桂园");
  20. map.putAll(map1);;
  21. System.out.println(map);
  22. // for (String string : map) {//不能遍历
  23. // System.out.println(string);
  24. // }
  25. //删
  26. map.remove("004");//删除004
  27. System.out.println(map);
  28. //查
  29. System.out.println(map.size());//键值对个数 4
  30. System.out.println(map.isEmpty());//是否为空 F
  31. System.out.println(map.containsKey("009"));//有没有009这个键 F
  32. System.out.println(map.containsValue("谷小天"));//有没有谷小天这个值 F
  33. System.out.println(map.get("001"));//根据键找值
  34. Set<String> set = map.keySet();//取出键,存到Set集合中
  35. System.out.println(set);
  36. Collection<String> list = map.values();//取出值,存到Collection集合中
  37. System.out.println(list);
  38. //将map实体封装给了Set集合,方便遍历
  39. Set<Map.Entry<String, String>> entry = map.entrySet();
  40. System.out.println(entry);
  41. //遍历
  42. for (Map.Entry<String, String> entry2 : entry) {
  43. System.out.println(entry2);
  44. // System.out.println(entry2.getKey());//获取键
  45. // System.out.println(entry2.getValue());//获取值
  46. }
  47. }
  48. }