1.treeSet
目前学习了三个及各类,分别为:
ArrayList:底层是数组,可以根据下标操作数据,数据可以重复,存取数据类型保持一致
LinkedList:底层是双向链表,有头有尾,可以根据头尾来操作数据,数据也可以重复,存取数据类型保持一致
HashCode:底层是一个hash表,不能保存重复的数据(一个萝卜一个坑)。存取相对无序。
TreeSet:它也是Set接口下面的一个实现类,可以保证数据唯一性,存取相对无序,同时可以对存入的数据进行排序。底层是二叉树(数据结构)。不能存重复数据
只要将数据存到TreeSet集合中,就已经开始进行排序了,默认的自然排序是升序。。。
1.1TerrSet存放自定义的对象
案例,使用TreeSet储存Student对象,按照年龄进行排序。
如果存入的是一个对象的话,需要让类实现一个比较器接口Comparable这个接口
1. compareTo
重写下面的compareTo(Student student)返回值是int类型的数据
实现这个方法的时候,这个只可以是正数、负数、0
如果是正数,表示对象调用此方法大于指定对象
如果是负数,表示对象调用此方法小于指定对象
如果是0,表示对象调用此方法等于指定对象
package com.qfedu.test1TreeSet;import java.util.TreeSet;//TreeSet集合存入Person对象,属性name、age//按照name属性字典顺序进行比较,如果一样在按照年龄进行比较class Person implements Comparable<Person>{String name;int age;public Person(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Person o) {//字符串按照字典顺序用String类下重写的 conpareTo方法int number = this.name.compareTo(o.name);if (number == 0) {//名字意义按照年龄排int number2 = this.age - o.age;return number2;}return number;}}public class Demo2 {public static void main(String[] args) {TreeSet<Person> set = new TreeSet<Person>();set.add(new Person("z朱志伟", 24));set.add(new Person("g谷小天", 30));set.add(new Person("l刘子贤", 20));set.add(new Person("z朱航", 23));set.add(new Person("z朱志伟", 18));System.out.println(set);for (Person person : set) {System.out.println(person);}}}
2. 比较器
除了实现Comparable接口之外,还有一种写法,比较器
需要使用接口Comparator
案例
package com.qfedu.test1TreeSet;import java.util.Comparator;import java.util.TreeSet;//比较器class Animals{String name;int age;public Animals(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Animals [name=" + name + ", age=" + age + "]";}}class MyComparator implements Comparator<Animals>{@Overridepublic int compare(Animals o1, Animals o2) {int num1 = o1.age - o2.age;return num1;}}public class Demo3bijiaoqi {public static void main(String[] args) {TreeSet<Animals> set = new TreeSet<Animals>(new MyComparator());set.add(new Animals("a", 12));set.add(new Animals("b", 120));set.add(new Animals("c", 123));set.add(new Animals("d", 12));//没了set.add(new Animals("e", 99));System.out.println(set);for (Animals animals : set) {System.out.println(animals);}}}
2.匿名内部类
目的就是减少代码量的
2.1基于抽象类的匿名内部类【重点】
package com.qfedu.test2niming;//基于抽象类的匿名内部类abstract class Teacher{public abstract void work();}public class Demo3 {public static void main(String[] args) {test(new Teacher() {@Overridepublic void work() {// TODO Auto-generated method stubSystem.out.println("我要当老板");}});}//一个方法传的是抽象类,抽象来正常需要一个正常类去继承//但是可以直接new抽象类,然后调用下面的方法public static void test(Teacher teacher) {teacher.work();}}
2.2基于接口的匿名内部类【重点】
案例1
package com.qfedu.test2niming;//方法1interface A{void eat();}public class Demo4 {public static void main(String[] args) {//案例1A a = new A() {@Overridepublic void eat() {System.out.println("吃饭");}};a.eat();//案例2new A() {@Overridepublic void eat() {System.out.println("a ?");}}.eat();;}}
案例2
package com.qfedu.test2niming;//方法2interface B{void eat();}public class Demo5 {public static void main(String[] args) {test(new B() {@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("谷小天吃粑粑");}});}public static void test(B b) {b.eat();}}
改进Comparator
3.Map集合
集合用来存储数据的,双边队列。Map
K:键 V:值
HashMap 基于hash值进行存储的,是key。TreeMap 基于二叉树进行存储public
方法:Map常用方法
K是键 V是值增:v put(k,v);//键一样,替换值。键不一样,内容可以重复v putAll();删:v remove(object key);改v put(k,v);//当K存在就修改内容,k不存在就是添加值查int size();//返回键值对的数量boolean isEmpty();//是否为空boolean containsKey(object k);//有没有这个键kboolean containsValue(object v);//是否有v这个值v get(object K);//根据键找值Set<k> keySet();//取出键,存到Set集合中Collection<v> values();//取出值,存到Collection集合中为什么K键存Set,V值存Collection????Set不可重复,所以K键存Set中因为K是唯一的,key是通过hash值进行存储的。value可以重复Set<map.Entry<k,v>> entrySet();//把Map转换成Set 方便遍历//Set<Map.Entry<String, String>> entry = map.entrySet();
经典问题:
为什么K键存Set,V值存Collection????
Set不可重复,所以K键存Set中
因为K是唯一的,key是通过hash值进行存储的。value可以重复
package com.qfedu.test3Map;import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Set;public class Demo1 {public static void main(String[] args) {Map<String, String> map = new HashMap<String, String>();//增 改都是putmap.put("003", "王梦哲");map.put("001", "朱志伟");map.put("001", "朱爷");//键一样,替换值map.put("002", "朱航");//键不能一样,且根据键排序System.out.println(map);//putAll 增加集合Map<String, String> map1 = new HashMap<String, String>();map1.put("004", "刘子贤");map1.put("005", "张桂园");map.putAll(map1);;System.out.println(map);// for (String string : map) {//不能遍历// System.out.println(string);// }//删map.remove("004");//删除004System.out.println(map);//查System.out.println(map.size());//键值对个数 4System.out.println(map.isEmpty());//是否为空 FSystem.out.println(map.containsKey("009"));//有没有009这个键 FSystem.out.println(map.containsValue("谷小天"));//有没有谷小天这个值 FSystem.out.println(map.get("001"));//根据键找值Set<String> set = map.keySet();//取出键,存到Set集合中System.out.println(set);Collection<String> list = map.values();//取出值,存到Collection集合中System.out.println(list);//将map实体封装给了Set集合,方便遍历Set<Map.Entry<String, String>> entry = map.entrySet();System.out.println(entry);//遍历for (Map.Entry<String, String> entry2 : entry) {System.out.println(entry2);// System.out.println(entry2.getKey());//获取键// System.out.println(entry2.getValue());//获取值}}}
