精华内容
下载资源
问答
  • 集合类型
    千次阅读
    2019-07-08 13:15:23

    集合是一种类似于列表或者一维数组的数据结构;一个集合是由若干个元素(一大堆数据)组成的,集合中的每个元素位于列表中的一个固定索引处。有时候,集合中的一个元素叫做一行,对应的索引就叫做行号。

    同质元素:集合中的每一个元素的数据类型都是相同的。


    集合类型

    • 关联数组:是一个只能在PL/SQL环境使用的,一维的、没有边界的、稀疏的、由同质元素构成的集合类型;
    • 嵌套表:是一个一维的、没有边界的、由同质元素组成的集合类型;
    • VARRAY:是一个一维的、由同质元素组成的集合类型,是非稀疏的。

    属性

    关联数组

    嵌套表

    VARRAY

    纬度

    一维

    一维

    一维

    是否可用于SQL

    不可用

    可用

    可用

    是否可作为表中列的数据类型

    不可用

    可以;数据在“行外”保存的(一个单独的表)

    可以;数据保存在“行内”(在同一个表中)

    未初始化的状态

    空(不能是NULL),元素是未定义

    自动就是null的,元素的引用是非法的

    自动就是null的,元素的引用是非法的

    初始化

    在申明时自动完成

    通过构造函数,或者赋值,或者fetch操作完成

    通过构造函数,或者赋值,或者fetch操作完成

    在PL/SQL中元素的引用方式

    BINARY_INTEGER以及子类型(-2147483647~2147483647)

    VARCHAR2(Oracle 9i数据库R2版本或者更高版本)

    1到2147483647间的正整数

    是否稀疏

    开始不是,进过删除后就是了

    不是

    是否有界

    无界

    可以扩展

    有界

    可以随时对任意一个元素赋值

    可以

    不可以,可以需要先用EXTEND进行扩展

    不可以,可能需要执行EXTEND进行扩展,而且用EXTEND扩展时不能超出上边界

    扩展的方法

    给一个新下标指向的元素赋值

    使用内置的EXTEND过程(或者TRIM进行压缩),没有预定义的最大值

    EXTEND(或者TRIM),但是最大只能到声明的最大尺寸

    可以比较相等与否

    不可以

    可以,要求是Oracle数据库10g或以后的版本

    不可以

    是否可以通过集合操作进行操作

    不可以

    可以,要求是Oracle数据10g或者以后的版本

    不可以

    存取数据石佛会保留顺序或者下标

    N/A

    不保留

    保留


    关联数组

    TYPE table_type_name IS TABLE OF datatype [ NOT NULL ] INDEX BY index_type;
    • table_type_name:创建集合类型的名字;
    • datatype:是集合中唯一一列的数据类型;可以是标量数据类型、%TYPE引用类型、ROWTYPE引用类型
    • NOT NULL:如果指定了,那么表中的每一行都必须要有一个值;
    • index_type:是用来组织集合内容索引的数据类型,其值可以为(它们都是数据类型):有点像java中的map,而index_type就是map中的key。
      • BINARY_INTEGER
      • PLS_INTEGER
      • POSITIVE
      • NATURAL
      • SIGNTYPE
      • VARCHAR2(32767)
      • table.column%TYPE
      • cursor.column%TYPE
      • package.variable%TYPE
      • packge.subtype

    使用创建

    variable_name table_type_name ;
    • 声明嵌套表(数据库内):
    CREATE [ OR REPLACE ] TYPE type_name AS | IS TABLE OF element_datatype [ NOT NULL ];
    • 声明嵌套表(PL/SQL代码内):
    TYPE type_name IS TABLE OF element_datatype [ NOT NULL ];
    • 声明VARRAY(数据库内):
    CREATE [ OR REPLACE ] TYPE type_name AS | IS TABLE OF element_datatype [ NOT NULL ];
    • 声明VARRAY(PL/SQL内):
    TYPE type_name IS VARRAY (max_elements) OF element_datatype [ NOT NULL ];
    • 删除一个类型:
    DROP TYPE type_name [ FORCE ];
    • type_name:以后在声明变量或者列时会用到的标识符;
    • element_datatype:集合元素的数据类型。集合内所有元素都是一种类型的。如果结合的元素是对象,那么对象类型本身不能在带有一个集合属性。明确的不可用于集合的数据类型包括:BOOLEAN、NCHAR、NCLOB、NVARCHAR2、REF CURSOR、TABLE和VARRAY(非SQL数据类型)。
    • NOT NULL:这种类型的变量不能有任何空元素。不过,集合本身可以是原子级的空(未初始化);
    • max_elements:VARRAY中元素的最大数量,这个值一旦声明就不能更改;
    • FORCE:当要删除这个类型时,就算其他数据中还有这个类型的作用,也要强行删除这个类型;

    声明集合变量

    collection_name collection_type [ := collection_type (...) ];
    • collection_name:是集合变量的名字;
    • collection_type:它即代表着一个先前已经申明的集合类型的名字,同时也代表着(如果是嵌套表或者VARRAY的话)和该类型同名的构造函数;

    构造函数的名字和类型的名字是相同的,并且接收一个用逗号分隔的元素列表作为参数。如果声明的是一个嵌套变量或者VARRAY变量,在使用这个变量之前必须要先对这个变量进行初始化。

    如果两个集合是基于同一个集合的类型,那么就可以通过直接赋值的方式用一个集合变量给另一个变量进行初始化。

    访问集合的数据:

    • 如果访问的是一个还未定义的索引值,数据库会抛出NO_DATA_FOUND异常。所以,使用FOR循环扫描集合的内容,除非它是紧凑的(在FIRST和LAST之间没有未定义的索引值),否则会抛出异常;
    • 试图访问一行已经超出了表或者VARRAY的界限,数据库抛出如下异常:ORA-06533: Subscript beyond count;

    未完待续......

    更多相关内容
  • oracle集合类型详解

    千次阅读 2019-05-18 22:27:25
    1.集合类型1.1关联数组1.2嵌套表1.3 可变长的数组2.声明集合类型2.1声明关联数组2.2声明嵌套表2.3声明VARRAY3.集合变量的声明和初始化3.1集合变量的声明3.2集合变量的初始化3.2.1通过构造函数的显示初始化3.2.2直接...


    昨天才知道oracle数据库中也有集合类型,废话不多少,直接上文。

    所谓集合是一种类似于列表或者一维数组的数据结构。PL/SQL提供了三种集合类型:关联数据组(索引表),嵌套表和VARRAY(可变长数组)。

    1.集合类型

    1.1关联数组

    关联数组(也称为索引表)是一组键值对。每个密钥都是唯一的,并且被用于定位相应的值。键可以是整数或字符串。只能用于PL/SQL环境。

    1.2嵌套表

    从概念上讲,嵌套表像一个元素数量任意的一维数组。

    在数据库中,嵌套表是存储一组值的列类型,数据库存储嵌套表的行是没有特定顺序的。当你从数据中提取嵌套表到PL/SQL变量时,该行给出连续从1开始的下标。通过这些类似数组下标访问独立的行。

    嵌套表不同于数组的重要方面:

    数组需要声明元素的个数,而嵌套表不需要。嵌套表的大小可以动态增加。数组总是密集的,嵌套表刚开始是密集的,但是后面有可能会变成稀疏的。因为你会从嵌套表中删除元素。

    1.3 可变长的数组

    可变长的数组是一个VARRAY数据类型的集合。当你声明VARRAY类型的时候,就必须指定同时指定它能够包含的最大元素个数。VARRAY可以包含可变数据的元素,从零到最大值。VARRAY索引有一个固定定的下限1和一个可扩展的上限。和嵌套表类型一样的是,它们都可以用于PL/SQL和数据库。但是和嵌套表不一样的是,在向VARRAY中保存数据或者提取数据时,它的元素是有序的。

    2.声明集合类型

    在使用一个集合之前,我们必须先声明它。有两种方法可以申明一个集合类型:

    通过TYPE语句在一个PL/SQL程序中声明集合类型。通过CREATE TYPE语句在数据中定义一个嵌套表或者VARRAY类型,这个类型就是一个模式级别的对象。这种类型就可以用作数据库表的列的数据类型,可以用作对象类型的属性,也可以用于声明PL/SQL变量。

    2.1声明关联数组

    关联数组的TYPE语句的语法如下:

    TYPE table_type_name IS TABLE OF datatype [ NOT NULL] INDEX BY index_type;
    

    其中:

    table_type_name是你所创建的集合类型的名字,datatype是集合中唯一一列的数据类型,index_type是用来组织集合内容的索引的数据类型。而集合唯一以列的数据类型可以是下面这些:

    标量数据类型:任何被PL/SQL支持的标量数据类型,比如VARCHAR2,CLOB,POSITIVE,DATE,或者BOOLEAN。锚定数据类型:这种数据类型是从一个数据库表的列,之前已经定义的变量或者带有%TYPE属性的游标表达式推导出来的数据类型。我们也可以定义用%ROWTYPE声明或者根据一个用户定义的记录类型来定义一个记录的集合。复杂的数据类型:从Oracle 9i数据库R2版本开始,你也可以把对象类型和集合类型作为集合的数据类型。
    集合语法中的index_type定义索引下标的数据类型。在Oracle 9i数据库版本R2之前,只能是INDEX BY PLS_INTEGER。从Oracle 9i数据库版本R2开始,INDEX BY的数据类型可以是BINARY_INTEGER、及它的子类型、VARCHAR2(N)或者VARCHAR2列或变量的%TYPE锚定类型。

    2.2声明嵌套表

    可以数据库内或者PL/SQL代码块中声明嵌套表类型。

    在数据库内创建一个嵌套表类型:

    CREATE [OR REPLACE] TYPE type_name AS | IS TABLE OF element_datatype [ NOT NULL ];
    

    删除数据库内的嵌套表类型:

    DROP TYPE type_name [FORCE];
    

    在PL/SQL中声明一个嵌套表类型:

    TYPE type_name IS TABLE OF element_datatype [ NOT NULL ];
    

    其中:

    OR REPLACE:允许我们重创建一个已经存在的类型。通过在语法中加上REPLACE的方式来重建类型,而不是先删除后再重新创建,可以把所有已经授予的权限都完整的保留下来。type_name:一个合法的SQL或者PL/SQL标志符。这也是我们以后在声明变量或者列时会用到的标识符。element_datatype:这是集合元素的数据类型。集合内所有元素都是一种类型的,可以是大部分标量数据类型、对象类型、或者REF对象类型。如果集合的元素是对象,对象类型本身不能再带有一个集合属性。如果你创建了一个其元素是RECORD类型的集合,记录的字段只能是标量或者是独享。明确的不可用于集合的数据类型包括BOOLEAN、NCHAR、NCLOB、NVARCHAR2、REF CURSOR、TABLE和VARRAY(非SQL数据类型)。NOT NULL:表明这种类型的变量不能有任何空元素。不过,集合本身可可以是原子级的空(未初始化)。FORCE:这个关键字告诉数据库的是,当要删除这个类型时,就算是其他类型中还有对这个类型的引用,也要强行删除这个类型。比如,如果在一个对象类型的定义中用到了某个特殊的集合类型,你可以使用FORCE关键字来强行删除这个集合类型。

    2.3声明VARRAY

    和嵌套表类型的声明一样,可以数据库内或者PL/SQL代码块中声明VARRAY类型。

    在数据库内创建一个VARRAY类型:

    CREATE [OR REPLACE] TYPE type_name AS | IS VARRAY (max_elements) OF element_datatype [ NOT NULL ];
    

    删除数据库内的VARRAY类型:

    DROP TYPE type_name [FORCE]; 
    

    在PL/SQL中声明一个VARRAY类型:

    TYPE type_name IS VARRAY (max_elements) OF element_datatype [ NOT NULL ];
    

    其中:

    OR REPLACE:允许我们重创建一个已经存在的类型。通过在语法中加上REPLACE的方式来重建类型,而不是先删除后再重新创建,可以把所有已经授予的权限都完整的保留下来。type_name:一个合法的SQL或者PL/SQL标志符。这也是我们以后在声明变量或者列时会用到的标识符。element_datatype:这是集合元素的数据类型。集合内所有元素都是一种类型的,可以是大部分标量数据类型、对象类型、或者REF对象类型。如果集合的元素是对象,对象类型本身不能再带有一个集合属性。如果你创建了一个其元素是RECORD类型的集合,记录的字段只能是标量或者是独享。明确的不可用于集合的数据类型包括BOOLEAN、NCHAR、NCLOB、NVARCHAR2、REF CURSOR、TABLE和VARRAY(非SQL数据类型)。NOT NULL:表明这种类型的变量不能有任何空元素。不过,集合本身可可以是原子级的空(未初始化)。max_elements:VARRAY中元素的最大数量,这个值一旦声明就不能更改。FORCE:这个关键字告诉数据库的是,当要删除这个类型时,就算是其他类型中还有对这个类型的引用,也要强行删除这个类型。比如,如果在一个对象类型的定义中用到了某个特殊的集合类型,你可以使用FORCE关键字来强行删除这个集合类型。

    3.集合变量的声明和初始化

    3.1集合变量的声明

    一旦我们创建好了集合类型,我们就可以根据这个集合类型声明该类型的变量。一个集合变量声明格式如下:

    collection_name collection_type [:=collection_type(...)];
    

    其中,collection_name是集合变量的名字,collection_type具有两层含义,它即代表着一个先前已经声明的集合类型的名字,同时也代表着(如果是嵌套表或者VARRAY的话)和该类型同名的构造函数。

    构造函数的名字和类型的名字是相同的,并且接收一个用逗号分隔的元素列表作为参数。如果我们声明的是一个嵌套表或者VARRAY变量,我们在使用之前必须要先对这个变量进行初始化。

    3.2集合变量的初始化

    对于嵌套表类型集合变量和VARRAY类型集合变量,在使用集合变量之前必须要进行初始化,而对于关联数组类型不需要初始化。下面主要讨论嵌套表和VARRY的初始化。

    3.2.1通过构造函数的显示初始化

    通过构造函数显示地给集合变量初始。例如:

    declare
    
    vnt_employee nt_employee :=nt_employee(); --不带参数的构造函数初始化
    
    vnt_employee nt_employee :=nt_employee('张三','李四','王五'); --带参数的构造函数初始化
    
    begin
    
    null;
    
    end; 
    

    3.2.2直接赋值时的隐式初始化

    如果两个集合实例是基于同一集合类型,我们可以把其中一个实例的全部内容拷贝给另一个,这就相当于进行了初始化。例如:

    declare
    
    vnt_employee nt_employee :=nt_employee('James','Lucy','Jordan');
    
    vnt_foregin_employee nt_employee;
    
    begin
    
    vnt_foregin_employee := vnt_employee;
    
    end; 
    

    3.2.3通过FETCH操作的隐式初始化

    在使用FETCH或者 SELECT INTO语句从数据库提取提取一个集合并保存到一个集合变量时,集合变量会自动初始化,就像直接赋值一样。

    declare
    
    vnt_colors nt_color;
    
    begin
    
    select colors into vnt_colors from color_models; --表color_models的color列是嵌套表类型。
    
    end; 
    

    3.2.4通过BULK COLLECT语句的隐式初始

    使用BULK COLLECT INTO语句批量提取数据并保存到一个集合变量,集合变量会自动初始化,就像直接赋值一样。

    declare
    
    vnt_employee nt_employee; --未初始化
    
    begin
    
    select e.ename bulk collect intovnt_employee from emp e;
    
    end;
    
    declare
    
    cursor cur_employee is select e.ename from emp e;
    
    vnt_employee nt_employee; --未初始化
    
    begin
    
    open cur_employee;
    
    fetch cur_employee bulk collect into vnt_employee;
    
    close cur_employee;
    
    end; 
    

    4.集合方法

    Oracle提供了提供许多内置的函数和过程可以用于获取集合的信息或者修改集合的内容,这些方法也叫做集合方法。下面给出这些方法的完整列表:

    方法(函数或者过程)

    说 明

    COUNT函数

    返回集合中现有元素的数量

    DELETE过程

    从集合中移除一个或者多个元素。如果不是重复移除,会减少COUNT的值,对于VARRAY,你只能删除集合的所有元素

    EXISTS函数

    根据某个指定的元素是否已经在集合中,返回TURE或者FALES

    EXTEND过程

    增加嵌套表或者VARRAY中元素的个数,同时增加COUNT的值

    FIRST、LAST函数

    返回可用的最小(FIRST)和最大(LAST)集合下标

    LIMIT函数

    返回VARRAY中允许ude最大元素数量

    PRIOD、NEXT函数

    返回紧挨着指定的下标之前(PRIOD)或者之后(NEXT)的下标值。你应该总是用PRIOD和NEXT在集合内遍历,尤其在使用稀疏(或者可能是稀疏)集合时更是如此

    TRIM过程

    从集合的尾部(定义的最大下标)移除集合元素

    之所以把这些过程叫做方法,是因为使用这些集合内置程序的语法不同于调用过程和函数的正规语法。

    5.集合类型对比

    在这里插入图片描述

    6.集合示例

    6.1关联数组示例

    set serverout on --开启sqlplus屏幕打印功能
    DECLARE
        TYPE nt_foregn_employee IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
        --声明 nt_foregn_employee为关联集合类型 相对于创建一个集合类型
        --这里由于varchar2(30)类型是数据库自带的,就不需要我们单独创建
        -- 这里key为binary_integer 类型 value 为varchar2(30)
        vnt_foregn_employees nt_foregn_employee; --声明 vnt_foregn_employees为 nt_foregn_employee类型
        v_row                NUMBER;
    BEGIN
        vnt_foregn_employees(-230002) := 'SCOTT'; --往 vnt_foregn_employees中添加元素 相当于 map(-230002,'SCOTT');
        vnt_foregn_employees(-23) := 'JONES';
        vnt_foregn_employees(1) := 'ALLEN';
        vnt_foregn_employees(5934) := 'CLARK';
        vnt_foregn_employees(13342) := 'ADAMS';
        vnt_foregn_employees(8234223) := 'KING';
    
        --使用FIRST方法获取集合中的一个行号
        v_row := vnt_foregn_employees.first;
    
        WHILE (v_row IS NOT NULL) LOOP
            --遍历集合中的元素
            dbms_output.put_line(v_row || ':' || vnt_foregn_employees(v_row));
            v_row := vnt_foregn_employees.next(v_row);
        END LOOP;
    END;
    /
    

    在稀疏集合中,经常需要使用NEXT方法遍历集合,提取数据。
    查看执行结果,看到遍历结果和我们添加结果一样
    在这里插入图片描述

    在稀疏集合中,经常需要使用NEXT方法遍历集合,提取数据。

    6.2嵌套表示例

     DECLARE
        TYPE nt_employee IS TABLE OF emp%ROWTYPE;--声明nt_employee为嵌套表emp集合类型
        vnt_employees nt_employee := nt_employee(); --构造函数显示初始化
        c_big_number  NUMBER := power(2, 31);
        l_start_time  PLS_INTEGER;
    
        CURSOR cur_employee IS   --从emp表取数游标
            SELECT * FROM emp;
        vrt_employees cur_employee%ROWTYPE;
    
    BEGIN
        OPEN cur_employee;
        LOOP
            FETCH cur_employee
                INTO vrt_employees;
            EXIT WHEN cur_employee%NOTFOUND;
            vnt_employees.extend;--嵌套表extend扩展一个元素
            vnt_employees(vnt_employees.last) := vrt_employees;--添加元素
        END LOOP;
        CLOSE cur_employee;
        --循环遍历元素
        FOR i IN 1 .. vnt_employees.count LOOP
            --v_data.count表示集合中元素的个数
            --vnt_employees 一条记录相当于一个实体,列名相对于是实体属性,通过点的方式获取
        dbms_output.put_line('empnofrom:' || vnt_employees(i).empno ||
                    ' ename:' || vnt_employees(i).ename || ' deptno:' || vnt_employees(i).deptno);
            --把满足条件的客户信息打印到屏幕
        END LOOP;
       dbms_output.put_line('嵌套表vnt_employees中元素个数:'||vnt_employees.count); -- 打印集合的元素总数
    END;
    /  --sqlplus执行过程命令
    

    执行结果
    在这里插入图片描述

    6.3VARRAY实例

    --创建集合类型nt_course 用于存放学生课程表
    create or replace type nt_course is varray(5) of varchar2(100);
    /
    --创建表students,表中引用了可变集合类型nt_course  存放学生和课程信息
    create table students( student_name varchar2(20) , cource nt_course);
    
    declare
    vnt_nt_courses nt_course := nt_course();--构造函数初始化
    
    begin
    vnt_nt_courses.extend(2);-- 集合增加2个元素
    vnt_nt_courses(1) := 'English';--跟一维数组添加元素一样
    vnt_nt_courses(2) := 'Chinese';
     -- 把集合数据添加到students表中
    insert into students
    (student_name, cource)
    values
    ('chiclewu', vnt_nt_courses);
    commit;-- 提交事务
    end;
    /
    select * from table (select s.cource from students s); 
    

    – 可以使用TABLE函数把一个集合映射成数据库表.例如,要获取student表中课程列的记录。

    在这里插入图片描述

    这里用table的原因就是集合是不能显示的,

    SELECT t.student_name,  t.cource  FROM students t;
    

    在这里插入图片描述

    看到,通过集合元素可以实现在同一表中一条记录对应多条记录。

    我们可以认为其实这里是两个表,
    students表中存放学生和选课信息,而选课信息就是我们所说的集合 也相当于是一个表

    本文转自:https://www.2cto.com/database/201312/264383.html

    展开全文
  • 如何正确使用 Spring 注入集合类型

    千次阅读 多人点赞 2021-09-12 17:53:55
    集合类型的自动注入是Spring提供的另外一个强大功能。我们在方便的使用依赖注入的特性时,必须要思考对象从哪里注入、怎么创建、为什么是注入这一个对象的。虽然编写框架的目的是让开发人员无需关心太多底层细节,能...

    集合类型的自动注入是Spring提供的另外一个强大功能。我们在方便的使用依赖注入的特性时,必须要思考对象从哪里注入、怎么创建、为什么是注入这一个对象的。虽然编写框架的目的是让开发人员无需关心太多底层细节,能专心业务逻辑的开发,但是作为开发人员不能真的无脑去使用框架。
    务必学会注入集合等高级用法,让自己有所提升!

    现在有一需求:存在多个用户Bean,找出来存储到一个List。

    1 注入方式

    1.1 收集方式

    多个用户Bean定义:

    有了集合类型的自动注入后,即可收集零散的用户Bean:

    这样即可完成集合类型注入:

    但当持续增加一些user时,可能就不喜欢用上述的注入集合类型了,而是这样:

    1.2 直接装配方式


    分开玩,大家应该不会有啥问题,若两种方式共存了,会咋样?
    运行程序后发现直接装配方式的未生效:

    这是为啥呢?

    2 源码解析

    就得精通这两种注入风格在Spring分别如何实现的。

    2.1 收集装配

    DefaultListableBeanFactory#resolveMultipleBeans

    private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName,
          @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) {
       final Class<?> type = descriptor.getDependencyType();
       if (descriptor instanceof StreamDependencyDescriptor) {
          // 装配stream
          return stream;
       }
       else if (type.isArray()) {
          // 装配数组
          return result;
       }
       else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
          // 装配集合
          // 获取集合的元素类型
          Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();
          if (elementType == null) {
             return null;
          }
          // 根据元素类型查找所有的bean
          Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType,
                new MultiElementDescriptor(descriptor));
          if (matchingBeans.isEmpty()) {
             return null;
          }
          if (autowiredBeanNames != null) {
             autowiredBeanNames.addAll(matchingBeans.keySet());
          }
          // 转化查到的所有bean放置到集合并返回
          TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
          Object result = converter.convertIfNecessary(matchingBeans.values(), type);
          // ...
          return result;
       }
       else if (Map.class == type) {
          // 解析map
          return matchingBeans;
       }
       else {
          return null;
       }
    }
    

    1 获取集合类型的elementType

    目标类型定义为List users,所以元素类型为User:

    2 根据元素类型找出所有Bean

    有了elementType,即可据其找出所有Bean:

    3 将匹配的所有的Bean按目标类型转化

    上一步获取的所有的Bean都以java.util.LinkedHashMap.LinkedValues存储,和目标类型大不相同,所以最后按需转化。

    本案例中,需转化为List:

    2.2 直接装配方式

    DefaultListableBeanFactory#findAutowireCandidates

    不再赘述。

    最后就是根据目标类型直接寻找匹配Bean名称为users的List<user>装配给userController#users属性。

    当同时满足这两种装配方式时,Spring会如何处理呢?

    DefaultListableBeanFactory#doResolveDependency


    显然这两种装配集合的方式不能同存,结合本案例:

    • 当使用收集装配时,能找到任一对应Bean,则返回
    • 若一个都没找到,才采用直接装配

    所以后期以List方式直接添加的user Bean都不生效!

    3 修正

    务必避免两种方式共存去装配集合!只选用一种方式即可。
    比如只使用直接装配:
    只使用收集方式:

    如何做到让用户2优先输出呢?
    控制spring bean加载顺序:

    1. Bean上使用@Order注解,如@Order(2)。数值越小表示优先级越高。默认优先级最低。
    2. @DependsOn 使用它,可使得依赖的Bean如果未被初始化会被优先初始化。
    3. 添加@Order(number)注解,number越小优先级越高,越靠前
    4. 声明user这些Bean时将id=2的user提到id=1之前
    展开全文
  • C# 集合类型(常用集合类型整理)

    万次阅读 多人点赞 2018-06-24 09:41:16
    一、常用集合类型及概念 2. 1)List &amp;amp;amp;amp;amp;amp;amp;lt; T &amp;amp;amp;amp;amp;amp;amp;gt; 泛型的List 类是一个不限长度的集合类型,它内部实际就是一个数组,初始长度是4,每次...

    一、常用集合类型及概念

    1.基本关系

    许多泛型集合类型均为非泛型类型的直接模拟。

    Dictionary< TKey, TValue> 是 Hashtable 的泛型版本;它使用枚举的泛型结构KeyValuePair< TKey, TValue> 而不是DictionaryEntry

    List< T> 是 ArrayList 的泛型版本
    Queue< T>对应Queue
    Stack< T>对应Stack

    SortedList< TKey, TValue> 对应SortedList,这两个版本均为字典和列表的混合

    SortedDictionary< TKey, TValue> 泛型类是一个纯字典,并且没有任何非泛型对应项

    LinkedList< T>泛型类是真正的链接的列表,并具有任何非泛型对应项

    2.常用集合类型

    1)ArrayList

    ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素,相当于List < object>

    2)List < T >

    泛型的List 类是一个不限长度的集合类型,它内部实际就是一个数组,初始长度是4,每次数组到达限制,就会把现有容量翻倍,它提供用于对集合进行搜索、排序和操作等方法
    List是数组链表,数组链表访问快,复杂度O(1),但是添加删除复杂度O(n)

    3)LinkedList

    LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。
    底层的数据结构是基于双向链表的,
    LinkedList是指针链表,指针链表访问复杂度是O(n),但是添加删除很快O(1),如果对这个集合在中间的添加删除操作非常频繁的话,就建议使用LinkedList。

    4)Dictionary < K, V>

    存储键值对的关联性集合,查询等操作速度很快,因为它的时间复杂度是O(1)
    ,单线程中推荐使用Dictionary,有泛型优势,且读取速度较快,容量利用更充分.

    5)Hashtable

    Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对
    基本概念
    Hashtable使用了闭散列法来解决冲突,它通过一个结构体bucket来表示哈希表中的单个元素,这个结构体中有三个成员:
     (1) key :表示键,即哈希表中的关键字。
     (2) val :表示值,即跟关键字所对应值。
     (3) hash_coll :它是一个int类型,用于表示键所对应的哈希码。

    哈希表的所有元素存放于一个名称为buckets(又称为数据桶) 的bucket数组之中
    优点:
     (1)在使用哈希表保存集合元素(一种键/值对)时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。在查找时,再次通过键所对应的哈希代码到特定存储桶中搜索,这样将大大减少为查找一个元素进行比较的次数

    (2)多线程程序中推荐使用Hashtable,对Hashtable进一步调用Synchronized()方法可以获得完全线程安全的类型

    Dictionary< TKey, TValue> 是 Hashtable 的泛型版本,它们之间实现上区别不大,运行效率上有一些差别
    Hashtable由于键值类型都object,所以涉及装箱拆箱操作,在添加数据的效率上要差一些,但是频繁使用数据时效率更高,HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。

    6)SortedList

    表示基于相关的 IComparer 实现按键进行排序的键/值对的集合,与哈希表类似,区别在于SortedList中的Key数组排好序的

    7)堆栈(Stack)

    表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈

    8)队列(Queue)

    队列先进先出,enqueue方法入队列,dequeue方法出队列

    9)SortedList< TKey,TValue>

    SortedList< TKey,TValue>是支持排序的关联性集合,将数据存储在数组中的。
      也就是说添加移除操作都是线性的,时间复杂度是O(n),因为操作其中的元素可能导致所有的数据移动。
      但是因为在查找的时候利用了二分搜索,所以查找的性能会好一些,时间复杂度是O(log n)
      所以推荐使用场景是这样地:如果你想要快速查找,又想集合按照key的顺序排列,最后这个集合的操作(添加和移除)比较少的话,就是SortedList了。
      集合中的数据是有序的。可以通过key来匹配数据,也可以通过int下标来获取数据。

    添加操作比ArrayList,Hashtable略慢;查找、删除操作比ArrayList快,比Hashtable慢

    #####10)SortedDictioanry< TKey,TValue>

    SortedDictionary< TKey,TValue>和Dictionary< TKey,TValue>大致上是类似的,但是在实现方式上有一点点区别
      SortedDictionary< TKey,TValue>用二叉树作为存储结构的。并且按key的顺序排列
      SortedDictionary< TKey,TValue>相比于SortedList< TKey,TValue>其性能优化了
      SortedList< TKey,TValue>其内部维护的是数组而SortedDictionary< TKey,TValue>内部维护的是**红黑树(平衡二叉树)**的一种,因此其占用的内存,性能都好于SortedDictionary< TKey,TValue>
      唯一差在不能用下标取值

    11)HashSet< T>

    HashSet是一个无序的能够保持唯一性的集合,不支持下标访问。

    12)SortedSet< T>

    SortedSet内部也是一个二叉树,用来支持按顺序的排列元素。
      算法,存储结构都与哈希表相同,主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特定顺序的元素。

    13)BitArray

    BitArray用于二进制运算,“或”、“非”、“与”、"异或非"等这种操作,只能存true或false;

    14)ListDictionary

    单向链表,每次添加数据时都要遍历链表,数据量大时效率较低,数据量较大且插入频繁的情况下,不宜选用

    15)HybridDictionary

    HybridDictionary的类,充分利用了Hashtable查询效率高和ListDictionary占用内存空间少的优点,内置了Hashtable和ListDictionary两个容器,添加数据时内部逻辑如下:

    当数据量小于8时,Hashtable为null,用ListDictionary保存数据。

    当数据量大于8时,实例化Hashtable,数据转移到Hashtable中,然后将  ListDictionary置为null。

    下一篇再写一下每一种集合的内部实现,及具体的运行效率比较

    我会在我的公众号上推送新的博文,也可以帮大家解答问题
    微信公众号 Andy and Unity 搜索名称或扫描二维码
    在这里插入图片描述
    希望我们能共同成长,共同进步

    展开全文
  • python中常见的集合类型介绍

    千次阅读 2020-08-30 18:37:22
    list是python的一个列表集合,有顺序,可以包含不同类型的元素,用L=['a',1,123]表示,与数组类似,下标都是从0开始,是可变长度集合;append方法可在list末尾添加元素;insert(x,y)方法可在任意位置添加一个元素;...
  • 文章目录定义集合操作符集合类型的操作函数代码演示: 定义 1、集合是多个元素的无序组合 2、集合元素之间无序,每个元素唯一,不存在相同元素(应用于数据去重,即集合类型所有元素无重复) 3、集合元素不可更改,...
  • Stream流转换集合类型

    千次阅读 2020-02-17 18:12:56
    1.代码如下: public void delete1(){ List<String> ids = new ArrayList<>(); ids.add("1"); ids.add("2"); ids.add("3"); ids.add("4"); List<Long> longs = ids.stream().map... L...
  • COLLECTION 单行单列  变量  单行多列  记录  多行单列  ...集合  ...记录+集合 ... 集合是相同类型元素的组合。数据库中相当于"多行单列", 类似于数组, 使用唯一的下标来标识其中
  • 集合类型的操作符(共10个)

    千次阅读 多人点赞 2020-11-27 20:03:37
    注意:本次所有的举例均...更新集合S,包括在集合S,包括在集合S中但不在集合T中的元素。 eg: 3.S & T或S.intersection(T): 返回一个新集合,包括同时在集合S和T中的元素。 eg:4.S&=T或S.intersection_update(T)
  • 用集合接收参数分为两种:第一种是直接用一个集合类型来接收,第二种是在一个实体类中包含集合类型的参数 这里我会分别将这两种情况用代码实现下,例子使用springboot框架。 第一种:后端直接用集合类型来接收参数...
  • java有哪些集合类型?集合类的特点

    千次阅读 2022-04-26 16:15:46
    java有哪些集合类型?对于java工程师来说技术的不断发展,需要不断学习java进阶知识。为了帮助大家巩固基础,本文解答了java有哪些集合类型?集合类的特点是什么?等相关问题,希望可以帮到大家。 java有哪些集合类型?...
  • Python3入门之——集合类型

    千次阅读 2020-08-26 21:45:39
    set也是一种组合数据类型,支持成员关系操作(in)、...集合数据类型至少提供一个set.isdisjoin()方法,支持比较,也支持为逻辑操作(在集合用于联合、交叉等上下文中使用)。 可变的set类型 固定的frozenset类型 ...
  • Go从入门到放弃(三)集合类型

    万次阅读 2020-11-10 17:56:19
    本文主要介绍Go语言集合类型:array、slice 和 map Array数组 Array(数组):存放固定长度、相同类型、元素连续的整形、字符串或者任何自定义的数据类型。 数组声明: array:=[5]string{“a”,“b”,“c”,“d...
  • python 集合类型及操作介绍

    千次阅读 2018-05-22 00:35:32
    集合类型定义 多个元素的无序组合 集合类型与数学中的集合概念保持一致 集合元素之间无序,每个元素唯一,不存在相同元素 集合元素不可更改,不能是可变数据类型 集合用大括号{}表示,元素间用逗号分隔 建立集合...
  • MYSQL数据库中的枚举类型和集合类型

    万次阅读 2016-01-14 18:13:16
    枚举类型,enum 一般来说就是单选,在定义枚举的时候列出所有的可能性; 代码如下 create table type_enum( gender enum('male','remale','serect'), ); insert into type_enum values ('remale'); ...
  • 本章节主要讲解如果Mapper接口的返回类型集合(List、Map)时,如何定义 一、返回结果类型为List Mapper接口的方法: List<Employee> getAll(); EmployeeMapper.xml映射文件: <select id="get...
  • JAVA的集合类型有哪些

    千次阅读 2016-03-25 17:18:30
    Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下: CollectionList CollectionList CollectionList CollectionSet CollectionSet CollectionSet Vector : 基于...
  • Oracle集合类型

    千次阅读 2013-12-12 14:26:54
    PL/SQL提供了三种集合类型:关联数据组(索引表),嵌套表和VARRAY(可变长数组)。 1.关联数组(索引表) 关联数组(也称为索引表)是一组键值对。每个密钥都是唯一的,并且被用于定位相应的值。键可以是整数或字符...
  • 集合包含Collection和map接口,而Collection又由两个字接口——List和Set构成,每个子接口又有自己不同的实现类…听起来晕晕的,初学者如何分辨和应用它们?*List接口 List是有序的Collection,使用此接口能够精确...
  • 有序集合类型在某些方面和列表类型有些相似。 (1)二者都是有序的。 (2)二者都可以获得某一范围的元素。 但是二者有着很大的区别,这使得它们的应用场景也是不同的。 (1)列表类型是通过链表实现的,获取...
  • cassandra关于集合类型的操作

    千次阅读 2017-07-18 09:02:48
    Cassandra的几种集合类型(list、set、map)增强了数据库的表现力,这几种数据类型用的很方便。我简单总结了一下这几种类型的使用方法。 社会我二哥,人狠话不多,直奔主题
  • Swift中的集合类型

    千次阅读 2014-10-06 20:15:11
    一.引子:  在TIOBE编程语言排行榜中,Swift位居第18位,从2014WWDC发布会首次公布至今不到半年时间,swift一直受到编程人员的追捧,...二.swift的集合类型  下面回归主题。作为一名iOS开发者,我们已经非常熟悉诸如
  • Oracle 集合类型介绍

    万次阅读 2012-10-22 13:21:51
    集合类型 1. 使用条件:  a. 单行单列的数据,使用标量变量 。  b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接 ]  c. 单列多行数据,使用集合  *集合:类似于编程语言中数组也就
  • 6.1 集合类型之List 、MutableList

    万次阅读 2020-06-16 19:09:06
    在Kotlin中,集合类型包含三种类型:它们分别是:List、Set、Map,这三种类型都有几个共通点: 它们都是接口,并不是实际的类。 它们都继承至Collection接口,而Collection< out E>又继承与Iterable< out T...
  • 集合由不可变数据类型元素组成,如整数、浮点数、复数,字符串、元组类型集合用大括号{}组成,元素之间用逗号隔开 每个元素唯一,不存在相同元素 一、集合间操作 并(S|T) S-T S&T S^T 返回一个新...
  • 解决BeanUtils.copyProperties不能复制集合类型 1.背景: 日常项目中,后台从“数据库”中获取的数据用DTO实体类接收,后台返回给“前台”的实体类是VO。 DTO和VO的属性字段个数大致相同(一般来说VO可能比DTO多)。...
  • redis(7):数据结构-set集合类型

    万次阅读 2021-02-02 21:15:34
    集合类型和列表类型有相似之处,但很容易将它们区分开来, 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作...
  • python集合类型用法分析

    千次阅读 2020-12-07 11:59:58
    本文实例分析了python集合类型用法。分享给大家供大家参考。具体分析如下:python的集合类型和其他语言类似, 是一个无序不重复元素集,我在之前学过的其他的语言好像没有见过这个类型,基本功能包括关系测试和消除...
  • redis(8):数据结构-zset有序集合类型

    万次阅读 2021-02-02 21:14:57
    有序集合类型算得上是Redis的5种数据类型中最高级的类型了,在学习时可以与列表类 型和集合类型对照理解。 二、命令 1.1.增加元素 ZADD key score member [score member …] ZADD 命令用来向有序集合中加入一个...
  • 134.Oracle数据库SQL开发之 集合——创建集合类型 欢迎转载,转载请标明出处: Database 8数据库引入两种新的的数据库类型,称为集合。允许存储元素集合。 集合有3中类型: l 变长数组(Varray),类似于JAVA,C++...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,632,107
精华内容 652,842
关键字:

集合类型

友情链接: 按键消抖.zip