数组、集合与泛化

从VB、C#到VB.net,在变量的使用中总少不了数组的影子,它不仅可以快速而容易地从头到尾遍历元素,还可以快速的修改元素。但是用的多了自然就发现了的它的缺点,当两个元素之间添加元素时就比较困难了,因为在创建时事先指定了数组变量的大小使用时又不能随意增改,再加上链表、堆、栈等需求的增加,数组已经显得力不从心了,由此发展出了集合,即传说中的动态数组,它是.NET Framework提供的用于数据存储和检索的专用类,这些类提供了对堆栈、队列、列表和哈希表的支持。

但是集合都依赖于Object基类,使用时集合中的元素都得转为Object,这其中涉及到了拆装箱的问题(大量的计算),且集合中的元素类型不一定一致从而可能会带来安全隐患。为了解决集合的不足之处,又引入了泛型集合,它把里边的元素强制指定为特定的类型(也可以说是模板),是集ArrayList集合和Array数组优点于一身的好东西。

1.数组

System.Array类是数组的基础,数组是由它派生而来的。所有.Net数组和集合的下标从0开始,数组的使用比较简单,以前VB等编程语言中已经用过n多次,这里不再赘述了。

2.集合——ArrayList

集合(Collections)名称空间是System名称空间的一部分,System.Collections名称空间提供了几个类来满足不同的需求,目前为止接触过得只有ArrayList类,现在只以它为例来了解集合。

1)ArrayList是一个数组实现IList接口,其大小在添加元素时自动增加大小。ArrayList的容量是其可以保存的元素数,默认初始容量为0,随着元素添加到ArrayLIst中,容量会根据需要重新分配自动增加。

2)使用整数索引可以访问此集合中的元素,索引从0开始。

3)接受Nothing作为有效值并且允许重复的元素。

4)由于实现了IList,所以ArrayList提供添加、插入或移除某一范围元素的方法。

例子:创建一个动物集合

Imports System.Collections          '添加集合类的命名空间
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        Dim arrayAnimal As New ArrayList()              '实例化ArrayList对象,不用指定arrayAnimal的大小
        Dim animalItem As Object

        arrayAnimal.Add("小猫")                         '调用集合的Add方法增加对象
        arrayAnimal.Add("小狗")
        arrayAnimal.Insert(1, "小鸭")                   '在索引0处添加鸭子

        '把集合中的元素遍历显示出来
        For Each animalItem In arrayAnimal
            MessageBox.Show(animalItem.ToString())      '弹出框依次显示:小猫、小鸭、小狗
        Next
    End Sub
End Class

3.泛型

1)泛型在很大程度上弥补了集合的缺点,所以在此我们先了解下集合的一些缺点来源

(1)拆装箱

装箱:值类型存储在栈上,应用类型存储在堆上。当值类型想应用类型转变,即从栈向堆上转移,这时值就变成了一对象,就好像值类型外面包装了一层东西,这个过程叫装箱

拆箱:当需要集合中的元素时,需要把箱子从堆上转移到栈上,即引用类型变成值类型,这个过程叫拆箱。拆装箱需要耗费资源和时间。

(2)类型不安全

集合在编译时缺少类型检查。同一个集合可接受不同的元素类型,所有项都强制转换为Object,在编译时无法检查是否可以接受该元素,因为在它眼里所有元素都是Object都是可接受的,这样就使得检查错误变得更难。

2)泛型的引入

鉴于以上的一些缺点,泛型对其中的类型进行了限制,使之成为统一的类型,可以创建一个更安全且更快速的列表。泛型的主要目的是创建强类型化的集合,泛型允许定义代码模板,然后使用这个模板声明变量,实际上是创建一个新的数据类型。.Net基类库中有很多泛型模板,多位于System.Collections.Generic名称空间,所以在使用泛型时需要引用相应的名称空间。

泛型通常使用List(of  T)形式,List是类型(或者类)的名称,字母T是点位符类似于参数。它表示必须用力定制泛型的特定类型值,同时也限定了它只能是这个类型。通常情况下,在程序中可以使用集合数据类型的地方都建议使用泛型集合代替。

小结:

集合和泛化在《大话设计模式》这本书中已经接触过,但是当时没有仔细看过,这篇博客权当拾遗补缺。在接下来的机房重构中将会大量的使用泛化,所以后续博客中再举例泛化的使用。

