List和Set的区别:
List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,再逐一遍历,还可以使用get(int index)获取指定下标的元素
Set:无序,不可重复,最多允许有一个Null元素对象,取元素时只能用Iterator接口取得所有元素,再逐一遍历各个元素
ArrayList和LinkedList区别:
Array(数组)是基于索引index的数据结构,它使用索引在数组中搜索和读取数据是很快的
Array获取数据的时间复杂度是O(1),但是要删除数据开销很大,因为需要重排数组中的所有数据,(因为删除数据以后,需要把后面所有的数据前移)
缺点:数组初始化必须指定初始化的长度,否则报错
List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,继承了Collection。
List有两个重要实现类:ArrayList和LinkedList
ArrayList:可以看错是能够自动增长容量的数组,ArrayList底层实现时Array,数组扩容实现
LinkedList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能,但在get与set方面弱于ArrayList。当然,这些对比指数据量很大或者操作很频繁。
适用场景分析:
当需要对数据进行对随机访问的时候,选用ArrayList
当需要对数据进行多次增加删除修改时,采用LinkedList
如果容量固定,并且只会添加到尾部,不会引起扩容,优先采用ArrayList
当然,绝大多数业务场景下,使用ArrayList就够了,但需要注意避免ArrayList的扩容,以及非顺序的插入
红黑树的特征:
每个节点是黑色或红色
根节点是黑色
每个叶子节点都是黑色(指向空的叶子节点)
如果一个叶子节点是红色,name其子节点必须都是黑色的
从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点
哪些集合类是线程安全的?
vector:比ArrayList多了同步化机制(线程安全),效率极低,现在不太建议使用,在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的
Stack:堆栈类,先进后出
HashTable:比HashMap多了线程安全
遍历一个List有哪些不同的方式?每种方式的实现原理?Java中List遍历的最佳实践是什么?
遍历方式有以下几种:
for循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读取每一个位置的元素,
当读取到最后一个元素后停止。
迭代器遍历,Iterator。 Iterator是面向对象的一个设计模式,目的是屏蔽不同数据集合的特点,统一遍历集合的接口。Java在Collections中支持了Iterator模式
foreach循环遍历。foreach内部也采用了Iterator的方式实现,使用时不需要显式声明Iterator或计数器。优点是代码简洁,不易出错;缺点是只能做简单的遍历,不能再遍历过程中操作数据集合,例如删除、替换
最佳实践:Java Collections框架中提供了一个RandomAccess接口,用来标记List实现是否支持RandomAccess。
如果一个数据集合实现了该接口,就意味着它支持Random Access,按位置读取元素的平均时间复杂度为O(1),如ArrayList。
如果没有实现该接口,表示不支持Random Access,如LinkedList。
推荐的做法就是,支持Random Access的列表可用for循环遍历,否则建议用Iterator或foreach遍历
标签:遍历,Java,Iterator,ArrayList,元素,List,集合,节点 From: https://www.cnblogs.com/doremi429/p/16835914.html