一:不同元素在使用迭代器Iterator是删除元素的行为差异?
1:对于ArrayList,Vector,LinkedList等List集合而言:
当使用Iterator遍历他们时,如果正在遍历倒数第二个元素,使用List集合的remove()方法删除集合的任意一个。
元素并不会引发ConcurrentModificationException异常,
当正在遍历其他元素是删除其他元素,就会引发ConcurrentModificationException异常。
2:对于TreeMap,HashSet等set集合而言:
当使用Iterator遍历他们时,如果正在遍历最后一个集合元素,使用set集合的remove()方法删除集合的任意元素并不会
引发ConcurrentModificationException。
当遍历其他元素时,就会引发ConcurrentModificationException。
二:Iterator是什么?
Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java
集合框架中的Enumeration枚举。迭代器允许调用者在迭代过程中移除元素,只能使用Iterator的remove方法移除元素。Iterator
有4个方法:hasNext(),next(),void remove(),void forEachRemaining()。
三:Enumeration和Iterator接口的区别?
速度:Enumeration的速度是Iterator的两倍
内存:Enumeration使用的内存比Iterator使用的更少。
安全:Iterator更加安全。原因:其他线程不能够修改正在被Iterator遍历的集合的对象。
功能:Iterator允许调用者从集合中移除元素并且迭代器的方法名得到了改善,Enumeration不能移除元素。
遍历支持的类型: Enumeration只提供了遍历Vector和Hashtable类型集合元素的功能。
四:hashCode()和equals()值的重要性?
这两个方法对于集合的精准性和正确性是至关重要的
hashcode()是否能准确的寻找到key的索引,hashcode()和equals()方法在根据键获取
值时也会 用到。
hashCode()和equals()在Objects类下定义的。
Boolean equals():用于判断两个对象是否相同
hashcode():返回一个int数,在Object默认实现是“将该对象的内部地址转换成一个整数返回”
确保通过equals()方法判断结果为true的两个对象具备相等的hashCode()返回值。
equals()方法判断结果为false时,两个对象的hashcode可能相同。
所以判断HashSet和HashMap的两个对象相同或不同时:向判断Hashcode是否相等,在判断是否equals
五:Map接口提供了哪些不同的集合视图?
Set keyset(): 返回一个map中包含所有key的一个set视图。
collection valus(): 返回一个map中包含的所有value的一个collection视图。
set<map.entry<k,v>> entrySet(): 返回一个map中包含所有映射的一个集合视图。
六:如何选用是HashMap还是TreeMap?
1:插入,删除,和定位元素:HashMap是最好的选择。
2:查找:选择HashMap比较好。:HashMap通过hashCode对其内容进行快速查找。
3:对按自然顺序或自定义顺序遍历键:TreeMap比较好。
(TreeMap中所有的元素都保持着某种固定的顺序,HashMap中元素的排列顺序是不固定的)
(所以,可以用HashMap插入元素,将map转化为TreeMap进行有序的遍历)
七:Array和ArrayList有何区别?什么时候更适合用Array?
区别一:存放的类型
Array数组可以包含基本类型和对象类型的引用。在存放是一定是同种类型的元素。
ArrayList值只能包含对象类型。ArrayList不一定,ArrayList可以存储Object。
区别二:空间大小
Array的空间大小是固定的,空间不够是也不能再次申请,所以需要事先确定合适的空间大小。
ArrayList的空间是动态增加的。
区别三:方法的增加
ArrayList在方法上比Array更多样化, 比如添加addAll(),removeAll(),返回迭代器iterator()等。
场景:
什么时候用Array:
————1:保存一些在整个程序运行期间都会存在而且不变的数据。
————2:列表的大小固定,大部分情况下是存储和遍历他们。
————3: 遍历基本数据类型时。
(原因:Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作会变的很慢)
什么时候用ArrayList:单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找。
八:哪些集合是线程安全的?
Vector:比ArrayList安全,效率较低。
Stack:是Vector的子类,也是线程安全的。在不考虑线程安全的情况下用Deque接口的ArrayDeque实现类来实现
hashtable: 比HashMap安全,已经被淘汰了。如果需要线程安全,那么使用ConcurrentHashMap.
Enumeration: 枚举,相当于迭代器。
九:详细描述一下ArrayList和LinkedList的区别?
(1)ArrayList是基于数组的一个结构,它可以通过索引实现对元素的随机访问,复杂度为O(1),
但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。访问一个元素时,是从内部的起始点开始
遍历,直到遍历到索引的节点然后返回元素,时间复杂度为时间复杂度为O(n),比ArrayList要慢。
(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,
不会涉及改变数组的大小,或更新索引。只需改变节点的引用即可。
(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。
十:CollectionS类是什么?
Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。
十一:Vector和ArrayList的区别
Vector和ArrayList的相同点:都实现了 List接口,而且都是基于Java数组来存储集合元素。
区别一:Vector是同步的,ArrayList不是。
(Vector中改变集合元素的方法都有synchronized的关键字修饰,使得Vector是同步的,并且是安全的。)
区别:ArrayList源代码:
private transient Object[] elementData;
ArrayList使用了transient修饰了elementDate数组。
保证了系统序列化ArrayList对象时,不会直接序列化elementData数组, 而是通过ArrayList提供的writeObject,readObject方法来实现定制序列化。
Vector源代码:protected Object[] elenentData;
Vector值提供了一个writeObject方法,并未完全实现定制序列化。
区别2:从序列化角度看,ArrayList的实现比Vector的实现更安全。
Vector其实就是ArrayList的线程安全版本。Vector的方法增加的synchronized修饰