数组、集合与泛化

时间: 2024-10-28 14:50:51

数组、集合与泛化的相关文章

集合框架之数组集合算法

如何检测程序的健康程度? 如果想要知道程序运行所占的CPU和内存的情况可以使用飞行器,这样就可以知道程序的稳定性了.在JDK的bin目录下可以找到飞行器.如下图: 数组集合算法: 1.数组与集合的区别和联系: 数组是有限存储(规定了数组长度就只能存储那么多值),而集合是无限存储,但其实集合也是由数组做成的. 2.数组集合算法的原理: 当向集合里面存储一个值时,集合里面会为其申请一个适当长度的数组来存储,第二次存储值时,如果数组的长度不足以存储第二次的值,就重新申请一个长一点的数组,先把原来的数组

数组集合删除算法

数组集合删除算法: 删除: /** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com * @author 小沫 */ public void remove(int index){ //objs的长度如果小于0或对象值小于等于0那么抛出数组越界异常 if(objs.length<0||this.index.0){ throw new IndexOutOfBoundsException(); } if(this.index-1==index){ //当前对象的是所占长度-1等

数组集合添加算法

集合是无限存储的容器: 数组集合采用的算法是一开始先开辟好有限的空间进行存储放进来的数据. 等需要再次存放数据的时候,再去开辟一块比原来的空间多的容量之前,老的数据导入进新开辟的空间,然后再把新进来的数据放进空间里,依次这样进行开辟导入就形成了无限的容器.这就是数组集合的算法.  在java源码里面,采用的导入方式是直接调用本地系统语言来直接导入数据,这样提高了效率,一万毫秒才能完成的事情也许四千毫秒就执行完毕. 取消for循环导入使用System.arraycopy如下代码: /** * 更多

二维数组,矩形数组 集合

二维数组,矩形数组 集合 二维数组,矩形数组集合 一.二维数组: 一维数组----豆角 二维数组----表格 1)定义: 一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2)二维数组: 数据类型[,] 数组变量名 = new 数据类型[行数,列数]; int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值       下标都是从0开始的 取值: a[行下标

Java将Excel解析为数组集合

Java将Excel解析为数组集合 相关 jar 包: jxl-2.6.jar jar 包下载:http://files.cnblogs.com/files/liaolongjun/excel-jar.zip /** * 返回上传的Excel表格的内容 */ public static List<String[]> parseExcel(InputStream is) throws Exception { List<String[]> list = new ArrayList<

初识Swift集合之数组集合

数组集合 基础操作: 数组集合定义:由一串有序的相同类型的元素构成的集合 数组的基本声明: 1. var strudentList : Array<Int> ;  //声明一个strudentList 数组,数组元素的类型是Int型 2.var strudentList : [Int]  ;            //一种偷懒的strudent List数组声明,数组元素类型是Int 型 数组的初始化 1.var strudentList : Array<Int>= [10,10,

数组集合转换

数组转集合 Arrays.asList() asList()返回的对象是一个Arrays内部类,没有实现集合的修改类 Arrays.asList()体现了适配器模式,只是转换的接口,其后台数据依然是数组 集合转数组 toArray(T[] array) 参数是类型和大小与集合相同的数组,无参时返回的是Object[] ,转为其他类型数组时报错

oracle常用的复合数据类型 : BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer

例1: 批量 查询部门号为 "10" 号的并把它们打印出来 . DECLARE TYPE emp_table_type IS TABLE OF my_emp%ROWTYPE INDEX BY BINARY_INTEGER; v_emp_table emp_table_type; BEGIN SELECT * BULK COLLECT INTO v_emp_table FROM my_emp WHERE deptno=&deptno; FOR i IN 1..v_emp_tabl

数组集合和链表集合

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 数组集合: 优点: 1.有序 2.可以进行下标操作 3.添加速度快 缺点: 1.删除,删除第一个,删除最后一个,选择一个位置删除这些都不方便操作 2.插入数据也不方便 例题:比如你想插入88的数据到3的后面,那你后面得到4567就要往后挪位置,所以这种方式就非常麻烦,所以使用链表集合的话就方便一些 链表集合: 介绍:就好比是自行车的车链,它的好处就是你可以随