arraylist随机访问
是的,数列结构,ArrayList的结构就适合随机访问。[]数组、Vector、ArrayList结构在随机访问、遍历、获得大小方面都是O(1)的性能。
没有证据说明ArrayList比数组和Vector就性能更好。但ArrayList是非线程安全的。
(另外,如果问“较好”,就应该有比较,没有指明和什么比较?问题不严谨。)
⑵ java中ArrayList和LinkedList有什么区别,分别怎么使用呢
ArrayList和LinkedList都实现了List接口,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删。
ArrayList与LinkList两者的区别:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况,时间复杂度是 O(n) ,而 LinkedList 中插入或删除的时间复杂度仅为 O(1) 。 ArrayList 在插入数据时还需要更新索引(除了插入数组的尾部)。
3) 类似于插入数据,删除数据时, LinkedList 也优于 ArrayList 。
4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置 ( 一个 LinkedList 实例存储了两个值: Node<E> first 和 Node<E> last 分别表示链表的其实节点和尾节点,每个 Node 实例存储了三个值: E item,Node next,Node pre) 。
什么场景下更适宜使用 LinkedList,而不用ArrayList
1) 你的应用不会随机访问数据 。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。
2) 你的应用更多的插入和删除元素,更少的读取数据 。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。
⑶ Java中为什么说ArrayList在进行随机访问和遍历元素时,它能提供更好的性能
很明显,ArrayList对象在底层以数组的形式存储元素.
数组:便于查询,不利于插入、删除、修改,,
便于查询..........至于为什么便于查询,主要是因为数组是一排有序的、并有下标关联的元素的集合..
⑷ 关于ArrayList与LinkedList问题
对于处理一列数据项,Java 提供了两个类ArrayList 和LinkedList ,ArrayList 的内部实现是基于内部数组Object[] ,从概念上讲,它更像数组,但LinkedList 的内部实现是基于一组连接的记录,所以,它更像一个链表结构,它们在性能上有很大的差别。
ArrayList和LinkedList都实现了List接口,ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删。
ArrayList与LinkList两者的区别:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
2) 相对于 ArrayList , LinkedList 插入是更快的。因为 LinkedList 不像 ArrayList 一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是 ArrayList 最坏的一种情况,时间复杂度是 O(n) ,而 LinkedList 中插入或删除的时间复杂度仅为 O(1) 。 ArrayList 在插入数据时还需要更新索引(除了插入数组的尾部)。
3) 类似于插入数据,删除数据时, LinkedList 也优于 ArrayList 。
4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置 ( 一个 LinkedList 实例存储了两个值: Node<E> first 和 Node<E> last 分别表示链表的其实节点和尾节点,每个 Node 实例存储了三个值: E item,Node next,Node pre) 。
什么场景下更适宜使用 LinkedList,而不用ArrayList
1) 你的应用不会随机访问数据 。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。
2) 你的应用更多的插入和删除元素,更少的读取数据 。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。
⑸ java arraylist是有序的吗
是有序的。
比如:List<Integer> list=new ArrayList<Integer>();
list.get(0)
一个list,第一个放进去是1,第二个放进去是2:
List<Integer> numList=new ArrayList<>();
numList.add(1);
numList.add(2);
当取第一个时numList.get(0);(下标从0开始)
打印它出来还是:1
(5)arraylist随机访问扩展阅读:
LinkedList :对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替)还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
⑹ ArrayList 和LinkedList各自的特点是什么
ArrayList
:
其实是包装了一个数组
,当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象是,数组的大小也相应的改变。这样就带来以下有缺点:
快速随即访问
你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的
数组元素
。
向其中添加对象速度慢
当你创建数组是并不能确定其容量,所以当改变这个数组时就必须在内存中做很多事情。
操作其中对象的速度慢
当你要想数组中任意两个元素中间添加对象时,数组需要移动所有后面的对象。
LinkedList:
LinkedList是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。当一个新节点插入时,只需要修改其中保持先后关系的节点的引用即可,当删除记录时也一样。这样就带来以下有缺点:
操作其中对象的速度快
只需要改变连接,新的节点可以在内存中的任何地方。不能随即访问,
虽然存在方法,但是这个方法是通过遍历接点来定位的所以速度慢。
(6)arraylist随机访问扩展阅读:
ArrayList就是
动态数组
,用MSDN中的说法,就是Array的
复杂版本
,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处。
List
接口的大小可变数组的实现,位于API文档的java.util.ArrayList
。实现了所有可选列表操作,并允许包括
null
在内的所有元素。除了实现
List
接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
参考资料:搜狗网络-arraylist
⑺ LinkedList和ArrayList的区别
ArrayList
ArrayList是一个动态数组,也是我们最常用的集合。
它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。
在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。
所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。
add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。
ArrayList擅长于随机访问。同时ArrayList是异步的。
LinkedList
同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。
所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。
在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。
这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。与ArrayList一样,LinkedList也是异步的。
如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list
= Collections.synchronizedList(new LinkedList(...));
综述:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.
因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
⑻ java ArrayList 随机访问、遍历 性能
说ArrayList在进行随机访问和遍历元素时,能提供较好的性能应该是跟LinkList对比的吧,插入删除操作多的话用LinkList比较好,《Java编程思想》是这样说的