zoukankan      html  css  js  c++  java
  • java集合之ArrayList,TreeSet和HashMap分析

           java集合是一个重点和难点,如果我们刻意记住所有的用法与区别则是不太现实的,
    之前一直在使用相关的集合类,但是没有仔细研究区别,现在来把平时使用比较频繁的一些集合
    做一下分析和总结,目的就是以后在需要使用的时候能给找到适合的类。
          说到集合,先来看看数组,Array和集合相比,主要的问题是不能动态的改变长度,也不能删除元素,
    在某些场景下不适合使用,而集合的话会灵活很多。
          集合中我们常用的3个接口是:List,Set和Map,而对应的实现类常用的有ArrayList,TreeSet和HashMap,
    接下来就来总结一下这3个实现类的特点。
          Collection 是层次结构中的根接口,JDK 不提供此接口的任何直接实现:它提供更具体的
    子接口(如 Set 和 List)实现。
           Set,无序的,一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,
    并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
           List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
           Map和Collection接口没有关系,Map包含了key-value对,key唯一,value不唯一。
           接下来我们依次来说说最常用的ArrayList,TreeSet和HashMap。
    1. ArrayList是List接口的大小可变数组的实现,是一个其容量能够动态增长的动态数组。它继承了AbstractList,
    实现了List、RandomAccess, Cloneable, java.io.Serializable。
    基本的ArrayList,适合在随机访问元素的场景,但是在List中间插入和移除元素时较慢。对于频繁插入和删除的地方,
    适合使用LinkedList,基于链表的数据结构。ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
    同时,ArrayList的操作不是线程安全的!一般在单线程中才使用ArrayList。

    下面看一个简单的例子,看看ArrayList
    的使用:

    import java.util.*;
    
    public class ArraySort {
    public static void main(String[] args) {
        // 实例化一个List集合,用来存放int
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 100; i++) {// 执行100次for,获取随机整数,并放在集合中
            list.add((int) (Math.random() * 1000));
            //System.out.println(Math.random());
        }
        // 遍历
        Integer value = null;
        Iterator iter = list.iterator();
        while (iter.hasNext()) {
        value = (Integer)iter.next();
        System.out.println(value);
        }
        // 排序
        Collections.sort(list);
        // 打印,查看结果
        for (int i = 0; i < list.size(); i++) {
            if (i % 15 == 0) {
                System.out.println();
            }
            System.out.print(list.get(i) + " ");
        }
    }
    }

    具体方法的使用可以在用到的时候查询JDK API手册

    2.Set是无序的,而TreeSet是有序的,TreeSet的本质是一个"有序的,并且没有重复元素"的集合,它是通过TreeMap实现的。

    看一下具体的例子:

    import java.util.*;
    
    public class TreeSetTest {
       public static void main(String args[]) {
          // Create a tree set
          Set ts = new TreeSet();
          // Add elements to the tree set
          ts.add("Cherry");
          ts.add("Alinda");
          ts.add("Bay");
          ts.add("Floria");
          ts.add("David");
          System.out.println(ts);
       }
    }

    输出:[Alinda, Bay, Cherry, David, Floria],默认按照字典顺序升序排列
    此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行排序。
    3.HashMap基于哈希表的 Map 接口的实现。

    先来看看API手册中的说法:HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,
    初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。
    当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。
    再来看一下具体到code:

    import java.util.*;
    /**
     * @author 
     *
     */
    public class MapTest {
        public static void main(String[] args){
            Random r = new Random();
            Map<String,Integer> map=new HashMap<String,Integer>();
        
            map.put("one",r.nextInt(100));
            map.put("two",r.nextInt(100));
            map.put("three",r.nextInt(100));
            map.put("four",r.nextInt(100));
            map.put("five",r.nextInt(100));
        
            System.out.println("map:"+map);
            
            Integer integ = null;
            String key = null;
            Iterator iter = map.entrySet().iterator();
            while(iter.hasNext()) {
            Map.Entry entry = (Map.Entry)iter.next();
            // 获取key
            key = (String)entry.getKey();
            // 获取value
            integ = (Integer)entry.getValue();
            System.out.println("Key:"+key+" Value:"+integ);
            }
        }
    
    }

    以上主要是java集合的典型的几个类的简单介绍,需要在具体的场景下来仔细研究差异。

  • 相关阅读:
    shutil使用
    python解压压缩包
    python配置主机名
    ansible加速不管用
    重启sshd服务
    shell脚本安装python、pip-----非交互式的--批量执行函数
    查看日志
    etcd安全集群三节点扩容至四个节点
    ssh免密登录
    行为型模式之状态模式
  • 原文地址:https://www.cnblogs.com/practice-h/p/9042027.html
Copyright © 2011-2022 走看看