Java————集合部分题目总结

一:不同元素在使用迭代器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修饰

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值