大家都知道Java list 的实现类有两个,分别是:ArrayList、LinkedList。实际工作中,使用最多的是ArrayList。ArrayList 的底次实现是数据,LinkedList的层次是链表。书上告诉我们:当需要在List中间插入数据时,应该使用LinkedList,ArrayList 有高效的访问效率。真的是这样的吗?看如下的代码:
List<Integer> arrays = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { arrays.add(i); }
向一个List中插入10000个数据,应该使用ArrayList?我们来简单的分析一下ArrayList的代码:
public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this(10); }
可以看出:ArrayList 存储数组的初始长度是 10 。那么,当数组满了时,ArrayList是怎么样做的呢?继续看代码:
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
注:当向ArrayList中添加一个数据时,调用 ensureCapacity 方法,判断数组的空间是否能满足存储当前数据的条件,如不能,使用Arrays.copyOf(oldArray,newLength) 把数组中的旧数据copy到一个新的、更长的数组中。在copy过程中,是这么做的:首先CPU寻址:找到一个连续的、空白的、满足指定长度的空闲内存块,找到后,进行搬数据操作。这个过程会随着数据越来越多,数组的长度越来越大,效率会急剧下降。因此,当我们使用List来存储“大数据”时,首选LinkedList。好处是:LinkedList 是使用链表来存储数据,向LinkedList中插入数据时,不会出现寻址和copy数据的操作,更正确的说,会更快的找到满足存储条件的空闲块。基于上述理由:代码修改为:
List<Integer> arrays = new LinkedList<Integer>(); for (int i = 0; i < 1000; i++) { arrays.add(i); }
LinkedList 也存在不足之处:如下代码:
for (Integer val : arrays) { System.out.println(val); }
循环遍历List。如果List是LinkedList实现的,每遍历一个元素,都要寻找下个数据的地址,因为元素并不是存储在连续的内存块中。这时的寻址也会很“消费时间”。优化方法:把生成后的LinkedList再放入一个ArrayList中,生成一个ArrayList 对象,ArrayList 的存储在内存块中是连续存放的,在遍历时,不会因寻址“浪费时间”了。优化后的代码如下:
List<Integer> arrays = new LinkedList<Integer>(); for (int i = 0; i < 1000; i++) { arrays.add(i); } arrays = new ArrayList<Integer>(arrays); for (Integer val : arrays) { System.out.println(val); }
上面讲到的方法,并没有进行严格的测试,肯定会有不足之处。欢迎大家批评!
相关推荐
通过这些详细讨论和实际代码示例,我们可以更深入地理解C#中`List<T>`、`ArrayList`和`LinkedList<T>`的使用,从而在实际项目中选择最合适的集合类型。在进行性能优化时,应根据具体需求考虑这些集合类的不同特性。
本文档主要讨论了在多评估列表模式下,如何通过各种方法优化测试性能。这些方法的可用性取决于所使用的CMW500版本。 多评估列表模式是一种在单次测量中获取一组测量结果的方法,适用于一系列分析设置。这些分析设置...
总的来说,"Pro Android学习:list widget小例子"是一个关于如何在Android平台上使用List Widget的实战教程。通过这个例子,开发者可以学习到如何创建自定义Adapter、配置ListView,以及如何实现Widget的动态更新。...
在“应用ListControl来对数据库操作”这个主题中,我们将重点讨论如何利用List Control显示和操作数据库中的数据。通常,这涉及到以下几个步骤: 1. **初始化List Control**:在创建List Control时,需要设置其样式...
这篇博客讨论的是如何在Struts2中处理`checkboxlist`的换行问题,这在创建多列或美观的表单布局时非常有用。 `checkboxlist`在Struts2中通常与一个Action类中的属性关联,用于收集用户的多选数据。在HTML中,复选框...
在本文中,我们将深入探讨如何在Visual Studio 2010 (VS2010)的C++环境中使用ListCtrl控件以及ADO(ActiveX Data Objects)技术来读写Access数据库程序文档。ListCtrl是Windows API中的一种控件,常用于显示列表形式...
这里我们讨论的“VirtualList.7z”文件是与duilib库相关的,它是一个C++库,主要用于Windows平台上的GUI开发。这个压缩包包含了一个经过修改的CListUI控件,该控件已经扩展以支持虚拟列表功能,能够高效地显示多达50...
在Windows编程领域,ListCtrl...通过以上讨论,我们对可编辑ListCtrl控件有了全面的理解,包括其核心功能、实现方式以及可能的扩展。在实际开发中,灵活运用这些知识能帮助我们创建出更高效、易用的Windows应用程序。
3. 使用-third-party 库:使用成熟的 third-party 库可以提高开发效率,例如,使用 Guava 库可以简化字符串处理和数据转换操作。 提高 List 转换效率需要选择合适的方法和数据结构,并合理使用 third-party 库和 ...
这些文件与`ObservableCollection`和`List<T>`的讨论直接关联性不大,但可以推测这是一个可能使用了数据绑定和区域导航的C#项目,其中可能涉及到`ObservableCollection`的使用。在这样的项目中,`...
标题 "mybatis collection list string" 暗示了我们讨论的主题是关于MyBatis框架中与集合(List)和字符串(String)处理相关的问题。在MyBatis这个强大的持久层框架中,集合和字符串的使用非常常见,尤其是在进行数据库...
2. **添加元素**:使用`add()`方法添加元素,如果元素已经存在,`add()`方法将返回`false`。 ```java set.add("Element3"); ``` 3. **删除元素**:使用`remove()`方法删除元素。 ```java set.remove("Element1...
在学习链表的过程中,了解和实践这两种链表实现(List和SeqList),并结合STL的`std::list`,可以帮助开发者熟练掌握链表的使用,并在实际问题中选择最适合的数据结构。通过分析和比较它们各自的特性,我们可以更好...
然而,根据提供的信息,这里主要讨论的是如何使用`SharedPreferences`来维护`List<String>`。 总结来说,`SharedPreferences`可以借助`Gson`库间接地存储和操作`List<String>`,但这种方法更适合轻量级的使用场景。...
7. **STL的使用**:STL包括容器(如vector、list、set等)、迭代器、算法和函数对象等,是C++高效编程的重要工具。书中可能会深入解析STL的工作原理和最佳实践,以提高代码的效率和可读性。 8. **C++11及后续版本的...
总之,SharePoint 2007中的List是一个强大且灵活的信息管理工具,它支持多种数据类型、视图定制、集成外部数据源以及与其他SharePoint功能的紧密协作,使得团队协作和信息管理变得更加高效和便捷。通过熟练掌握List...
博客中提到的“源码”标签可能意味着文章会深入到Java集合框架的内部实现,讨论如何优化过滤操作的性能,或者分析`List`接口及流API的源代码,帮助读者理解其工作原理。 至于“工具”标签,可能暗示文章介绍了某些...
了解了转换方法后,我们来讨论一下何时选择数组,何时选择List<T>: - **数组**:适合在元素数量确定且不经常变化的情况下使用。数组的访问速度通常比List<T> 快,因为它的内存是连续分配的,对于需要高效遍历或...
接下来,我们讨论如何遍历List。List是一种有序的集合,`iterator`标签通过`status`属性可以提供迭代状态信息,如当前元素的索引等。假设我们有一个名为`myList`的List,我们可以这样遍历: ```jsp <s:iterator ...