黑马程序员__泛型_Set集合类_Map集合类

------<a href=" http://www.itheima.com " target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、泛型(理解)

(1)泛型是一种把明确类型放在了创建对象或者调用方法时候才去明确的特殊的类型。

    (2)格式:

       <数据类型>引用数据类型

    (3)好处:

       A:解决了黄色警告线问题

       B:把运行期间的转换异常给提前到了编译期间

       C:优化了程序设计,不需要做强制类型转换了

    (4)泛型的前世今生

       A:泛型类

       B:泛型方法

       C:泛型接口

    (5)泛型的使用:(掌握)

       看API中的类或者接口,其后是否跟有<>,如果有,就是泛型的应用。

       一般在集合中用


      ==符号和equals方法的区别

      1,==符号是比较运算符,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值

      2,equals方法只能比较引用数据类型,如果子类中没有重写Object类中的equals方法,equals方法是依赖==号比较的,比较的是

      对象的地址值,但是一般我们都会重写equals方法,重写之后比较的是对象中的属性

     

[java]  view plain copy
  1. class Person {  
  2.     private String name;  
  3.     private int age;  
  4.     public Person() {  
  5.         super();  
  6.           
  7.     }  
  8.     public Person(String name, int age) {  
  9.         super();  
  10.         this.name = name;  
  11.         this.age = age;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public int getAge() {  
  20.         return age;  
  21.     }  
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25.     @Override  
  26.     public String toString() {  
  27.         return "Person [name=" + name + ", age=" + age + "]";  
  28.     }  
  29.     @Override  
  30.     public boolean equals(Object obj) {       
  31. Person p = (Person)obj;  
  32.         return this.name.equals(p.name) && this.age == p.age;  
  33.     }  
  34.       
  35.       
  36. }  
  37.   
  38.   
  39.   
  40. public static void main(String[] args) {  
  41.         //demo1();  
  42.         ArrayList<Integer> list = new ArrayList<>();  
  43.         list.add(123);  
  44.           
  45.         System.out.println(list);  
  46.     }  
  47.   
  48.     private static void demo1() {  
  49.         ArrayList<Person> list = new ArrayList<Person>();  
  50. //      list.add("a");  
  51. //      list.add(123);  
  52.         list.add(new Person("张三"23));  
  53.         list.add(new Person("李四"24));  
  54.         Iterator<Person> it = list.iterator();  
  55.         while(it.hasNext()) {  
  56.             Person p = it.next();  
  57.             System.out.println(p.getName() + "..." + p.getAge());  
  58.         }  
  59.     }  
  60.   
  61. }  

/**

     * @param args

     * 泛型的通配符

     * ?

     * 高级泛型

     * ? extends E 固定上边界

     * ? super E

     */

[java]  view plain copy
  1. public static void main(String[] args) {  
  2.         //ArrayList<?> list = new ArrayList<String>();  
  3.         ArrayList<Person> list1 = new ArrayList<>();  
  4.         list1.add(new Person("张三"23));  
  5.         list1.add(new Person("李四"24));  
  6.         list1.add(new Person("王五"25));  
  7.           
  8.           
  9.     }  
  10.   
  11. }  

[java]  view plain copy
  1. public class Tool<Q> {                //Q在创建对象的时候被赋值,创建对象传入的是什么类型Q就是什么类型  
  2.     private Q obj;  
  3.   
  4.     public Q getObj() {  
  5.         return obj;  
  6.     }  
  7.   
  8.     public void setObj(Q obj) {  
  9.         this.obj = obj;  
  10.     }  
  11.   
  12.     public void show(Q q) {             //非静态方法的泛型可以和类的泛型一致  
  13.         System.out.println(q);  
  14.     }  
  15.       
  16.     public static<T> void method(T t) {//静态方法需要定义自己的泛型,因为静态方法是随着类的加载而加载的,在静态方法  
  17.         System.out.println(t);          //加载的时候还没有创建对象,那么泛型就没有值,但是定义属于自己的泛型就没事了  
  18.     }                                   //在调用这个静态方法的时候会给泛型赋值  
  19. }  


