我是靠谱客的博主 落后蚂蚁,最近开发中收集的这篇文章主要介绍Java基础:集合,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

集合概括图

问题解答

  • 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基础:集合所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部