zoukankan      html  css  js  c++  java
  • 3.1 JAVA集合框架以及区别

    • 一、为什么常用集合而不用数组?
    引用集合代替数组,数组初始化必须声明长度,容易引起资源浪费以及资源占用不足,常常数组下边越界。
    ArrayList不用定义长度,每增加一个元素都会增加长度,避免了数组下标越界的问题。
    • 二、集合是什么?
    Java集合类存放于 java.util 包中,是一个用来存放对象的容器。
    注意:1、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
       2、集合存放的是多个对象的引用,对象本身还是放在堆内存中。
       3、集合可以存放不同类型,不限数量的数据类型。
    • 三、集合框架的原则和目标
    1、该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
    2、该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
    3、对一个集合的扩展和适应必须是简单的。
    JAVA集合框架图如下所示:
                
    接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
    实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
    算法:Collections是算法实现的帮助类,实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
    java集合框架位于java.util包中。
        集合接口概述:
    1. Collection 接口:是最基本的集合接口 ,Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。Collection 接口存储一组不唯一,无序的对象。
    2. List 接口: 是一个有序的 Collection,能够通过索引(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
    3. Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。
    4. SortedSet 继承于Set保存有序的集合。
    5. Map 接口存储一组键值对象,提供key(键)到value(值)的映射。
    6. Map.Entry 描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
    7. SortedMap继承于 Map,使 Key 保持在升序排列。
    8. Enumeration这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。
        集合实现类概述:
    1. AbstractCollection 实现了大部分的集合接口。
    2. AbstractList 继承于AbstractCollection 并且实现了大部分List接口。
    3. AbstractSequentialList 继承于 AbstractList ,提供了对数据元素的链式访问而不是随机访问。
    4. LinkedList该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。Listlist=Collections.synchronizedList(newLinkedList(...)); LinkedList 查找效率低。
    5. ArrayList该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。
    6. AbstractSet继承于AbstractCollection 并且实现了大部分Set接口。
    7. HashSet该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
    8. LinkedHashSet具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
    9. TreeSet该类实现了Set接口,可以实现排序等功能。
    10. AbstractMap 实现了大部分的Map接口。
    11. HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
    12. TreeMap 继承了AbstractMap,并且使用一颗树。
    13. WeakHashMap 继承AbstractMap类,使用弱密钥的哈希表。
    14. LinkedHashMap继承于HashMap,使用元素的自然顺序对元素进行排序.
    15. IdentityHashMap 继承AbstractMap类,比较文档时使用引用相等。
        java.util包中定义的类:
    1.   Vector 该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。
    2. Stack栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
    3. Dictionary类是一个抽象类,用来存储键/值对,作用和Map类相似。
    4. Hashtable 是 Dictionary(字典) 类的子类,位于 java.util 包中
    5. Properties 继承于 Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。
    6. 一个Bitset类创建一种特殊类型的数组来保存位值。BitSet中数组大小会随需要增加。
    • 四、遍历方法

        1.Array的遍历

        public static void main(String[]args){
            List<String> it = new ArrayList();
            it.add("I");
            it.add("want");
            it.add("you");
            //第一种遍历方法使用 For-Each 遍历 List
            System.out.println("ArrayList的第一种遍历的方式");
            for(String str: it){
                System.out.println(str);
            }
    
            //第二种遍历,把链表变为数组相关的内容进行遍历
            System.out.println("ArrayList的第二种遍历的方式");
            String[] str = new String[it.size()];
            it.toArray(str);
            // 或者for(int i=0;i<strArray.length;i++)
            for(String st: str){
                System.out.println(st);
            }
    
            //第三种遍历 使用迭代器进行相关遍历
            System.out.println("ArrayList的第三种遍历的方式");
            Iterator<String> ite = it.iterator();
            while (ite.hasNext()){
                System.out.println(ite.next());
            }
        }

        2.Map的遍历方式

     

       public static void main(String[]args){
            Map<String,String> map = new HashMap<>();
            map.put("1","you");
            map.put("2","love");
            map.put("3","me");
            
            //第一种:普遍使用,二次取值
            System.out.println("通过Map.keySet遍历key和value:");
            for(String key : map.keySet()){
                System.out.println("keys"+ key + "Values" + map.get(key));
            }
    
            //第二种
            System.out.println("通过Map.entrySet使用iterator遍历key和value:");
            Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
            while(it.hasNext()){
                Map.Entry<String,String> key = it.next();
                System.out.println("keys"+ key + "Values" + map.get(key));
            }
    
            //第三种:推荐,尤其是容量大时
            System.out.println("通过Map.entrySet遍历key和value");
            for(Map.Entry<String,String> str: map.entrySet()){
                System.out.println("keys"+ str.getKey() + "Values" + str.getValue());
            }
    
            //第四种,只遍历value
            System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
            for (String v : map.values()) {
                System.out.println("value= " + v);
            }
        }
  • 相关阅读:
    [LeetCode 1029] Two City Scheduling
    POJ 2342 Anniversary party (树形DP入门)
    Nowcoder 106 C.Professional Manager(统计并查集的个数)
    2018 GDCPC 省赛总结
    CF 977 F. Consecutive Subsequence
    Uva 12325 Zombie's Treasure Chest (贪心,分类讨论)
    Poj 2337 Catenyms(有向图DFS求欧拉通路)
    POJ 1236 Network of Schools (强连通分量缩点求度数)
    POJ 1144 Network (求割点)
    POJ 3310 Caterpillar(图的度的判定)
  • 原文地址:https://www.cnblogs.com/Smileing/p/11379467.html
Copyright © 2011-2022 走看看