二、Set               不可重复, 没索引,无序

HashSet          使用哈希算法去重复, 效率高, 但元素无序

TreeSet          TreeSet是用排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

LinkedHashSet HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序

1)HashSet(LinkedHashSet)

    1.HashSet原理

       我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低

       哈希算法提高了去重复的效率, 降低了使用equals()方法的次数

       当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象

          如果没有哈希值相同的对象就直接存入集合

          如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较

              比较结果为false就存入, true则不存

    2.将自定义类的对象存入HashSet去重复

       类中必须重写hashCode()和equals()方法

  hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)

  equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储


[java]  view plain copy
  1. public class Person {  
  2.     private String name;  
  3.     private int age;  
  4.     public Person() {  
  5.         super();  
  6.           
  7.     }  
  8.     public Person(String name, int age) {  
  9.         super();  
  10.         this.name = name;  
  11.         this.age = age;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public int getAge() {  
  20.         return age;  
  21.     }  
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25.     @Override  
  26.     public String toString() {  
  27.         return "Person [name=" + name + ", age=" + age + "]";  
  28.     }  
  29.     /*@Override 
  30.     public boolean equals(Object obj) { 
  31.         System.out.println("equals方法执行了吗"); 
  32.         Person p = (Person)obj; 
  33.         return this.name.equals(p.name) && this.age == p.age; 
  34.     } 
  35.     @Override 
  36.     public int hashCode() { 
  37.         final int NUM = 38; 
  38.         return NUM * name.hashCode() + age; 
  39.          
  40.     }*/  
  41.     /* 
  42.      * 1,31是一个质数 
  43.      * 2,31这个数既不大也不小 
  44.      * 3,31这个数好算,2的5次方-1 
  45.      */  
  46.     @Override  
  47.     public int hashCode() {  
  48.         final int prime = 31;  
  49.         int result = 1;  
  50.         result = prime * result + age;  
  51.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  52.         return result;  
  53.     }  
  54.     @Override  
  55.     public boolean equals(Object obj) {           
  56.         if (this == obj)                        //如果调用的对象和传入的对象是同一个对象  
  57.             return true;                        //返回true  
  58.         if (obj == null)                        //如果传入的对象为null  
  59.             return false;                       //返回false  
  60.         if (this.getClass() != obj.getClass())  //调用的对象的字节码文件和传入对象的字节码文件不一致  
  61.             return false;                       //返回false  
  62.         Person other = (Person) obj;            //强制类型转换  
  63.         if (age != other.age)                   //如果调用对象的年龄不等于传入对象的年龄  
  64.             return false;                       //返回false  
  65.         if (name == null) {                     //如果调用对象的name为null  
  66.             if (other.name != null)             //传入对象的name不为null  
  67.                 return false;                   //返回false  
  68.         } else if (!name.equals(other.name))    //如果调用的对象的name不等于传入对象的姓名  
  69.             return false;                       //返回false  
  70.         return true;                            //返回true  
  71.     }  
  72.       
  73. }  

[java]  view plain copy
  1. class Demo1_HashSet {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * HashSet是如何保证元素的唯一性的 
  6.      * 向HashSet集合存储的对象所属的类,必须重写hashCode和equals方法 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         //demo1();  
  10.         HashSet<Person> hs = new HashSet<>();  
  11.         hs.add(new Person("张三"23));  
  12.         hs.add(new Person("张三"23));  
  13.         hs.add(new Person("张三"23));  
  14.         hs.add(new Person("李四"24));  
  15.         hs.add(new Person("李四"24));  
  16.         hs.add(new Person("李四"24));  
  17.         hs.add(new Person("王五"25));  
  18.           
  19.         System.out.println(hs);  
  20.     }  
  21.   
  22.     private static void demo1() {  
  23.         HashSet<String> hs = new HashSet<>();  
  24.         hs.add("a");  
  25.         hs.add("a");  
  26.         hs.add("b");  
  27.         hs.add("b");  
  28.         hs.add("c");  
  29.         hs.add("d");  
  30.         hs.add("e");  
  31.         System.out.println(hs);  
  32.     }  
  33.   
  34. }  

