• 浅谈集合框架二 List、Set常用方法


      最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。

      之前有介绍集合框架的体系概念(http://www.cnblogs.com/yjboke/p/8761195.html),本篇介绍一下常用方法及常用工具类。


    Collection→List→ArrayList:

     增(add)、删(remove)、改(set)、查(get)。

    List<String> alist = new ArrayList<String>();
        alist.add("abc1");                   //.add        增加
        alist.add("abc2");
        alist.add("abc3");
        alist.add("abc4");
        System.out.println(alist.get(2));   //.get         查询                
        System.out.println(alist.remove(1));//.remove      删除元素,并输出删除元素
        alist.set(1,"a");                   //.set         修改
        System.out.println(alist);        

    Collection→List→LinkedList:

    除了以上介绍的增删改查方法外还有LinkedList的特有方法。

    //在首末添加元素
    addFirst();
    addLast();
    //获取首末元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException
    getFirst();
    getLast();
    //获取首末元素,但会删除元素,如果集合中没有元素,会出现NoSuchElementException
    removeFirst();
    removeLast():
    //判断是否包含元素,如果包含返回true
    isEmpty
    -------------------------------------在JDK1.6出现了替代方法:----------------------------------------------------
    //添加元素
    offerFirst();
    offerLast();
    //获取元素,但不会删除元素,如果集合中没有元素,会返回null
    peekFirst();
    peekLast();
    //获取元素,但会删除元素,如果集合中没有元素,会返回null
    pollFirst();
    pollLast();
    alist.addFirst("abc1");                       //.addFirst在集合前添加  
            alist.addLast("abc4");                  //.addLast在集合后方添加
            System.out.println(alist);          //输出结果为:[abc3, abc2, abc1, abc4]
            System.out.println(alist.getFirst());    //获得首个元素
            System.out.println(alist.getLast());   //获得最后的元素
            System.out.println(alist.removeFirst());//删除首个元素,并输出元素值
            System.out.println(alist.removeLast()); //删除最后的元素,并输出元素值

    Collection→Set→HashSet:

    添加:add(添加元素);addAll(添加集合中所有元素)

    删除:remove(删除元素);

    查询集合长度:size

    查询是否存在:contains

    HashSet<String> set1 = new HashSet<String>();         //定义Set集合set1
            HashSet<String> set2 = new HashSet<String>();    //定义Set集合set2
            
            set1.add("abc1");                       //add:将set集合中添加元素
            set1.add("abc2");
            set1.add("abc3");
            set1.add("abc3");                       //添加重复元素不会添加进去,
            set2.addAll(set1);                      //addAll:将集合set1添加到set2中
            System.out.println(set1);               //输出内容为:[abc1, abc3, abc2] 无序
            System.out.println(set2);               //输出内容为:[abc1, abc3, abc2] 和set1相同
            set1.remove("abc2");                    //remove:删除元素
            System.out.println(set1);               //输出内容为:[abc1, abc3]
         System.out.println(set1.size());         //输出内容为:2 set1的长度
         System.out.println(set1.contains("abc1"));   //输出内容为:true

     使用HashSet存储自定义对象,包含重写hashCode和equals的方法

      首先定义一个手机类(Phone),包含价格(price)和名称(name);

     1 class Phone{
     2     
     3     private int price;
     4     private String name;
     5     
     6     Phone(int price,String name) {
     7         super();
     8         this.name = name;
     9         this.price = price;
    10     }
    11     
    12     public int getPrice(){
    13         return price;
    14     }
    15     public void setPrice(int price){
    16         this.price = price;
    17     }
    18     
    19     public String getName(){
    20         return name;
    21     }
    22     public void setName(String name){
    23         this.name = name;
    24     }
    25     
    26     public String toString(){
    27         return "Phone:price = "+price + ",name = " + name;                 //输出格式
    28     }
    29     //复写hashCode方法
    30     public int hashCode(){
    31         final int prime = 31;
    32         int result = 1;
    33         result = prime * result + price;
    34         result = prime * result + ((name == null) ? 0 : name.hashCode());
    35         return result;
    36     }
    37     //复写equals方法
    38     public boolean equals(Object obj){
    39         
    40         if(!(obj instanceof Phone)){
    41             throw new ClassCastException("类型不匹配");                    //也可写为:return false;
    42         }
    43         Phone p = (Phone)obj;
    44         System.out.println(this.name + " and " + p.name + "重复了");        //如果重复数据则打印输出
    45         return this.name.equals(p.name) && this.price==p.price;
    46     }
    47 }

      创建一个HashSet集合,并添加数据并输出,添加重复数据进行验证:

    public static void main(String[] args) {
            HashSet<Phone> hs = new HashSet<Phone>();                //定义HashSet集合
            hs.add(new Phone(4888, "xiaomi"));
            hs.add(new Phone(8388, "iphoneX"));
            hs.add(new Phone(8388, "iphoneX"));
            hs.add(new Phone(3288, "vivo"));                            //重复数据
            //迭代器输出
            for(Iterator<Phone> it = hs.iterator();it.hasNext();){
                System.out.println(it.next());
            }
        }

      输出结果为:

    iphoneX and iphoneX重复了
    Phone:price = 4888,name = xiaomi
    Phone:price = 3288,name = vivo
    Phone:price = 8388,name = iphoneX

    --------------------------------------------------------------------------------------------------------------

    Collection→Set→TreeSet:

      操作元素方式与HashSet相同,但TreeSet是有序的,现介绍TreeSet如何存储自定义对象。

      现封装一个Person类,其中有年龄和姓名两种属性,实现Comparable接口使元素具备比较性,并创建一个比较器。

     1 class Person implements Comparable{                //注:Comparable接口可让Person类具备比较性
     2     
     3     private int age;
     4     private String name;
     5     
     6     Person(int age,String name) {
     7         super();
     8         this.name = name;
     9         this.age = age;
    10     }
    11     
    12     public int getAge(){
    13         return age;
    14     }
    15     public void setAge(int age){
    16         this.age = age;
    17     }
    18     
    19     public String getName(){
    20         return name;
    21     }
    22     public void setName(String name){
    23         this.name = name;
    24     }
    25     
    26     public String toString(){
    27         return "年龄为 : "+age + ",姓名为: " + name;                 //输出格式
    28     }
    29     //比较器
    30     public int compareTo(Object obj){
    31         if(!(obj instanceof Person)){
    32             throw new ClassCastException("不是人");        //可用:return false;代替
    33         }
    34         Person p = (Person)obj;
    35         if(this.age > p.age){
    36             return 1;                                    //比较大小进行排序
    37         }
    38         if (this.age == p.age) {
    39             return this.name.compareTo(p.name);         //如果年龄相同则比较姓名,返回1、0、-1
    40         }
    41         return -1;
    42     }
    43 }

    创建一个TreeSet集合,并添加数据进行验证。

    public static void main(String[] args) {
            TreeSet<Person> hs = new TreeSet<Person>();                //定义HashSet集合
            hs.add(new Person(4888, "xiaomi"));
            hs.add(new Person(8388, "iphoneX"));
            hs.add(new Person(8388, "iphoneX"));                    //重复数据
            hs.add(new Person(3288, "vivo"));                            
            //迭代器输出
            for(Iterator<Person> it = hs.iterator();it.hasNext();){
                Person per = (Person)it.next();
                System.out.println(per.getAge() + "....." + per.getName() );
            }
        }

    输出结果为:

    3288.....vivo
    4888.....xiaomi
    8388.....iphoneX

    另:在不改变当前代码的前提下要求按照姓名排序。可定义一个类,实现Comparator接口,覆盖compare方法。

    class MyCompars implements Comparator{
        
        public int compare(Object o1,Object o2){
            Person s1 = (Person) o1;
            Person s2 = (Person) o2;
            int num = s1.getName().compareTo(s2.getName());
            //当名称相同时,比较年龄大小进行排序。
            if(num == 0){
                return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));     //与下方注释的方法意义相同。
                /*if (s1.getAge() > s2.getAge()) {
                    num = 1;
                }
                if(s1.getAge() == s2.getAge()){
                    num = 0;
                }
                return -1;*/
            }
            return num;
        }
    }

    然后将其传入到集合中:

    public static void main(String[] args) {
            TreeSet<Person> hs = new TreeSet<Person>(new MyCompars());                //定义HashSet集合
            hs.add(new Person(4888, "xiaomi"));
            hs.add(new Person(8388, "iphoneX"));
            hs.add(new Person(8188, "iphoneX"));                    //重复数据
            hs.add(new Person(3288, "vivo"));                            
            //迭代器输出
            for(Iterator<Person> it = hs.iterator();it.hasNext();){
                Person per = (Person)it.next();
                System.out.println(per.getAge() + "....." + per.getName() );
            }
        }

    输出结果为:

    8188.....iphoneX
    8388.....iphoneX
    3288.....vivo
    4888.....xiaomi

    总结:当元素自身不具备比较性或者所具备的比较性不是自己所需要的,就可以让容器自身具备比较性。当两种排序都存在时,以比较器为主。

  • 相关阅读:
    北京爱丽丝幻橙科技有限公司
    红杉资本中国基金:创业者背后的创业者
    关于我们_ | 腕表时代watchtimes.com.cn
    当你想放弃的时候,问一下自己你尽力了吗
    李圣杰_百度百科
    范思哲
    DOM Traversal Example | Documentation | Qt Project
    关于QT中evaluateJavaScript()函数返回值的处理问题
    JS获取整个HTML网页代码
    javascript
  • 原文地址:https://www.cnblogs.com/yjboke/p/8777629.html
Copyright © 2020-2023  润新知