Day07 set集合与map集合

来源:互联网 发布:mcake 知乎 编辑:程序博客网 时间:2024/06/01 10:10

Set接口的特点  

遍历集合对象的方式(三种):

         转数组   -----    迭代器   --------   增强for

 

Set体系的集合:

    A:无序    B:无索引     C:不允许重复

HashSet使用&唯一性原理

源码

 * 使用HashSet存储自定义对象并遍历
 * 通过查看源码发现:
 * HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,
 * 如果hash值不一样,则直接添加新的元素
 * 如果hash值一样,比较地址值或者使用equals方法进行比较
 * 比较结果一样,则认为是重复不添加
 * 所有的比较结果都不一样则添加

初步优化:

public int hashCode() {

                   return 1;

         }

         @Override

         public boolean equals(Object obj) {

                   Student s = (Student)obj;   //将object对象向下转型,才能获得子类的特有属性

                   if(this.age !=s.age){  //this.是对象的成员变量, s.是待比较的成员

                            returnfalse;

                   }

                   if(!this.name.equals(s.name) ){

                            returnfalse;

                   }

                   returntrue;

         }

 

hashCode方法优化:

* 我们发现当hashCode方法永远返回整数1时,所有对象的hash值都是一样的,

         * 有一些对象他的成员变量完全不同,但是他们还需要进行hashequals方法的比较,

         * 如果我们可以让成员变量不同的对象,他们的hash值也不同,这就可以减少一部分equals方法的比较

         * 从而可以提高我们程序的效率

    实现思路:

* 可以尝试着让hashCode方法的返回值和对象的成员变量有关  //return age;

* 可以让hashCode方法返回所有成员变量之和,returnage + name.hashCode();

* 让基本数据类型直接想加,然后引用数据类型获取hashCode方法返回值后再相加,boolean不可以参与运算)  

 

优化需要做到的就是当两个对象内容完全相同时,我们根本不想执行equals方法去比较,直接先用hash地址方法比较出他们的相同就可以避免再用equals方法去比较了,提高了比较效率.所以先优化hash算法,再完善equals的比较策略和内容.

 

然后再优化equals()

@Override

    public boolean equals(Object obj) {

        //提高效率   对象相同

        if(this == obj) {

            return true;

        }

       

        //提高健壮性   是否同一类型的对象

        if(this.getClass() != obj.getClass()) {

            return false;

        }

 

最后我们发现直接快捷键生成的hashequals方法设计的逻辑更缜密,我他妈还写个叽霸.

Collections(一个工具类)中的方法

* Collections

 * 面试题:CollectionCollections有什么区别?

 *      Collection是集合体系的最顶层,包含了集合体系的共性(其子类listset )

 *      Collections是一个工具类,方法都是用于操作Collection

 

使用的格式:

Collections.swap(list,0,1);两索引处位置互换

Collections.sort(list);自然顺序进行排序

Collections.shuffle(list);傻否,随机置换 

Collections.reverse(list);反转

Collections.fill(list, "android");列表的所有元素填充

Collections.copy(dest, src);

把源列表中的数据覆盖到目标列表

        //注意:目标列表的长度至少等于源列表的长度

        //创建源列表

 

int index = Collections.binarySearch(list,4);

使用二分查找法查找指定元素在指定列表的索引位置

HashMap集合

Map接口概述(双列顶层父接口)

需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

*   Map的常用功能:

 *      映射功能:将key映射到value,如果key存在,则覆盖value,并将原来的value返回

*               map.put("ITCAST001","张三") ;

*       获取功能:

 *              map.get("ITCAST002")

 *              map.size()

 *      判断功能:

 *             map.containsKey("ITCAST003")  判断指定key是否存在

    ;          map.containsValue("王五")    判断指定的value是否存在

                map.isEmpty()

 *      删除功能:

 *              map.clear();

map.remove("ITCAST005")                                             根据指定的key删除对应关系,并返回key所对应的值,如果没有删除成功则返回null       

 *      遍历功能:

 *              Set<Map.Entry<K,V>> entrySet()

 

        获取map集合中所有的key与所有的value:

 *          Set<K>keySet()    keyset返回的是set集合,因为key不能重复与set特点吻合

Set<String> keys = map.keySet();

        for (String key : keys) {

            System.out.println(key);

        }

 

 *          Collection<V>values()     value返回的是collection的集合

Collection<String> values = map.values();

        for (String value : values) {

            System.out.println(value);

        }

    //创建Map对象

        Map<String,String>map = newHashMap<String,String>();

Map的两种遍历方式

利用keySet()方法遍历

Set<String> keys = map.keySet();

            for (String key : keys) {

            Stringvalue = map.get(key);

            System.out.println("key" + key +"---" +"value" + value);

        }

利用entrySet()方法遍历

Set<Map.Entry<String,String>> entrys =map.entrySet();

    for (Map.Entry<String, String> entry :entrys) {因为Entrymap的内部类,所以要在Entry前加Map.要明确Map.Entry<String, String>就是一个类

    String key= entry.getKey();     //内部类对象entry中的getKey方法

    Stringvalue = entry.getValue(); // 内部类对象entry类中的getValue方法

    System.out.println("丈夫:" + key +"---" +"媳妇:" + value);

    }

 

广义化得出第三种iterator方法

 

         Set<Entry<String,String>> entrySet =map.entrySet();

                   Iterator<Entry<String,String>> ite = entrySet.iterator();

                   while(ite.hasNext()){

                            Entry<String,String> entry = ite.next();

                            String key =entry.getKey();

                            String value =entry.getValue();

                            System.out.println(key+"-----" +value);

 

其中不能使用      

String key = ite.next().getKey();

String value = ite.next().getValue();

因为next指向下一个位置,会导致错误.

 

直接获取map中所有的value值,并遍历打印

         Map<String ,String > map =new HashMap<String , String >();

         map.put("ITCAST001","鹿晗");

         map.put("ITCAST002","邓超");

         map.put("ITCAST003","陈赫");

         //直接获取map中所有的value,并遍历打印

         Collection<String >  col =map.values();

         for (Stringstring :col) {

                   System.out.println(string);

         }

         System.out.println(col);

 

可变参数

格式:

       实参: 一个参数一个参数的传递

       形参: 类型…变量名

注意

1.在可变参数之后不可以再追加参数

2.参数的数量定义, 可以给多个甚至也可以一个都不不给

 

主方法中:getSum(1,2,3,4);    

Public static int getSum(int…num){

    int sum =0;

        for(int i = 0; i < num.length; i++){

            sum+=num[i];

}

return sum;

}

Map中嵌套Map

学校Map

            基础班   基础班学生Map

            就业班   就业班学生Map

Map<String,Map<String,String>> itheima= new HashMap<String,Map<String,String>>();

Map<String,String> base = newHashMap<String,String>();

Map<String,String> job = newHashMap<String,String>();

Set<String> keys =itheima.keySet();//先获取所有的班级

        for(String key : keys) {

            System.out.println("班级名称:" + key); //输出班级名称

            //根据班级获取对应的所有学生

            Map<String,String>stus = itheima.get(key);

            //获取所有学生的学号

            Set<String>nums = stus.keySet();

            for(String num : nums) {

                //根据学号获取学生姓名

                Stringname = stus.get(num);

                System.out.println("学号:" + num + ",姓名:" + name);

            }

        }

 作业补充;
Arrays.toString(arr2);的方法直接把数组转换成符串,可以拿来输出  


集合回顾:



原创粉丝点击