2)LinkedHashSet

[java]  view plain copy
  1. public class Demo2_LinkedHashSet {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * LinkedHashSet 
  6.      * 可以保证怎么存就怎么取 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         LinkedHashSet<String> lhs = new LinkedHashSet<>();  
  10.         lhs.add("a");  
  11.         lhs.add("a");  
  12.         lhs.add("b");  
  13.         lhs.add("c");  
  14.         lhs.add("d");  
  15.           
  16.         System.out.println(lhs);  
  17.     }  
  18.   
  19. }  

3)迭代(遍历)

    1.List

       a.普通for循环, 使用get()逐个获取

       b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法

       c.增强for循环, 只要可以使用Iterator的类都可以用

       d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法

    2.Set

       a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法

       b.增强for循环, 只要可以使用Iterator的类都可以用

[java]  view plain copy
  1. import java.util.HashSet;  
  2. import java.util.Iterator;  
  3.   
  4. public class Demo3_Iterator {  
  5.   
  6.     /** 
  7.      * @param args 
  8.      * Set集合迭代有两种 
  9.      * 1,迭代器 
  10.      * 2,增强for循环,只要能用迭代器迭代的,都能用增强for循环迭代 
  11.      */  
  12.     public static void main(String[] args) {  
  13.         HashSet<String> hs = new HashSet<>();  
  14.         hs.add("a");  
  15.         hs.add("b");  
  16.         hs.add("c");  
  17.         hs.add("d");  
  18.           
  19.         /*Iterator<String> it = hs.iterator(); 
  20.         while(it.hasNext()) { 
  21.             System.out.println(it.next()); 
  22.         }*/  
  23.         for(String str : hs) {  
  24.             System.out.println(str);  
  25.         }  
  26.     }  
  27.   
  28. }  

4)TreeSet

    1.特点

       TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

    2.使用方式

       a.自然顺序(Comparable)

           TreeSet类的add()方法中会把存入的对象提升为Comparable类型

           调用对象的compareTo()方法和集合中的对象比较

           根据compareTo()方法返回的结果进行存储

       b.比较器顺序(Comparator)

           创建TreeSet的时候可以制定 一个Comparator

           如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序

           add()方法内部会自动调用Comparator接口中compare()方法排序

       c.两种方式的区别

           TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)

           TreeSet如果传入Comparator, 就优先按照Comparator

1)自然排序
[java]  view plain copy
  1. public class Demo5_TreeSet {  
  2.   
  3. public static void main(String[] args) {  
  4.   
  5.     TreeSet<Person> ts=new TreeSet<>();  
  6.                 ts.add(new Person("张三",24));  
  7.                 ts.add(new Person("李三",23));  
  8.                 ts.add(new Person("王三",23));  
  9.                 ts.add(new Person("刘三",25));  
  10.                   
  11.                 System.out.println(ts);  
  12. }  
  13. }  
  14.   
  15.   
  16. class Person implements Comparable<Person>{  
  17.     private String name;  
  18.     private int age;  
  19.     public Person() {  
  20.         super();  
  21.           
  22.     }  
  23.     public Person(String name, int age) {  
  24.         super();  
  25.         this.name = name;  
  26.         this.age = age;  
  27.     }  
  28.     public String getName() {  
  29.         return name;  
  30.     }  
  31.     public void setName(String name) {  
  32.         this.name = name;  
  33.     }  
  34.     public int getAge() {  
  35.         return age;  
  36.     }  
  37.     public void setAge(int age) {  
  38.         this.age = age;  
  39.     }  
  40.     @Override  
  41.     public String toString() {  
  42.         return "Person [name=" + name + ", age=" + age + "]";  
  43.     }  
  44. public int compareTo(Person o) {            //重写compareTo方法  
  45. int num = this.age - o.age;             //主要条件按照年龄比较  
  46. return num == 0 ? this.name.compareTo(o.name) : num;//如果年龄相同比较姓名  
  47.     }*/  
  48.     //字符串的compareTo方法其实是按照unicode码表值比较的  
  49.     public int compareTo(Person p) {  
  50.         int num = this.name.compareTo(p.name);  //主要条件按照姓名比较  
  51.         return num == 0 ? this.age - p.age : num;//如果姓名相同比较年龄  
  52.     }  
  53. }  

