• 判断集合元素唯一的原理-ArrayList的contains和HashSet的contains、add。Map接口、 集合嵌套


    1、判断集合元素唯一的原理

    (1)ArrayList的contains方法判断元素是否重复原理

     Contains():boolean类型,当此列表中含有元素的时候,返回true

    ArrayList的contains方法会使用调用方法时,传入的元素的equals方法依次与集合中的旧元素所比较,从而根据返回的布尔值判断是否有重复元素。此时,当ArrayList存放自定义类型时,由于自定义类型在未重写equals方法前,判断是否重复的依据是地址值,所以如果想根据内容判断是否为重复元素,需要重写元素的equals方法。

     (2)HashSet的contains、add判断元素重复的原理

     add():添加指定元素

    contains():当set中含有元素的时候,返回true

    Set集合不能存放重复元素,其添加方法在添加时会判断是否有重复元素,有重复不添加,没重复则添加。

    HashSet集合由于是无序的,其判断唯一的依据是元素类型的hashCode与equals方法的返回结果。规则如下:

    先判断新元素与集合内已经有的旧元素的HashCode值

     如果不同,说明是不同元素,添加到集合。

     如果相同,再判断equals比较结果。返回true则相同元素;返回false则不同元素,添加到集合。

    所以,使用HashSet存储自定义类型,如果没有重写该类的hashCode与equals方法,则判断重复时,使用的是地址值,如果想通过内容比较元素是否相同,需要重写该元素类的hashcode与equals方法。

     2、Map接口

     (1)Map接口介绍:

    Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。

     Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

     Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

     Collection中的集合称为单列集合,Map中的集合称为双列集合。

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

     Map中常用的集合为HashMap集合、LinkedHashMap集合。

     

     (2)Map接口中的常用集合

    Map有多个子类,我们主要介绍HashMap集合、LinkedHashMap集合。

     HashMap<K,V>:存储数据采用的哈希表结构(数组和链表的结合结构),元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

     LinkedHashMap<K,V>HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

     (3)Map接口中的常用方法

     get方法:获取指定键(key)所对应的值(value)

     put方法:将指定的键与值对应起来,并添加到集合中

     方法返回值为键所对应的值

    使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

    使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

    remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。

    (4)Map接口遍历

    键找值方式:即通过元素中的键,获取键所对应的值

    keySet()方法

    步骤:

    1、获取Map集合的键,因为键是唯一的,所以返回一个Set集合存储所有的键

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

    2、返回一个Set集合存储所有的键Set<String> set=map.keySet();

    3、

    遍历键的Set集合,得到每一个键

    4.根据键,获取键所对应的值

    流程图:

    entrySet();方法

    Map类设计时,提供了一个嵌套接口:Entry,Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

    Entry是Map接口中提供的一个静态内部嵌套接口。

     

    entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

     getKey()方法:获取Entry对象中的键

     getValue()方法:获取Entry对象中的值

    entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

    map方法、遍历练习:两种方法:keySet和entrySet

    package demo02;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    public class Demo02 {
    
        public static void main(String[] args) {
            Map<String,String> map=new HashMap<String,String>();
            //Map的常用方法
            map.put("1", "a");
            map.put("2", "b");
            map.put("2", "z");
            map.put("3", "c");
            //移除
            map.remove("3");
            //取数据
            System.out.println(map.get("1"));
            System.out.println(map.get("2"));
            System.out.println(map.get("3"));
            //遍历keySet()
            //第一步=获取map中的key锁对象应的Sst集合
            Set<String> set=map.keySet();
            //第二部遍历set找到每一个key值
            for(String s:set){
                String key=s;
                String value=map.get(key);
                System.out.println(key+" "+value);
            }
            //2、entryset()遍历
            Set<Map.Entry<String, String>>s1=map.entrySet();
            for(Map.Entry<String, String> e:s1){
                String key=e.getKey();
                String value=e.getValue();
                System.out.println(key+" "+value);
            }
            //简写
            for(Map.Entry<String, String> e:map.entrySet()){
                System.out.println(e);
            }
    
        }
    
    }

     可变参数

    格式:

    修饰符 返回值类型 方法名(参数类型... 形参名){  }

     等价于:

    修饰符 返回值类型 方法名(参数类型[] 形参名){  }

    package demo02;
    
    public class Demo06 {
    
        public static void main(String[] args) {
            System.out.println(add(1,2,3,45));
            System.out.println(add(3,5,7,9));
    
        }
        //想要做一个求和的方法,单参数个数不一定,类型一定,int
        public static int add(int...a){
            int sum=0;
            for(int i:a){
                sum=sum+i;//相等于sum+=i;
            }
            return sum;
        }
    
    }

     集合嵌套

     ArrayList嵌套 ArrayList

        ArrayList< ArrayList<String> >
        Collection< ArrayList<Integer> >

     Map嵌套 ArrayList

    HashMap<String, ArrayList<Person>>
    
    ArrayList< HashMap<String, String>>

    l Map集合嵌套的遍历

    HashMap<String, HashMap<String,String>>
    
    HashMap<String, HashMap<Person,String>>
    package demo05;
    
    import java.util.HashMap;
    import java.util.Set;
    
    public class Demo02 {
    
        public static void main(String[] args) {
            method();
        }
        public static void method(){
            HashMap<String, HashMap<String,String>> map=new 
                    HashMap<String, HashMap<String,String>>();
            HashMap<String,String> m1=new HashMap<String,String>();
            m1.put("1", "王二");
            m1.put("2", "张三");
            HashMap<String,String> m2=new HashMap<String,String>();
            m2.put("3", "李四");
            m2.put("4", "王五");
            map.put("一中", m1);
            map.put("二中", m2);
            Set<String>school=map.keySet();
            for(String s:school){
                String sch=s;
                HashMap<String,String>classes=map.get(sch);
                Set<String>class1=classes.keySet();
                for(String ss:class1){
                    String classname=ss;
                    String stuname =classes.get(classname);
                    System.out.println("学校为"+sch+",班级为"+
                            classname+",姓名为"+stuname);
                }
            }
        }
    }
    package demo05;
    
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Demo01 {
    
        public static void main(String[] args) {
            method();
        }//HashMap<String, HashMap<String,String>>
        public static void method(){
            HashMap<String, HashMap<String,String>> map=new 
                    HashMap<String, HashMap<String,String>>();
            HashMap<String,String> m1=new HashMap<String,String>();
            m1.put("1", "王二");
            m1.put("2", "张三");
            HashMap<String,String> m2=new HashMap<String,String>();
            m2.put("3", "李四");
            m2.put("4", "王五");
            map.put("一中", m1);
            map.put("二中", m2);
            Set<String> school=map.keySet();
            for(String s:school){
                String sch=s;
                HashMap<String,String> classes=map.get(sch);
                Set<String>class1=classes.keySet();
                for(String ss:class1){
                    String classname=ss;
                    String stuname=classes.get(classname);
                    System.out.println("学校为"+sch+",班级为"+
                            classname+",姓名为"+stuname);
                }
            }
            
        }
    
    }
  • 相关阅读:
    解决 Cordova 打包 vue项目为 APP 后,在安卓平台下 touchMove 事件不生效的问题
    解决微信内置浏览器里,下拉无法捕获 touchEnd 事件
    记录 React-native 项目中的各种坑坑
    内存型游戏外挂讲解
    浅谈数据抓取的几种方法
    php链表笔记:合并两个有序链表
    php链表笔记:链表的检测
    php链表笔记:单链表反转
    使用UUID和int自增主键的区别
    lumen框架使用Elasticsearch详解
  • 原文地址:https://www.cnblogs.com/yang1182/p/9765663.html
Copyright © 2020-2023  润新知