集合——记录的数组和数组的记录

部署运行你感兴趣的模型镜像

 集合中的每一个条目是%ROWTYPE或相似的记录变量。给定这样一个集合,数据可能表示成两种结构:

1、记录的数组(先创建一行,然后将其加入到列表中)

2、数组的记录(创建多个列表,然后把它们连成一个记录)

但应该使用哪种数据结构呢?回答此问题需要考虑两个方面:

1、填充结构时能有多高效?

2、从其中取出数据时效能有多高?

 

下面我们来做一个测试(OS:sun 5.10, Oracle: 10.2.0)。首先创建一个包pkg,它包含两个过程:rec_of_array_test和array_of_rec_test。它们两个的负载相同,但每个都以与各自同名的数据结构来执行。

 

在包中需要定义一些变量,以测试数据结构。srec_list是一个记录(srec)的数组,其中srec记录包含了3个标量变量,而array_rec是一条记录,其中每个字段都是一个数组(num_list)。

 

 

 

对每个数据结构,执行两次计时测试。做了2 000 000次赋值,即循环500 000次,每次将一个值赋给4个记录元素A、B、C和D。(行17——24)。

 

然后,为了测试获取数据的性能,将从结构中读取250 000个伪随机的条目。跟往常一样,dbms_utility.get_time来记录开始时间和结束时间(行25——34)。

 

然后对另一个数据结构进行相同的测试。测试结果如下:

 

 

所以,对于填充和取值,似乎都是使用记录的数组比使用数组的记录要更高效。不要问为什么,兴许Oracle开发团队的某个人能告诉你,但能否知道原因并不重要,重要的是我们设计了一个测试来证明这个结论。在10g 2.0版本中,两者之间的差异显而易见(测试结果得出),但不能保证Oracle在以后的版本不做出改变。

您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

### Java 中集合数组的区别 #### 1. **基本概念** - 数组是一种固定长度的数据结构,用于存储相同类型的多个元素。一旦创建,其大小无法改变[^1]。 - 集合则是动态数据结构的一部分,属于 `java.util` 包下的接口类,允许存储任意数量的对象并能自动调整容量[^2]。 #### 2. **类型灵活性** - 在 Java 中,数组只能容纳同种数据类型的元素(包括原始类型)。例如,如果定义了一个整型数组,则该数组的所有位置都必须存放整数。 - 而集合更加灵活,虽然泛型引入后推荐指定单一类型参数以增强安全性,但实际上仍可以通过不使用泛型的方式向同一个 Collection 添加多种类型的 Object 实例。 #### 3. **尺寸管理** - 数组具有固定的大小,在初始化时就必须确定下来,并且之后不能再更改这个数值[^1]。 - 相较之下,大多数集合实现了自动扩容机制,这意味着当原有空间不足时,它们会自行分配更多内存区域来继续储存新增项[^2]。 #### 4. **功能多样性** - 数组仅仅提供了简单的索引操作方法来进行读写访问。 - 各种不同的集合类除了基础增删改查外还可能拥有各自独特的高级特性。比如 Set 不允许含有重复元素;List 则保留插入顺序并且允许多次出现相同的对象;Map 存储的是键值对形式等等[^3]。 #### 5. **性能考量** - 访问效率方面,由于底层采用连续内存布局的缘故,所以通过下标定位某个具体位置上的值非常高效——时间复杂度为 O(1)[^1]。 - 对于一些特殊用途的集合来说可能会牺牲一点速度换取额外的功能或者更好的组织方式。例如 HashSet 使用哈希表实现查找平均时间为常量级别O(n),但在最坏的情况下退化到线性扫描即O(N);而 TreeSet 基于红黑树构建保证有序排列的同时每次查询都需要付出logN的成本代价[^3]。 #### 6. **线程安全性** - 普通数组本身没有任何内置同步措施因此是非线程安全的选择之一。 - 另一方面,像 Vector Hashtable 这样的古老集合确实考虑到了多线程环境下的竞争条件问题故而是同步版本因而相对更慢但也更为可靠;然而现代设计倾向于利用 CopyOnWriteArrayList 或 ConcurrentHashMap 来达到既兼顾效能又不失稳定性的目的[^3]。 --- ### 示例代码对比 ```java // 数组示例 int[] array = new int[]{1, 2, 3}; System.out.println(Arrays.toString(array)); // 集合示例 - List List<String> list = new ArrayList<>(); list.add("hello"); list.add("world"); System.out.println(list); // 集合示例 - Map Map<Integer, String> map = new HashMap<>(); map.put(1,"one"); map.put(2,"two"); for (Map.Entry<Integer,String> entry : map.entrySet()) { System.out.println(entry.getKey()+"="+entry.getValue()); } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值