JAVA集合锦囊

  1. List和Set的区别:
    List和set都继承Collection接口;List中元素有序,可重复,Set中元素无序,不可重复。List查找效率高,由于插入删除操作会引起其他元素位置改变,插入删除效率低;
    Set查找效率低,由于插入删除操作不会引起其他元素位置改变,插入删除效率高。
  2. List和Map区别:
    List中存储对象(单列数据),List中对象有序, 允许对象重复;Map中存储键值对(双列数据),Map中键值对无序,不允许key重复。
  3. List、Map、Set三个接口,存取元素时,各有什么特点:
    List与Set继承共同的父接口Collection,都存储单列元素。
  • 存元素时: Set中不允许元素重复(不允许有equals相等的元素),Set集合中add方法的返回值为boolean,当集合中没有某个元素,add方法可成功加入该元素,并返回true,当集合含有与某个元素equals相等的元素时,add方法无法加入该元素,并返回false。
  • 取元素时:Set中元素无序,无法取出指定位置的元素,只能用Iterator接口取得所有元素,再逐个遍历。
  • 存元素时:List中元素有序,即多次调用add(Obj e)方法时,每次加入的对象按先来后到的顺序排列,就像火车站买票有排队顺序一样,有时也可以插队,即调用add(int index,Obj e)方法,即可指定当前对象在集合中的存放位置。一个对象可以被重复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次。实际上不是把这个对象本身存进集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,集合中就有多个索引指向了这个对象。
  • 取元素时:List可以用Iterator接口取得所有元素,再逐个遍历,还可以通过调用get(int index)来取得指定位置元素。
  • Map与List和Set不同,它存储双列元素,存元素时:即用put(Obj key,Obj value)方法存键值对,不能存储重复的(equals相等)key。取元素时:调用get(Obj key)根据key获得对应的value。另外还可以获得所有的key集合,或者所有的value集合,还可以获得key和value组合的Map Entry对象的集合。
    各自特点:List 中元素有序,允许元素重复。Set 中元素无序,不允许元素重复。Map 保存key-value值,value可多值。
    4. ArrayList与Vector区别:
  • 共同点:都实现List接口,都是有序集合(存储的元素的位置都有顺序),允许元素重复。
    ArrayList与Vector底层都使用数组(线性连续存储空间)存储数据,都支持按序号查找元素,但插入操作会引起数组元素移动(内存操作),因此查找快,插入慢;
  • 数据增长:当空间不足时,它俩的增加方式不同(不是只增加一个存储单元,而是每次增加的存储单元个数要在内存空间利用与程序效率间取得平衡),Vector增加原来的1倍,ArrayList增加原来的0.5倍;Vector可设置增长因子,ArrayList 不能。
  • 线程安全:其中Vector是线程安全(多个线程访问同一集合,不会产生不确定的结果)的,Vector中的很多方法由Synchronized关键字修饰(实现线程安全),而ArrayList是线程不安全的,因此Vector在效率上低于ArrayList.;
  • 使用场景:不考虑线程安全因素时,一般使用ArrayList;当集合中元素个数大于目前集合数组长度时(数据量较大),使用Vector有优势。
    5. ArrayList与LinkedList区别:
  • ArrayList使用数组(线性连续存储空间)存储数据,由于存放地址连续,故查询效率高,而插入删除会引起其他元素位置改变,插入删除效率低。
  • LinkedList使用双向链表存储数据,由于存放地址任意(开辟内存时不需要地址连续),故插入删除操作效率高,而查询时需要移动指针向前或向后遍历,查询效率低.
  • 使用场景:需要对元素多次访问时使用ArrayList;当需要对数据进行多次增删改操作时使用LinkedList。
    6. HashMap和Hashtable的区别:
  • 共同点:它俩采用的hash/rehash算法一致,存储性能差异不大。
  • 历史原因:Hashtable继承自陈旧的Dictionary类,HashMap实现了Java 1.2引进的Map接口;
  • 历史改进:由于Hashtable中的contains方法容易引起误解,故HashMap去掉了Hashtable中的contains方法,加上了containsValue和containsKey方法。
  • 线程安全:Hashtable是线程安全的,其中的方法由synchronized关键字修饰(实现同步),HashMap是线程不安全的,当只有一个线程访问集合时,HashMap的效率高于Hashtable。
  • 元素要求:Hashtable不允许将null作为一个entry的key或者value,而HashMap允许。
    7. HashMap和HashSet的区别:
  • 两者都用hash算法实现唯一性。
  • HashSet是set接口的hash实现,不允许元素重复,元素线性存储。HashSet按照hashCode值的某种运算方式进行存储,而不是直接按hashCode值的大小进行存储,例如,“abc” —> 78,“def” —> 62,“xyz” —> 65在hashSet中的存储顺序不是62,65,78。
    hashset集合比较两个对象是否相等,首先看hashcode方法是否相等,然后看equals方法是否相等

    new 两个Student插入到HashSet中,看HashSet的size,实现hashcode和equals方法后再看size。
  • HashMap是Map接口的hash实现,不允许key重复,value用链表存储。
    8. 两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?
    对。
  • 如果对象保存在HashSet或HashMap中,它们的equals相等,那么它们的hashcode值一定相等。
  • 如果不是要保存在HashSet或HashMap,则与hashcode没有什么关系了,这时候hashcode不等是可以的,例如arrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现,通常都会去实现的。
    9. 去掉一个Vector集合中的重复元素:
Vector  newVector  =  new  Vector();
for(int i=0;i < oldVector.size();i++){
		Object  obj  =  oldVector.get(i);
		if(!newVector.contains(obj){
			newVector.add(obj);
		}
  }
 同一个对象可以在Vector中加入多次,往HashSet中却加不了多次。
简单方式:HashSet set = new HashSet(oldVector);

  
  

10. 简单谈谈对TreeMap的理解:
TreeMap是线程不安全的,它使用红黑树存储元素,由于该树总处于平衡状态,故没有调优选项。适用于按自然顺序或自定义顺序遍历键(key)。
11. TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?
当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个compareTo方法的。
12. Collection和Collections的区别
Collection是集合类的上级接口,继承于它的接口主要有List,Queue,Set。
Collections是针对集合类的一个帮助类,它提供一系列静态方法
实现对各种集合的搜索、排序、线程安全化等操作。
13. Collection框架中实现比较(对一组数据进行排序)需要实现什么接口:
Comparable/Comparator接口

猜你喜欢

转载自blog.csdn.net/weixin_43710551/article/details/89138187