2)选择排序

[java]  view plain copy
  1. import java.util.Comparator;  
  2. import java.util.TreeSet;  
  3.   
  4. public class Demo5_TreeSet {  
  5.   
  6.     /** 
  7.      * @param args 
  8.      * TreeSet比较器 
  9.      * 2,比较器排序 
  10.      *  
  11.      * 需求:将字符按照长度排序 
  12.      */  
  13.     public static void main(String[] args) {  
  14.           
  15.         TreeSet<String> ts = new TreeSet<>(new CompareByLen());  
  16.         ts.add("cba");  
  17.         ts.add("nba");  
  18.         ts.add("wc");  
  19.         ts.add("ccav");  
  20.         ts.add("aaaaaaaaaaaaaaaaaaaaaaaaa");  
  21.         ts.add("z");  
  22.           
  23.         System.out.println(ts);  
  24.     }  
  25.   
  26.       
  27.   
  28. }  
  29.   
  30. class CompareByLen implements Comparator<String> {  
  31.   
  32.     @Override  
  33.     public int compare(String s1, String s2) {  
  34.         int num = s1.length() - s2.length();  
  35.         int z = num == 0 ? s1.compareTo(s2) : num;  
  36.         return z;  
  37.     }  
  38.       
  39. }  

三、Map集合

1.Map集合的特点

       Map集合一次存储两个对象, 一个键对象, 一个值对象

       键对象在集合中是唯一的, 可以通过键来查找值

    2.Map常用方法

       put() 存储一条记录, 一个键和一个值

       get() 根据键对象获取值

       containsKey() 判断是否包含指定的键

       containsValue() 判断是否包含指定的值

       remove(key) 根据键删除一条记录

       size() Map集合中的记录数

       values() 得到所有的值对象组成的一个Collection集合

[java]  view plain copy
  1. public class Demo1_Map {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      *  
  6.      */  
  7.     public static void main(String[] args) {  
  8.         Map<String, Integer> map = new HashMap<>();  
  9.         Integer i1 = map.put("张三"97);  
  10.         Integer i2 = map.put("李四"80);  
  11.         Integer i3 = map.put("王五"59);  
  12.         Integer i4 = map.put("赵六"98);  
  13.           
  14.         Integer i5 = map.put("张三"100);    //双列集合中键是唯一的,如果添加重复的键,后面添加的元素会 把前面元素的值替换  
  15.                                             //并返回被替换的值  
  16.         System.out.println(i1);  
  17.         System.out.println(i2);  
  18.         System.out.println(i3);  
  19.         System.out.println(i4);  
  20.         System.out.println(i5);  
  21.         System.out.println(map);            //打印结果是{赵六=98, 张三=97, 李四=80, 王五=59}  
  22.                                             //因为HashMap的父类重写了Object类中的toString方法  
  23.     }  
  24. }  


