理解集合体系图
collection中 list 是有序的,set 是无序的
什么是迭代器
主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。
ArrayList 和 Vector 的区别?
ArrayList 可以存放 null,底层是由数组实现的。
主要区别在于两者的线程安全性和性能。Vector
是同步的,因此它是线程安全的,但这使得它在多线程环境中相对于 ArrayList
来说性能较低。ArrayList
是非同步的,因此不是线程安全的,但它在单线程环境中提供更好的性能。
关于同步和异步的安全问题
同步操作在多线程程序中经常与“线程安全”这个词联系在一起,主要是因为同步机制(如互斥锁、信号量等)确保在同一时间只有一个线程可以访问某个特定的资源或执行某个特定的代码段。这种方式可以防止多个线程同时改变共享数据的状态,从而避免了竞态条件和数据不一致的问题。
异步操作本身并不自动提供线程安全保证。事实上,由于异步操作经常在不同的线程或执行环境中启动或完成,如果不采取适当的措施,就可能引发线程安全问题。
此外,Vector
默认情况下容量增长为当前的两倍,而 ArrayList
增长为原来的 1.5
倍。
关于容量增长问题
"容量增长为当前的两倍"这个表述是指集合(如
Vector
)在元素添加过程中,当现有的存储空间不足以容纳更多元素时,集合会自动扩展其内部数据结构的容量。对于Vector
来说,这意味着如果其内部数组已满,它会创建一个新的数组,其容量是原数组容量的两倍,然后将所有旧元素复制到这个新数组中。这里是一个具体的例子来说明这个过程:
- 假设
Vector
的当前容量是 10(即它可以存储 10 个元素)。- 当你尝试添加第 11 个元素时,
Vector
会检测到容量不足。- 于是,
Vector
会分配一个新的数组,其容量是之前的两倍,即 20。Vector
将原有的 10 个元素复制到这个新的数组中,并添加新元素。这种自动扩容机制确保了集合可以根据需要动态地增长,以容纳更多的元素。与
Vector
不同的是,ArrayList
在扩容时通常采用将容量增长为原来的 1.5 倍,这也是一种权衡性能和内存使用的策略。通过选择不同的增长因子,不同的集合类可以提供不同的性能特点:
- Vector 的容量增长为两倍,意味着它在扩容时可能会更快地增加其内存使用,但减少了扩容操作的频率。
- ArrayList 的容量增长为 1.5 倍,则是在增加容量和减少内存浪费之间找到一个中间值。
由于这些特性,通常推荐在单线程应用中使用 ArrayList(因为更快,而且不用考虑安全性的问题)
,在需要线程安全的环境中使用 Vector。
ArrayList和LinkedList的区别?
"
ArrayList
和LinkedList
都实现了 Java 的List
接口,但他们的内部数据结构和性能特点有所不同。
ArrayList 是基于动态数组的实现,它支持快速的随机访问和低成本的访问操作。然而,向列表中间插入和删除元素的操作可能会比较慢,因为这涉及到数组的复制和移动元素。
LinkedList 是基于双向链表的实现,它允许在列表中进行快速的插入和删除操作,尤其是在列表的开头和结尾,或者已知特定节点的情况下。但是,与
ArrayList
相比,LinkedList
的随机访问速度较慢,因为需要从头节点或尾节点开始遍历链表。总的来说,如果你需要频繁的随机访问,应选择
ArrayList
;如果你的应用需求更频繁地在列表中插入或删除元素,LinkedList
可能是更好的选择。"
HashMap与HashTable的区别?
"
HashMap
和HashTable
都是 Java 中的集合类,用于存储键值对,但它们在实现和使用中有几个关键区别:
同步性:
HashMap
是非同步的。HashTable
是同步的。空值支持:
HashMap
允许一个 null 键和多个 null 值。HashTable
不允许键或值为 null,尝试插入 null 键或值会抛出NullPointerException
。迭代器&