【java】容器

x33g5p2x  于2021-03-13 发布在 Java  
字(2.7k)|赞(0)|评价(0)|浏览(395)

提到集合我们自然会想到数组,在平时编程时数组的使用让我们的代码更简单容易理解。但是数组的一些特性有时也不能满足我们的需要。比如数组的长度是固定的,而集合的长度是可变的。

下面我们就一起来看看集合。

下图是一张集合的继承关系图.Collection接口是层次结构中的根接口.通常不能直接使用,但是该接口提供了添加和删除元素、管理数据的方法。由于list和set接口都实现了Collection接口,因此这些方法对List集合和Set集合都是通用的。

List(列表)

List部分分为list接口和两个实现类Arraylist和Linkedlist。

List接口中适合于自身的方法都与索引有关。List集合以线性方式存储对象,因此可以通过对象的索引来操作对象。

1.ArrayList

该类实现了可变的数组,允许所有的元素,包含null。可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入对象或删除对象的速度较慢

List<String>list1=new ArryaList<String>();

2.LinkedList

该类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象。但是随机访问集合中的对象时效率较慢。

List<String> list2=new LinkedList<String>();

Set(集合)

Set集合中不允许存在重复值。而且集合中的对象是无序的,遍历set集合的结果与插入set集合的结果不一定是相同的。在实际的使用中,我们使用最多的特性是set能够去掉重复的元素并获取响应的数据。

Set的实现类为TreeSet和HashSet。TreeSet和HashSet的不同就是前者存入的时候会按照一定的顺序存入,Treeset是一个有序的集合,默认的情况下按照自然顺序进行排序。HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

Map(映射)

Map接口中提供了将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值。由于Map集合中的元素是通过Key,value进行存储的。要获得集合中指定的key值和value值,需要先通过相应的方法获取key集合或value集合。再遍历key集合或value集合获取指定值。

1.HashMap

此实现提供了所有可选的映射操作,并允许使用null值和null键。但必须保证键的唯一性。HashMap通过哈希编码对齐内容的映射关系进行快速查找。此类不保证映射的顺序,

2.TreeMap

该类实现了Map接口和storedMap接口。因此集合中的映射关系具有一定的顺序。但是在添加。删除和定位上比Hashmap性能要差一些。由于TreeMap类实现的Map集合中的映射关系是按照一定的顺序排列的,因此不能为null值。

在使用过程中可以通过HashMap类创建Map集合,当需要顺序输出时,再创建一个完全相同的映射关系额TreeMap类实例。

(该实例表示了将HashMap表示成TreeMap)

public static void main(String[] args) {
      Map map=new HashMap();//定义一个hashmap
      
      map.put("李","李");//向容器中添加数据
      map.put("王","王");
      map.put("赵","赵");
      map.put("钱","钱");
             
        Set set=map.keySet();//获取Map集合中的key对象集合
        
        Iterator it=set.iterator();
        while(it.hasNext())
        {//遍历Map集合
            String str=(String)it.next();
            String name=(String)map.get(str);//通过key得到value值
            System.out.println(str+""+name);//输出HashMap类实现的集合(无序)
        }
        
        TreeMap treemap=new TreeMap();
        treemap.putAll(map);//向集合中添加对象,将HashMap转换为TreeMap;
        Iterator iter=treemap.keySet().iterator();
        while(iter.hasNext()){
        String str=(String ) iter.next();
        String name=(String)map.get(str);
         System.out.println(str+""+name);//输出Treemap类实现的集合(有序)
        }
    }

迭代器

从上面我们可以看到java中有这么多的接口。对数据容器的操作在很多的时候都有很多相同的地方,于是java采用迭代器这种公共的操作接口。使用java迭代器可以使得对容器的遍历操作完全与底层隔离,可以达到极好的解耦效果。

所有实现了Collection接口的容器都有一个iterator方法用以返回一个实现了Iterator接口的对象。

public class IteratorDemo {
    public static void main(String[] args) {
       List<Integer> list=new ArrayList<Integer>();
       for(int i=0;i<10;i++)
       {
           list.add(i);
       }
       System.out.println("以下是列表中的元素");
      
       for ( Iterator<Integer> it=list.iterator();it.hasNext();)//使用迭代器
       {
           System.out.println(it.next());
       }
    }
    
}

总结:

在容器中我们可以看到分为了三类:列表(List),集合(Set)和映射(Map)不同的容器让我们在不同的情况下去使用。比如List,方便通过索引查找对象。使用Set可以保证数据不重复,Map使用的是键值对。这些不同的容器各有千秋,掌握他们的一些特性能让我们写出更高效的程序。最后因为这些容器在操作上大致相同,所以写了一个统一的接口来提供一个统一的操作。

相关文章

微信公众号

最新文章

更多