3.迭代Map集合

       a.keySet()

           先调用keySet()方法从Map集合中获取所有Key组成的一个Set集合

           迭代Set集合可以得到每一个Key

           然后再调用get()方法通过Key获取每一个Value

       b.entrySet()

           先调用entrySet()方法从Map集合中获取所有Entry(键值对)组成的一个Set集合

           迭代Set集合可以得到每一个Entry

           然后再调用getKey()和getValue()方法得到每一个Key和每一个Value

[java]  view plain copy
  1. public class Demo2_Iterator {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * foreach是不能直接遍历双列集合的 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         //demo1();  
  9.         Map<Person,String> map = new HashMap<>();  
  10.         map.put(new Person("张三"23), "北京");  
  11.         map.put(new Person("李四"24), "上海");  
  12.         map.put(new Person("王五"25), "广州");  
  13.         map.put(new Person("赵六"26), "深圳");  
  14.           
  15.         /*Set<Map.Entry<Person, String>> entrySet = map.entrySet();                 //获取键值对对象的集合 
  16.         Iterator<Map.Entry<Person, String>> it = entrySet.iterator();               //获取迭代器 
  17.         while(it.hasNext()) { 
  18.             Map.Entry<Person, String> en = it.next();                             //迭代每一个键值对象 
  19.             System.out.println(en.getKey() + "=" + en.getValue());                  //通过键值对象获取键和值 
  20.         }*/  
  21.           
  22.         for(Entry<Person, String> en : map.entrySet()) {                                                    
  23.             System.out.println(en.getKey() + "=" + en.getValue());  
  24.         }  
  25.     }  
  26.   
  27.     private static void demo1() {  
  28.         Map<Person,String> map = new HashMap<>();  
  29.         map.put(new Person("张三"23), "北京");  
  30.         map.put(new Person("李四"24), "上海");  
  31.         map.put(new Person("王五"25), "广州");  
  32.         map.put(new Person("赵六"26), "深圳");  
  33.           
  34.         /*Set<Person> keySet = map.keySet();      //获取所有的键 
  35.         Iterator<Person> it = keySet.iterator();  //获取迭代器 
  36.         while(it.hasNext()) {                       //判断集合中是否有元素 
  37.             Person key = it.next();                 //获取双列集合中的每一个键 
  38.             String value = map.get(key);            //通过键获取值 
  39.             System.out.println(key + "=" + value);  //打印键和值 
  40.         }*/  
  41.           
  42.         for(Person key : map.keySet()) {  
  43.             System.out.println(key + "=" + map.get(key));  
  44.         }  
  45.     }  
  46.   
  47. }  
  48.   
  49. class Person implements Comparable<Person>{  
  50.     private String name;  
  51.     private int age;  
  52.     public Person() {  
  53.         super();  
  54.           
  55.     }  
  56.     public Person(String name, int age) {  
  57.         super();  
  58.         this.name = name;  
  59.         this.age = age;  
  60.     }  
  61.     public String getName() {  
  62.         return name;  
  63.     }  
  64.     public void setName(String name) {  
  65.         this.name = name;  
  66.     }  
  67.     public int getAge() {  
  68.         return age;  
  69.     }  
  70.     public void setAge(int age) {  
  71.         this.age = age;  
  72.     }  
  73.     @Override  
  74.     public String toString() {  
  75.         return "Person [name=" + name + ", age=" + age + "]";  
  76.     }  
  77. }  

4.HashMap

       在使用HashMap存储键值对的时候, 先调用Key对象的hashCode()方法计算一个哈希值, 在Map中查找是否有相同哈希值的Key对象

       如果没有哈希值相同的Key对象, 这个键值对直接存入

       如果有哈希值相同的Key对象, 那么就进行equals比较

       比较结果为false就存入, true则覆盖原Value

