zoukankan      html  css  js  c++  java
  • Java集合框架


    早在Java2中之前,Java就提供了特设类。比如:DIctionary,Vector,Stack和Properties这些类用来存储和操作对象组。

    虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用Vector类的方式和使用Properties类的方式有着很大不同。

    集合框架被设计成要满足以下几个目标。

    • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
    • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
    • 对一个集合的扩展和适应必须是简单的。

    为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如:LinkedList,HashSet和TreeSet等,除此之外你也可以通过这些接口实现自己的集合。

     从上面的集合框架图可以看到,Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储 键/值对映射。Collection接口又有三种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。

    集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含以下内容:

    • 接口:是代表集合的抽象数据类型。例如Collection、List、Set、Map等。之所以定义多个接口,是为了以不同的方式操纵集合对象。
    • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
    • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

    除了集合,该框架也定义了几个Map接口和类。Map里存储的是键/值对。尽管Map不是集合,但是它们完全整合在集合中。

    集合框架体系如图所示:

     Java集合框架提供了一套性能优良,使用方便的接口和类,Java集合框架位于java.util包中,所以当使用集合框架的时候需要进行导包。


    集合接口

    集合框架定义了一些接口。

    Set和List的区别

    1. Set接口实例存储的是无序的,不重复的数据。List接口实例存储的是有序的,可以重复的元素。
    2. Set检索效率的地下,删除和插入效率高,插入和删除不会引起元素位置改变。实现类有HashSet,TreeSet。
    3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。实现类有ArrayList,LinkedList,Vector。

    集合实现类(集合类)

    Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。

    标准集合类汇总于下表:

    参照网址


    集合算法

    集合框架定义了几种算法,可用于集合和映射。这些算法被定义为集合类的静态方法。

    在尝试比较不兼容的类型时,一些方法能够抛出ClassCastException异常。当试图修改一个抛出UnsupportedOperationException异常。

    集合定义三个静态的变量:EMPTY_SET,EMPTY_LIST,EMPTY_MAP。这些变量都不可以改变。


    如何使用迭代器

    通常情况下,你会希望遍历一个集合中的元素。例如,显示集合中的每个元素。

    一般遍历数组都是采用for循环或者增强for(for-each???),这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator接口或者ListIterator接口。

    迭代器,使你能够通过循环来得到或者删除集合的元素。ListIterator继承了Iterator,以允许双向遍历列表和修改元素。

    遍历ArrayList

    package pkg2020华南虎;
    
    import java.util.*;
    
    /**
     *
     * @author yl
     */
    public class ArrayListDemo {
    
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("Hello");
            list.add("World");
            list.add("HAHAHA");
            //For-Each
            for (String str : list) {
                System.out.println(str);
            }
            //把链表变为数组相关的内容进行遍历
            String[] strArray = new String[list.size()];
            list.toArray(strArray);
            for (String str : strArray) {
                System.out.println(str);
            }
            //使用迭代器进行相关遍历
            Iterator<String> ite = list.iterator();
            while (ite.hasNext()) {
                System.out.println(ite.next());
            }
        }
    }
    

      

    解析:

    三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历过程中会超过集合的长度。

    遍历Map

    package pkg2020华南虎;
    
    import java.util.*;
    
    /**
     *
     * @author yl
     */
    public class MapBianliDemo {
    
        public static void main(String[] args) {
            Map<String, String> map = new HashMap<String, String>();
            map.put("1", "value1");
            map.put("2", "value2");
            map.put("3", "value3");
    
            //普遍使用,二次取值
            System.out.println("通过Map.KeySet遍历key和value:");
            for (String key : map.keySet()) {
                System.out.println("key=" + key + "and value=" + map.get(key));
            }
    
            //second
            System.out.println("通过Map.entrySet使用iterator遍历key和value:");
            Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, String> entry = it.next();
                System.out.println("Key=" + entry.getKey() + "and value=" + entry.getValue());
            }
    
            //推荐,尤其是容量大时
            System.out.println("通过Map.entrySet遍历key和value");
            for (Map.Entry<String, String> entry : map.entrySet()) {
                System.out.println("key=" + entry.getKey() + "and value=" + entry.getValue());
            }
    
            //第四种
            System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
            for (String v : map.values()) {
                System.out.println("value=" + v);
            }
        }
    }
    

    使用比较器  

    TreeSet和TreeMap的按照排序顺序来存储元素,然而,这是通过比较器来精确定义按照什么样的排序顺序。这个接口可以让我们以不同的方式来排序一个集合。


    总结

    Java集合框架为程序员提供了预先包装的数据结构和算法来操纵它们。

    集合是一个对象,可以容纳其他对象的引用。集合接口声明对每一种类型的集合可以执行的操作。

    集合框架的类和接口均在java.util包中。

    任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。


    什么他妈的叫他妈的惊喜!
  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/2020yl/p/12294535.html
Copyright © 2011-2022 走看看