zoukankan      html  css  js  c++  java
  • Java——容器类(集合类)

    在编程的过程中,多数据的存储及应用都是比较麻烦的事,以前我就只知道用数组和自己写封装类来解决,但是这两种方法在一些功能中并不适用,比如我们要根据数据库中其中一个表的数据弄一个下拉菜单的内容,这个时候我们需要从数据库获取显示给用户看的内容及对应的id。在这种情况中,因为在数据库中的这种一对的数据一般都是有好几个的,所以封装类并不适用,而数组只能存储单一的一种数据类型,并且只能通过游标获取对应的值,还有最麻烦的是数组在初始化的时候必须初始化长度,所以也数组也不太适用,这个时候我们可以使用java官方提供的容器类集合类)。

      容器类集合类)是java官方提供给我们的存储方式,它扩展了数组使用上的自由度,如:长度可变,可存储多种数据类型的数据等。容器类在java体系中并不仅仅是一个类,而是很多的容器类所构成的一个框架、体系,不同的容器类具有不同的存储方式,因为容器类太多,所以java官方制定了一系列接口,所有的容器类都得已实现。

      常用的容器类大致可分为三大类:List、Set、Map

      首先介绍一下List:

      List是有顺序的,其中常用的主要有Vector、ArrayList、LinkedList三个容器类List的主要使用方法如下:

      

    复制代码
            //ArrayList ls=new ArrayList();
            //更多情况是如下定义
            List ls=new ArrayList();
            
            //问题: 为什么要这样定义?
            //某些情况下面,可能需要切换实现类
            //LinkedList ls=new LinkedList();//改变太大,如果,下面有人调用到List接口没有方法
            //List ls=new LinkedList();//不管换什么实现类,都没问题,因为接口没变
            
            //-----------------------------------------------------------------------------------
            
            //List 可以存放任意类型的数据
            //其实,所有类都是Object类的子类,存入的时候,将所有类型都打散成为Object
            //因此,拿出来的时候,肯定需要转换
            String a="a";
            int i=10;
            double d=1000.0;
            
            ls.add(a);
            ls.add(i);
            ls.add(d);
            
            //有顺序,可以根据元素的索引/游标访问元素
            String a2=(String)ls.get(0);
            //int i2=(int)ls.get(1);//int 是基本数据类型,不是封装类,没法直接转换
            int i2=(Integer)ls.get(1);
            double d2=(Double)ls.get(2);
            
            //如果是jdk1.5以上,可以使用泛型
            //泛型:限制只能存储某一类型
            List<String> ls2=new ArrayList<String>();
            ls2.add("a");
            ls2.add("b");
            ls2.add("c");
            
            String s=ls2.get(0);//无须再转换
            
            //-----------------------------------------------------------------------------------
                    
            //你接到一个别人发过来的List,如何取出里面所有数据
            for(int j=0;j<ls2.size();j++){
                System.out.println(ls2.get(j));
            }
            
            //或者转换成迭代器遍历出来
            Iterator it=ls2.iterator(); 
            while(it.hasNext()){ 
                System.out.println(it.next()); 
            } 
    复制代码

      而在上面提到的三个常用的List容器类中,ArrayList和Vector都是使用数组方式存储数据,这两个容器类都是通过使用数组实现的,所以索引数据速度快,但是由于插入数据时涉及数组元素移动内存操作,所以插入数据速度较慢,而由于Vector中的方法都是线程安全的,即所有方法都添加了同步锁synchronized,所以性能上要比ArrayList要差。

      LinkedList是使用双向链表实现存储的,在索引数据时需要进行向前或向后的遍历,但是在插入数据时只需记录本项的前后项即可,所以其索引数据慢插入数据快

       Set是无序的,其中是不能包含重复元素的,其中常用的主要有:HashSet、TreeSetSet的主要使用方法如下:

      

    复制代码
         Set hs=new HashSet();//不能插入重复数据
            //List hs = new ArrayList();//可以插入重复数据
            
            Student s=new Student(1,"zhangsan");
            hs.add(s); 
            s.name="edit";
            
            boolean isAdded = hs.add(s); //重复数据,不能再插入
            System.out.println(isAdded); //false
            
            hs.add(new Student(2,"lisi")); 
            hs.add(new Student(3,"wangwu")); 
            hs.add(new Student(1,"zhangsan"));//这不是重复数据,是一个新的对象 
            
            //-----------------------------------------------------------------------------------
            
            //无顺序,只能迭代取值,顺序会有不一定的情况。
            Iterator it=hs.iterator(); 
            while(it.hasNext()){ 
                System.out.println(it.next()); 
            } 
    复制代码

      HashSet是无顺序的,而TreeSet是有顺序的,但是TreeSet的顺序与List那样按插入的先后排序不同,它是按照元素对象自己定义的排序规则进行排序的,因此前者允许放入null,且效率较高,而后者不允许放入null,且效率较低。

      Map是以键值对的方式存储数据的一种容器类,其中常用的主要有:HashMap、HashTable、TreeMapMap的主要使用方法如下:

      

    复制代码
           HashMap hm=new HashMap();
            //HashMap<String,String> hm=new HashMap<String,String>();  
            
            String a="a";
            int i=10;
            double d=1000.0;
            //put(键,值)
            hm.put("zfc",a);
            hm.put("zx",i);
            hm.put(3,d);
            //hm.put(3,12.0);    //key相同,覆盖已有value
            
            String a2=(String)hm.get("zfc");        
            int i2=(Integer)hm.get("zx");
            double d2=(Double)hm.get(3);
            System.out.println(a2+"  "+i2+"  "+d2);
            
            
            //遍历方式1:建议方式,效率高一些
            Iterator iterator = hm.keySet().iterator();//Iterator迭代器,按key来迭代遍历
            while(iterator.hasNext()) {
                System.out.println(hm.get(iterator.next()));
            }
            
            //遍历方式2
            Iterator it = hm.entrySet().iterator();//Iterator迭代器,按entry来迭代遍历
            while(it.hasNext()){
                java.util.Map.Entry entry = (java.util.Map.Entry)it.next();
                // entry.getKey() 返回与此项对应的键
                // entry.getValue() 返回与此项对应的值
                System.out.println(entry.getValue());
            } 
    复制代码

      HashMap允许有空键(null)与空值(null),非线程安全,效率较高。

      HashTable不允许有空键(null)与空值(null),线程安全,效率较低。

      TreeMap能把其保存的记录根据key排序(类似TreeSet),默认是按照key的默认排序,但也可指定排序的比较器,在用迭代器迭代遍历时,得到的记录是排序以后的,TreeMap不允许有空键(null)但可以有空值(null)。

  • 相关阅读:
    SolarWinds Orion API 远程代码执行漏洞(CVE-2020-10148)
    Lanproxy 路径遍历漏洞 (CVE-2021-3019)
    公众号文章集合-2020整理回顾
    PHPMailer远程命令执行漏洞复现
    SaltStack Shell 注入 (CVE-2020-16846)漏洞
    (CVE-2020-7961)Liferay Portal RCE 反序列化命令执行漏洞
    (CVE-2020-17530)Struts2 S2-061 远程命令执行漏洞复现
    ora-01722 无效数字
    公开课平台推荐
    PL/SQL Developer如何导出数据成sql的insert语句
  • 原文地址:https://www.cnblogs.com/Lin-Even/p/5727722.html
Copyright © 2011-2022 走看看