[java]  view plain copy
  1. import java.util.HashMap;  
  2. public class Demo4_HashMap {  
  3.   
  4.     /** 
  5.      * @param args 
  6.      * 查看源码发现HashSet底层的add方法其实是依赖于HashMap的put方法 
  7.      * 这就是为什么HashSet集合中所有的元素是唯一的 
  8.      * 而HashMap集合中所有的键是唯一的 
  9.      */  
  10.     public static void main(String[] args) {  
  11.         //demo1();  
  12.         HashMap<Person, String> hm = new HashMap<>();  
  13.         hm.put(new Person("张三"23), "北京");  
  14.         hm.put(new Person("张三"23), "上海");  
  15.           
  16.         System.out.println(hm);  
  17.     }  
  18.   
  19.     private static void demo1() {  
  20.         HashMap<String, Integer> hm = new HashMap<>();  
  21.         hm.put("a"3);  
  22.         hm.put("b"1);  
  23.         hm.put("c"4);  
  24.         hm.put("d"2);  
  25.         hm.put("a"5);  
  26.           
  27.         System.out.println(hm.size());  
  28.         System.out.println(hm);  
  29.     }  
  30.   
  31. }  
  32.   
  33. public class Person {  
  34.     private String name;  
  35.     private int age;  
  36.     public Person() {  
  37.         super();  
  38.           
  39.     }  
  40.     public Person(String name, int age) {  
  41.         super();  
  42.         this.name = name;  
  43.         this.age = age;  
  44.     }  
  45.     public String getName() {  
  46.         return name;  
  47.     }  
  48.     public void setName(String name) {  
  49.         this.name = name;  
  50.     }  
  51.     public int getAge() {  
  52.         return age;  
  53.     }  
  54.     public void setAge(int age) {  
  55.         this.age = age;  
  56.     }  
  57.     @Override  
  58.     public String toString() {  
  59.         return "Person [name=" + name + ", age=" + age + "]";  
  60.     }  
  61.     @Override  
  62.     public int hashCode() {  
  63.         final int prime = 31;  
  64.         int result = 1;  
  65.         result = prime * result + age;  
  66.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  67.         return result;  
  68.     }  
  69.     @Override  
  70.     public boolean equals(Object obj) {  
  71.         if (this == obj)  
  72.             return true;  
  73.         if (obj == null)  
  74.             return false;  
  75.         if (getClass() != obj.getClass())  
  76.             return false;  
  77.         Person other = (Person) obj;  
  78.         if (age != other.age)  
  79.             return false;  
  80.         if (name == null) {  
  81.             if (other.name != null)  
  82.                 return false;  
  83.         } else if (!name.equals(other.name))  
  84.             return false;  
  85.         return true;  
  86.     }  
  87.       
  88.       
  89.       
  90. }  

Hashtable和HashMap的区别

    Hashtable

       类似HashMap, 线程安全, 效率略低,不允许null键和null值

1,Hashtable是线程安全的,效率比较低

      HashMap是线程不安全的,效率高

    2,Hashtable不能存储null键,不能存储null值

       HashMap可以存储null键和null值


[java]  view plain copy
  1. public class Demo5_Hashtable {  
  2.   
  3.       
  4.     public static void main(String[] args) {  
  5.         /*Hashtable<String, Integer> ht = new Hashtable<>(); 
  6.         //ht.put(null, 123); 
  7.         ht.put("张三", null); 
  8.         System.out.println(ht);*/  
  9.         HashMap<String, Integer> hm = new HashMap<>();  
  10.         //hm.put(null, 123);  
  11.         hm.put("张三"null);  
  12.         System.out.println(hm);  
  13.     }  
  14.   
  15. }  

5.LinkedHashMap

       HashMap的子类, 算法相同, 但保留了存储的顺序

[java]  view plain copy
  1. public class Demo6_LinkedHashMap {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         HashMap<String, Integer> hm = new LinkedHashMap<>();        //Hashtable<String, Integer> ht = new LinkedHashMap<>();//  
  8.         hm.put("a"1);  
  9.         hm.put("b"2);  
  10.         hm.put("c"3);  
  11.         hm.put("d"4);  
  12.           
  13.         System.out.println(hm);  
  14.     }  
  15.   
  16. }  

