概述
集合概括图
问题解答
- List,Set,Map 是否继承自Collection 接口?【基础】
- 答:List,Set 是;Map 不是。
- 你所知道的集合类都有哪些?主要方法?【基础】
- 答:最常用的集合类是List 和Map。List 的具体实现包括ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
- 说出ArrayList,Vector, LinkedList 的存储性能和特性?【基础】
- 答:ArrayList 和Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了synchronized 方法(线程安全),通常性能上较ArrayList 差,而LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
- Collection 和Collections 的区别?【基础】
- 答:Collection 是java.util 下的接口,它是各种集合的父接口,继承于它的接口主要有Set 和List;Collections 是个java.util 下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
- ArrayList和LinkList的区别?【基础】
- 答:
- ArrayList(数组结构):
优点:get和set调用花费常数时间,也就是查询的速度快;
缺点:新项的插入和现有项的删除代价昂贵,也就是添加删除的速度慢
LinkedList(链表结构):
优点:新项的插入和和现有项的删除开销很小,即添加和删除的速度快
缺点:对get和set的调用花费昂贵,不适合做查询
怎样将一个数组转成List,有什么方法【基础】
答:
数组转list,可以使用Arrays.asList(数组)
List转数组,使用list.toArray()
Collection接口的remove()方法和Iterator接口的remove()方法区别?【基础】
答:
性能方面:
Collection的remove方法必须首先找出要被删除的项,找到该项的位置采用的是单链表结构查询,单链表查询效率比较低,需要从集合中一个一个遍历才能找到该对象;
Iterator的remove方法结合next()方法使用,比如集合中每隔一项删除一项,Iterator的remove()效率更高
容错方面:
在使用Iterator遍历时,如果使用Collection的remove则会报异常,会出现ConcurrentModificationException,因为集合中对象的个数会改变而Iterator 内部对象的个数不会,不一致则会出现该异常
在使用Iterator遍历时,不会报错,因为iterator内部的对象个数和原来集合中对象的个数会保持一致
HashMap和HashSet区别? 【基础】
答:
HashMap实现了Map接口,HashSet实现了Set接口
HashMap存储键值对,HashSet存储对象
HashMap调用put()向map中添加元素,HashSet调用add()像set中添加元素
HashMap使用Key计算hashcode,HashMap使用成员计算Hashcode
HashMap相对于HashSet较快,因为它是使用唯一的键获取对象
HashMap的实现原理【基础】
答:通过put和get存储和获取对象,存储对象时,我们将K/V传给put方法时,它调用hashcode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量。获取对象时,我们将K传递给get,他调用hashcode计算hash从而得到bucket位置,并进一步调用equals()方法确认键值对。
- HashMap 和Hashtable 的区别? 【基础】
- 答:二者都实现了Map 接口,是将惟一键映射到特定的值上;主要区别在于:
- HashMap 没有排序,允许一个null 键和多个null 值,而Hashtable 不允许【会抛出NullPointerException】;
- HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey,因为contains 方法容易让人引起误解;
- Hashtable 继承自Dictionary 类,HashMap 是Java1.2 引进的Map 接口的实现;
- Hashtable 的方法是线程安全的,而HashMap 不是,在多个线程访问Hashtable 时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。Hashtable 和HashMap【单线程使用HashMap效率更高】 采用的hash/rehash 算法大致一样,所以性能不会有很大的差异。
- Arraylist 与Vector 区别?(是否有序、是否重复、数据结构、底层实现)【基础】
- 答:ArrayList和Vector都实现了List接口,他们都是有序集合,并且存放的元素是允许重复的。它们的底层都是通过数组来实现的,因此列表这种数据结构检索数据速度快,但增删改速度慢。
- 而ArrayList和Vector的区别主要在两个方面:
线程安全:Vector是线程安全的,而ArrayList是线程不安全的。因此在如果集合数据只有单线程访问,那么使用ArrayList可以提高效率。而如果有多线程访问你的集合数据,那么就必须要用Vector,因为要保证数据安全
数据增长:ArrayList和Vector都有一个初始的容量大小,当存储进它们里面的元素超过了容量时,就需要增加它们的存储容量。ArrayList每次增长原来的0.5倍,而Vector增长原来的一倍。ArrayList和Vector都可以设置初始空间的大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
List 和 Map 区别?(数据结构,存储特点)
答:这个要从两个方面来回答:
在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。
在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复)。
- List、Map、Set 三个接口,存取元素时,各有什么特点?【基础】
- 答:
- List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去。所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
- List表示有先后顺序的集合,注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
- Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合(map.keySet()),还可以获得所有的value的结合(map.values()),还可以获得key和value组合成的Map.Entry对象的集合(map.entrySet())。
- List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。
- HashSet、TreeSet、LinkedHashSet区别?【基础】
- 答:可以从集合的使用场合回答面试官:
- 需要速度快的集合,使用HashSet
- 需要集合有排序功能,使用TreeSet
- 需要按照插入的顺序存储集合,使用LinkedHashSet
- Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 【基础】
- 答:Set 里的元素是不能重复的,用equals ()方法来区分重复与否。覆盖equals()方法用来判断对象的内容是否相同,而”==”判断地址是否相等,用来决定引用值是否指向同一对象。
- 用程序给出随便大小的10 个数,序号为1-10,按从小到大顺序输出,并输出相应的序号。【基础】
public static void printRandomBySort() { // 创建随机数生成器 Random random = new Random(); // 生成10个随机数,并放在集合list中 List list = new ArrayList(); for (int i = 0; i < 10; i++) { list.add(random.nextInt(1000)); } // 对集合中的元素进行排序 Collections.sort(list); int count = 0; Iterator it = list.iterator(); // 顺序输出排序后集合中的元素 while (it.hasNext()) { System.out.println(++count + ": " + it.next()); } }
- Collection框架中实现比较要实现什么接口
- 答:要实现比较有两种方式:
- 第一种,实体类实现Comparable<T>接口,并实现 compareTo(T t) 方法,我们称为内部比较器。
- 第二种,创建一个外部比较器,这个外部比较器要实现Comparator接口的 compare(T t1, T t2)。
WeakHashMap类
答:WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
Stack 类
答:Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
总结
ArrayList: 元素单个,效率高,多用于查询
Vector: 元素单个,线程安全,多用于查询
LinkedList:元素单个,多用于插入和删除
HashMap: 元素成对,元素可为空
HashTable: 元素成对,线程安全,元素不可为空
注意:
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法
最后
以上就是落后蚂蚁为你收集整理的Java基础:集合的全部内容,希望文章能够帮你解决Java基础:集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复