• Java容器


    在学Java以前,一说到存放东西,第一个想到的就是使用数组,使用数组,在数据的存取方面的却也挺方便,其存储效率高访问快,但是它也受到了一些限制,比如说数组的长度以及数组的类型,当我需要一组string类型数据的同时还需要Integer类型的话,就需要定义两次,同时,数组长度也受到限制,即使是动态定义数组长度,但是长度依然需要固定在某一个范围内,不方便也不灵活。

           如果说我想要消除上面的这个限制和不方便应该怎么办呢?Java是否提供了相应的解决方法。答案是肯定的,这就是Java容器,java容器是javaAPI所提供的一系列类的实例,用于在程序中存放对象,主要位于Java.util包中,其长度不受限制,类型不受限制,你在存放String类的时候依然能够存放Integer类,两者不会冲突。

            容器API类图结果如下所示:

             

    Collection接口

            Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

    举例:

     
    1. import java.util.*;  
    2. public class TestA{  
    3.     public static void main(String[] args)  
    4.     {  
    5.         Collection<String> lstcoll=new ArrayList<String>();  
    6.     lstcoll.add("China");  
    7.     lstcoll.add(new String("ZD"));  
    8.       
    9.         System.out.println("size="+lstcoll.size());  
    10.     System.out.println(lstcoll);  
    11.     }  
    12. }  

    结果:

           

    List接口

           List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,也就是说它是有顺序的,类似于Java的数组。和Set不同,List允许有相同的元素。J2SDK所提供的List容器类有ArrayList、LinkedList等。
    实例:
     
    1. import java.util.*;  
    2. public class TestB{  
    3.     public static void main(String[] args)  
    4.     {  
    5.         List<String> l1=new LinkedList<String>();  
    6.         for(int i=0;i<=5;i++){  
    7.             l1.add("a"+i);  
    8.         }  
    9.         System.out.println(l1);  
    10.         l1.add(3,"a100");  
    11.         System.out.println(l1);  
    12.         l1.set(6,"a200");  
    13.         System.out.println(l1);  
    14.         System.out.println((String)l1.get(2)+" ");  
    15.         l1.remove(1);  
    16.         System.out.println(l1);  
    17.     }  
    18. }  
    运行结果:
             

    ArrayList

            ArrayList其实就相当于顺式存储,它包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象时,数组的大小也相应的改变。这样就带来以下有特点:
           快速随即访问,你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素。
           向其中添加对象速度慢,当你创建数组时并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。
           操作其中对象的速度慢,当你要向数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。

    LinkedList

            LinkedList相当于链式存储,它是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有特点:
           操作其中对象的速度快,只需要改变连接,新的节点可以在内存中的任何地方。
           不能随即访问,虽然存在get()方法,但是这个方法是通过遍历接点来定位的,所以速度慢。

    Set接口

          Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
          Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
          Set容器类主要有HashSet和TreeSet等。

    HashSet

           此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
    举例:
     
    1. import java.util.*;  
    2. public class TestC{  
    3.     public static void main(String[] args)  
    4.     {  
    5.         Set <String> s=new HashSet<String>();  
    6.         s.add("Hello");  
    7.       
    8.     //相同元素  
    9.         s.add("Hello");  
    10.   
    11.         System.out.println(s);  
    12.     }  
    13. }  
    结果:
            

    Map接口

            值得注意的是Map没有继承Collection接口,Map接口是提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。即是一一映射,Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
            Map接口的实现类主要是包括HashMap和TreeMap等。

    HaspMap

             添加数据使用put(key, value),取出数据使用get(key),HashMap是允许null,即null value和null key。但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
    举例:
     
    1. import java.util.*;  
    2. public class TestD{  
    3.     public static void main(String[] args)  
    4.     {  
    5.         Map <String,String> M=new HashMap <String,String>();  
    6.         M.put("one",new String("1"));  
    7.         M.put("two",new String("2"));  
    8.         System.out.println(M);  
    9.     }  
    10. }  
    结果:
          

     

    总结

           Java容器实际上只有三种:Map , List, Set;但每种接口都有不同的实现版本.它们的区别可以归纳为由什么在背后支持它们.也就是说,你使用的接口是由什么样的数据结构实现的.
    List的选择:
             比如:ArrayList和LinkedList都实现了List接口.因此无论选择哪一个,基本操作都一样.但ArrayList是由数组提供底层支持.而LinkedList是由双向链表实现的.所以,如果要经常向List里插入或删除数据,LinkedList会比较好.否则应该用速度更快的ArrayList。
    Set的选择
             HashSet总是比TreeSet 性能要好.而后者存在的理由就是它可以维持元素的排序状态.所以,如果需要一个排好序的Set时,才应该用TreeSet。
    Map选择:
            同上,尽量选择HashMap。
     
     
     
    转 http://blog.csdn.net/dandanzmc/article/details/23447827
  • 相关阅读:
    Centos8 yum 源不可用
    Docker 容器开启SSH
    kubernetes calico 启动异常,无法访问etcd
    JEEGC相关笔记
    JS 的加减乘除 bobo
    go gin 项目热部署
    C#命名规范
    go 的定时器
    golang gin的安装和引入
    《十分钟冥想》摘要
  • 原文地址:https://www.cnblogs.com/jassy/p/6774651.html
Copyright © 2020-2023  润新知