6.TreeMap

       在使用TreeMap存储键值对时候, 会使用Key对象和集合中已存储的Key对象进行比较, 确定二叉树上的位置

       比较的方式和TreeSet指定的方式相同, Comparable和Comparator

 

[java]  view plain copy
  1. public class Demo7_TreeMap {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * TreeMap是对键进行排序,有两种方式 
  6.      * 方式1,自然排序,存储在集合中的对象所属的类,必须实现Comparable接口,并重写compareTo方法,根据compareTo方法的返回值存储 
  7.      * 方式2,比较器排序,在TreeSet的构造函数中,传入Comparator的子类对象,并重写compare方法,根据compare的返回值存储 
  8.      */  
  9.     public static void main(String[] args) {  
  10.           
  11.           
  12.         TreeMap<Person, String> tm = new TreeMap<>(new Comparator<Person>() {  
  13.             @Override  
  14.             public int compare(Person p1, Person p2) {  
  15.                 int num = p1.getAge() - p2.getAge();  
  16.                 return num == 0 ? p1.getName().compareTo(p2.getName()) : num;  
  17.             }  
  18.         });  
  19.           
  20.         tm.put(new Person("张三"23), "北京");  
  21.         tm.put(new Person("李四"54), "上海");  
  22.         tm.put(new Person("王五"35), "广州");  
  23.         tm.put(new Person("赵六"26), "深圳");  
  24.           
  25.         System.out.println(tm);  
  26.           
  27.     }  
  28.   
  29.     private static void demo2() {  
  30.         TreeMap<Person, String> tm = new TreeMap<>();  
  31.         tm.put(new Person("张三"23), "北京");  
  32.         tm.put(new Person("李四"14), "上海");  
  33.         tm.put(new Person("王五"35), "广州");  
  34.         tm.put(new Person("赵六"26), "深圳");  
  35.           
  36.         System.out.println(tm);  
  37.     }  
  38.   
  39.       
  40. }  
  41. class Person implements Comparable<Person>{  
  42.     private String name;  
  43.     private int age;  
  44.     public Person() {  
  45.         super();  
  46.           
  47.     }  
  48.     public Person(String name, int age) {  
  49.         super();  
  50.         this.name = name;  
  51.         this.age = age;  
  52.     }  
  53.     public String getName() {  
  54.         return name;  
  55.     }  
  56.     public void setName(String name) {  
  57.         this.name = name;  
  58.     }  
  59.     public int getAge() {  
  60.         return age;  
  61.     }  
  62.     public void setAge(int age) {  
  63.         this.age = age;  
  64.     }  
  65.     @Override  
  66.     public String toString() {  
  67.         return "Person [name=" + name + ", age=" + age + "]";  
  68.     }  
  69.       
  70.     @Override  
  71.     public int compareTo(Person o) {  
  72.         int num = this.age - o.age;  
  73.         return num == 0 ? this.name.compareTo(o.name) : num;  
  74.     }  


四、总结

集合的迭代

    1.Collection

       Iteraotr:   通过iterator()方法得到迭代器, 调用hasNext()和next()方法进行迭代

       ForEach:    for (类型  变量名 : 容器) { 循环体 }

    2.Map

       keySet():   得到所有的键组成的Set,遍历Set得到每一个键, 然后再分别获取值

       entrySet(): 得到所有的Entry组成的Set, 遍历Set得到每一个Entry, 再分别getKey()和getValue()

    3.List

       Iterator

       ForEach

       for: 根据索引定义for循环, 调用get()方法根据索引获取每一个元素

    4.Vector

       Iterator

       ForEach

       for

       Enumeration: 类似Iterator, 通过elements()方法得到Enumeration, 调用hasMoreElements()和nextElement()方法进行迭代


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值