zoukankan      html  css  js  c++  java
  • java中的集合类

    一、集合类

    Java集合类主要由2个接口派生过来:Collection接口和Map接口

    •  什么是集合类?

     集合类主要负责保存、盛装其他数据,因此又将集合类称为容器类,本质上是一种数据结构!
     就是一种为了对多个对象进行操作而进行存储的方式。

    • 集合类与数组的区别是什么? 

      数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,数组长度固定。


      集合:只能存储对象,长度可变,可以存储不同类型的对象。

    • 为什么出现那么多种集合的原因是什么?

      每一种(集合)容器对数据的存储方式都有所不同,这个存储方式为:数据结构。

    集合关系图:

     

    二、Collection

    Collection是一个集合接口。

     Collection的子接口:
     Set,List,Queue这几个子接口。下面将会详细说明。

    • 增加对象:boolean add(Object object) 如果集合中没有object,那么添加它并返回true;

         如果集合中存在object(且该集合不能包含重复元素),则返回false。
         另外:集合中存储的都是对象的引用(地址)。(Object可以放入任何对象)

    • 获取长度:
      • int size(): 返回此集合中的元素个数。
    • 删除元素:
      • void clear(): 清楚集合中的所有元素(除非该集合不支持clear方法)。
      • boolean remove(Object o): 删除集合中所有e.equals(e)==true的元素,并返回true。否则返回false。         
      • (Arraylist中改写为:移除相等的首个元素)
      • Boolean removeAll(Cellection c): 移除和集合c 的交集中的元素。
    • 判断元素:
      • Boolean contains(Object o):判断集合中是否包含元素(对象)o。
      • boolean containsAll(Collection c):判断集合c是否是调用集合的子集。 
    • 交集:
      • boolean retainAll(Cellection c): 仅保留和集合c的交集     

    三、元素的取出(迭代器)

    迭代器: 就是一个Iterator接口的子类对象,封装了取出其绑定集合的元素的方式。

    步骤:

    • 通过调用集合的 Iterator iterator()方法返回该集合的迭代器,
    • 将此迭代器赋值给 一个 Iterator 型对象引用。
    • 通过此引用,调用迭代器的方法操作集合:
      • boolean hasNext():如果集合中任有元素可以迭代,则返回true。
      • Object next():返回迭代的下一个元素(列表中还在)。  
      • void remove():从迭代器指向的集合中 移除 迭代器返回的最后一个元素。            

       注意:你不能同时用迭代器和集合同时去操作同一组元素, 有可能会抛出并发异常。
       原因:迭代器已经创建, 之后通过集合方法操作的元素过程(比如说增加),迭代器并不知道集合做了什么操作,还是只能
       按照原来的元素列表操作,就会发生错误。 

    List 接口

    特点:元素是有序的, 而且元素可以重复。 该类集合中有索引(角标)。

    List 特有的常见方法:

    1. 凡是可以操作索引的方法都是List集合特有的方法。
    • 增:

        void add(int index ,Object object);
        Boolean add(int index, Collection c);

    • 删:

        remove(index):返回了移除的元素。

    • 改:

        set(index, element):在指定角标放入指定元素,返回原来的元素。

    • 查:

        get(index):返回index上的元素
        subList(start,end):返回一个自己列表(依赖于原集合)

     注:List集合特有的迭代器: listIterator(); 列表迭代器 (注意与iterator区别)

    listIterator: 

    • 定义:

        是iteretor的子接口。
        在进行迭代操作的时候,不能使用集合方法对同组元素进行操作(原因在iterator讲解处)。
        而iterator的操作方法又比较少(只有判断、查找、删除,没有添加),局限了对元素组的课操作性。
        所以在list集合中就定义了新的迭代器: listIterator。

    • listIterator中新增的方法:
      • void add(): 在返回的元素后面的加入一个新元素
      • void set(object): 使用新元素替换返回的最后一个元素。
      • Boolean hasPrevious(): 逆向遍历列表(相对应: hasNext())

            
        list 集合在涉及到需要判断元素是否相同时,底层调用的都是equals方法。(contains、 remove方法等) 

    list集合下,常见三大集合

    • ArrayList:底层数据结构使用数组结构: 查询速度快。但是增删稍慢。(线程不同步,数组0.5倍延长)
    • Linkedlist:底层使用链表数据结构: 增删块, 但是查询慢。
    • Vector:底层是数组数据结构:查询赠删慢(线程同步,数组百分百延长)已经被ArrayList取代。

    Set (接口)

    特点:元素是无序(存入和取出的顺序不一定一致)的,而且元素不能重复。 该类集合中没有索引。

    Set集合下常见的子类集合:HashSet、TreeSet

    HashSet:          

    特点:元素无序(存入和取出的顺序一定不一样),而且元素唯一,没有索引。

    底层数据: 底层使用哈希表作为数据结构。


    元素唯一性: 是通过元素的两个方法: hashCode 和 equals 来完成的。
    如果两个元素的HashCode值相同,就会判断equals是否为true。
    如果两个元素的HashCode值不同,就不会调用equals方法。

    Demo:

    1 ArrayList<String> list = new ArrayList<Stirng>();
    2 
    3  list.add("hello");
    4 
    5  list.add("world");
    6 
    7  System.out.print("此列表中的元素分别为:"+list);
    8 
    9  System.out.print("此列表中的元素个数为:"+list.size());


    注意:对于判断元素是否存在、删除等操作,都依赖于元素的hashCode、equals等方法。

    Map接口

    map也是一个接口集合,只不过和Collection不同的是,map是以键值对的方式存储数据。
    Map代表具有映射关系的集合

    • map下的实现类
      • HashMap

     HashMap

    HashMap:主要存储“键-值”对,不允许键重复,但允许值重复。

    常用方法:

       public void put(Object key,Object value):向列表中添加一对“键-值”。

       public Object get(Object key):返回键值key对应的元素。

    Demo:

     1 HashMap<String, Student> map = new HashMap<String, Student>();
     2 
     3    map.put("username", "张三");
     4 
     5     map.put("password", "123456");
     6 
     7 System.out.print("学生姓名为:"+map.get("username")+"
    "+"学生密码为:"+map.get("password"));
     8 
     9 
    10 Student zs = new Student(1,"张三"); 
    11 
    12 HashMap<int, Student> map = new HashMap<int, Student>();
    13 
    14  map.put(zs.getId(), zs);
    15 
    16  System.out.print("学生姓名为:"+map.get(map.get(1)).getName()+"
    "+"学生编号为:"+map.get(map.get(1)).getId());

  • 相关阅读:
    自动化测试工具Telerik Test Studio发布R1 2019|附下载
    DevExpress ASP.NET Core Controls v18.2新功能详解
    DevExpress WinForms使用教程:Diagram Control
    JDK1.8源码——java.util.Arrays 类
    JDK1.8源码——java.util.HashMap 类
    哈希表
    JDK1.8源码——java.lang.String 类
    HDU1811 Rank of Tetris (并查集)
    CF149D Coloring Brackets (区间dp)
    POJ2464 Brownie Points II(树状数组+思维)
  • 原文地址:https://www.cnblogs.com/lhy-549/p/10069822.html
Copyright © 2011-2022 走看看